Arduino дээрх цаг агаарын станц. Arduino uno дээрх цаг уурын станцын хэлхээнүүд

Би өөрийн цаг агаарын станцтай болохыг хүссэн бөгөөд энэ нь мэдрэгчээс уншсан мэдээллийг хүмүүсийн хяналтын газрын зураг руу дамжуулдаг (Google-ээс хайхад 5 секунд зарцуулдаг). Энэ нь санагдсан шиг тийм ч хэцүү биш болсон. Юу хийснийг анхаарч үзээрэй.

Энэ үйлдлийнхээ төлөө би өөртөө Arduino Uno болон Ethernet Shield w5100 авсан. Энэ бүгдийг Aliexpress дээр Хятадаас захиалсан.

Би тэнд мэдрэгч захиалсан: DHT22, DHT11, DS18B20, BMP280 (хий, утаа мэдрэгчийг бас төлөвлөж байна ...)

Google, Yandex форумуудыг татсаны дараа би зургийн сайн хувилбарыг олсон - https://student-proger.ru/2014/11/meteostanciya-2-1/

Яг тэр газар сэтгэгдэл дээр нэгэн хүн гэрэл, хийн мэдрэгч бүхий бэлэн зургийг нийтэлсэн байна. Би тэдгээрийг үндэс болгон авсан.

Эдгээр ноорог дээр 280-р даралт мэдрэгчийг дэмжих боломжгүй байсан, бид зохиогчтой ярилцсан, тэр 180-ыг 280-аар сольсон. Бүх зүйл хэвийн болсон (үүнд маш их баярлалаа)

Миний олж авсан эцсийн тойм зургийн жишээг доор харуулав.

Одоогоор надад мэдрэгч холбогдсон байна:
DHT22 - 1 ширхэг.
DHT11 - 1 ширхэг.
BMP280 - 1 ширхэг.
DS18B20 - 2 ширхэг.

АНХААР! Зургийг байршуулахаасаа өмнө бусадтай давхцахгүйн тулд төхөөрөмжийн MAC хаягийг өөрчлөхөө бүү мартаарай (жишээ нь, гар утасныхаа Mac хаягийг авч, доторх сүүлийн үсэг / тоонуудыг өөрчлөхгүй. " өөрийн дотоод сүлжээнд саад бол!

Ойролцоогоор холболтын диаграмм (энэ ноорогоос интернетээс авсан зураг):

Техникийн шалтгааны улмаас ноорог зургийг энд нийтлэх боломжгүй байна. Би архивт хадгалсан. Үүний холбоос дээр байна.

Таны харж байгаагаар уншилтууд байгаа, тэдгээр нь зөв ажиллаж байна, жишээлбэл, би мэдрэгчээсээ хэд хэдэн дэлгэцийн агшинг нийтлэх болно.

Чөлөөт цагаараа, мөн энэ удаад би цаг уурын жижиг станц хийх заавар бичсэн. Энэ нь огноотой цаг болж, өрөөний доторх болон гаднах температурыг харуулах болно. Бид Arduino UNO-г үндсэн хянагч болгон ашиглах боловч Atmega328p бүхий өөр самбар ашиглах болно. Дэлгэцийн хувьд бид WG12864B график дэлгэцийг ашигладаг. Мөн бид хоёр ds18b20 температур мэдрэгчийг холбоно. Нэгийг нь дотор, нөгөөг нь гадаа авдаг. Эхэлцгээе.

Гэрийн бүтээгдэхүүн үйлдвэрлэх явцад бидэнд дараахь зүйлс хэрэгтэй болно.

Arduino UNO (эсвэл бусад Arduino нийцтэй самбар)
- WG12864B график дэлгэц
- ds18b20 температур мэдрэгч, 2 ширхэг
- Цахилгаан хангамж 6 - 12 В
- Эсэргүүцэл 4.7 Ком 0.25 Вт, 2 ширхэг.
- 100 ом 0.25 Вт эсэргүүцэлтэй
- 4 ширхэг AAA "бяцхан хуруу" батерейны зайны тасалгаа
- SEGA консолын хайрцагны хайрцаг
- Тусгаарлагч тууз
- Холбох утас
- Хэлхээний самбар
- Товчлуурууд
- Бичиг хэргийн хутга
- гагнуурын төмөр
- Гагнуур, жилий
- Хоёр талт соронзон хальс

Алхам 1 WG12864B3-г бэлтгэ.
Өмнө нь дэлгэцтэй ажиллаж байгаагүй хүмүүс ижил төстэй дэлгэцийн олон тооны өөрчлөлтөөс айж эмээж магадгүй юм. Би бага зэрэг тайлбарлая. Энэ төрлийн ихэнх дэлгэц нь ks0107/ks0108 чип дээр ажилладаг. Бүх дэлгэцийг 4 төрөлд хувааж болно.

Сонголт А: HDM64GS12L-4, Crystalfontz CFAG12864B, Sparkfun LCD-00710CM, NKC Electronics LCD-0022, WinStar WG12864B-TML-T

Option B: HDM64GS12L-5, Lumex LCM-S12864GSF, Futurlec BLUE128X64LCD, AZ Displays AGM1264F, Displaytech 64128A BC, Adafruit GLCD, DataVision DG12864-88, Topway LM12864LDW, Digitron SG12864J4, QY-12864F, TM12864J4, QY-12864F, TM12864F

Сонголт C: Shenzhen Jinghua Displays Co Ltd. JM12864

Сонголт D: Wintek- Cascades WD-G1906G, Wintek - GEN/WD-G1906G/KS0108B, Wintek/WD-G1906G/S6B0108A, TECDIS/Y19061/HD61202, Varitronix/MGLS1924/

Тэд бараг адилхан харагдаж байна. Гэхдээ холболтын зүү нь өөр өөр байдаг. Би WG12864B3 V2.0-г сонгосон бөгөөд танд санал болгож байна, гэхдээ хэрэв дэлгэц нь өөр дэлгэцтэй байсан эсвэл танд байхгүй бол та хүснэгтийг ашиглан үүнийг хялбархан олох боломжтой.

Товч үзүүлэлтүүд:

Интернет дээр олон төрлийн холболтын схемүүд байдаг бөгөөд бүх зүйл ажиллаж байгаа юм шиг санагддаг. Гол нь өөр өөр дэлгэцүүд төдийгүй тэдгээрийг холбох хоёр арга байдаг: цуваа ба зэрэгцээ. Цуваа портын холболтыг ашиглах үед бидэнд зөвхөн 3 микроконтроллерийн гаралт хэрэгтэй. Зэрэгцээ хамгийн бага нь 13. Энэ тохиолдолд сонголт нь ойлгомжтой, Arduino-д ямар ч байсан олон дүгнэлт байхгүй. Зэрэгцээ холболтын хувьд холболтын диаграмм дараах байдалтай байна.

Бидний ашиглах цуваа холболтын схем нь дараах байдалтай байна.

WG12864B - Arduino UNO 1 (GND) - GND 2 (VCC) - +5V 4 (RS) - 10 5 (R/W) - 11 6 (E) - 13 15 (PSB) - GND 19 (BLA) - резистороор дамжуулан 100 Ом - +5V 20 (BLK) - GND

Ялгааг тохируулахын тулд дэлгэцэн дээр потенциометр байх ёстой. Үүнгүйгээр дэлгэцүүд байдаг, гэхдээ энэ нь одоо ховор тохиолддог:

5 вольтын хүчдэл нь арын гэрлийн диодыг санамсаргүйгээр шатаахгүйн тулд 100 ом эсэргүүцэл хэрэгтэй.

Алхам 2 Хэрэг үүсгэх.
Кейсийн хувьд Sega дээд хайрцагны хайрцагнаас хайрцгийг нь аваарай. Хэрэв та энэ хайрцгийг гартаа олоогүй бол өөр хэрэг ашиглаж болно. Хамгийн гол нь дэлгэц болон Arduino үүнд багтах явдал юм.

Хайрцагны дээд талд байгаа ил тод хальсыг хайчилж ав, ингэснээр ямар ч хэсэг үлдэхгүй.

Дараа нь бичиг хэргийн хутга ашиглан дэлгэцийн 37x69 хэмжээтэй цонхыг хайчилж ав.

Урвуу талд, зүсэлтийн ирмэгийн дагуу бид хоёр талт соронзон хальсыг нааж, илүү сайн хар өнгөтэй байна.

Бид хамгаалалтын цаасыг наалдамхай туузаас салгаж, дээр нь дэлгэцээ наа.

Гаднаас нь харахад энэ нь иймэрхүү харагдах ёстой.

Дэлгэцийн доор, мөн хоёр талт соронзон хальс дээр бид өмнө нь USB порт болон цахилгааны залгуурт зүсэлт хийж, Arduino-г суурилуулсан.

Arduino залгуурыг чөлөөтэй хаахын тулд хайрцагны хоёр талд зүсэлт хийх ёстой.

Алхам 3 Температур мэдрэгч.
Бид DS18B20 тоон температур мэдрэгчийг ашиглах болно. Тэдгээрийг ашигласнаар бид хэмжилтийн илүү нарийвчлалтай, 0.5 ° С-ээс ихгүй алдаа, -55 ... + 125 ° C-ийн өргөн температурт авдаг. Нэмж дурдахад мэдрэгч нь дижитал бөгөөд бүх тооцоог өөрөө хийдэг бөгөөд Arduino нь зүгээр л бэлэн уншилтыг хүлээн авдаг. Энэ мэдрэгчийг холбохдоо DQ болон VDD зүү хооронд 4.7KΩ татах резисторыг бүү мартаарай. Хэд хэдэн холболтын сонголтууд бас боломжтой. Гадны хүчээр, миний бодлоор хамгийн сайн сонголт бол бид үүнийг ашиглах болно:

Цахилгаан хангамжийн аль ч сонголттой бол мэдрэгчийг зэрэгцээ холбодог.

Бид өрөөний температур мэдрэгчийг жижиг самбар дээр байрлуулж, цагийн цаг, огноог тохируулах хоёр товчлуурыг ашиглана.

Бид хоёр товчлуураас нийтлэг утсыг GND руу холбож, утсыг эхний товчлуураас A0, хоёр дахь товчлуураас A1 хүртэл холбоно.
Бид үүнийг Arduino-ийн хажууд хоёр талт соронзон хальс дээр засдаг.

Өрөөний гадна байрлах мэдрэгчийг металл, тоос нэвтэрдэггүй орон сууцанд сонгох нь дээр.

Мэдрэгчийг цонхны гадна талд өлгөхийн тулд шаардлагатай урттай утсыг тооцоол, гол зүйл нь 5 метрээс хэтрэхгүй байх ёстой, хэрэв танд илүү урт урт хэрэгтэй бол та татах утгыг багасгах хэрэгтэй. дээш резистор.

Бид хоёр мэдрэгчийн DQ өгөгдлийн автобуснаас утсыг Arduino-ийн 5-р зүү рүү холбодог.
Vdd - +5 Arduino.
GND - GND Arduino.

Алхам 4 Хоол тэжээл.
Эрчим хүчний хувьд та 6-аас 12 вольтын хүчдэлтэй тэжээлийн хангамжийг ашиглаж болно. Цахилгааны цахилгааны утасны төгсгөлд Arduino цахилгаан залгуурт тохирох залгуурыг гагнах хэрэгтэй.

Эсвэл та дөрвөн "AAA", "бяцхан хуруу" батерейнд зориулж зайны тасалгаа хийж болно. Мөн булангаас эерэг утсыг Vin Arduino руу, сөрөг утсыг GND руу холбоно.

Алхам 5 Програмчлалын орчинг бэлтгэ.
Эхлээд та Arduino IDE-г албан ёсны вэбсайтаас татаж аваад суулгах хэрэгтэй

Мөн ноорог зурахад шаардлагатай хоёр номын санд нэмнэ үү. OneWire - ds18b20 мэдрэгчтэй харилцахад шаардлагатай:

U8glib - мэдээллийг дэлгэцэн дээр харуулахад ашигладаг:

Номын сангуудыг татаж байна. Дараа нь бид архивыг задалж, архивын агуулгыг суулгасан Arduino IDE хавтсанд байрлах "номын сангууд" хавтас руу шилжүүлнэ. Та мөн Arduino IDE-ээр дамжуулан номын санг нэмж болно. Үүнийг хийхийн тулд архивыг задлахгүйгээр Arduino IDE-г ажиллуулаад цэснээс Sketch - Connect Library командыг сонгоно. Унждаг жагсаалтын хамгийн дээд хэсэгт "Zip Library нэмэх" зүйлийг сонгоно уу. Татаж авсан архивын байршлыг зааж өгнө үү. Бүх алхмуудын дараа та Arduino IDE-г дахин эхлүүлэх хэрэгтэй.

Алхам 6 Ноорог засварлах.
Температур мэдрэгч нь One Wire протоколыг ашиглан ажилладаг бөгөөд төхөөрөмж тус бүрт өвөрмөц хаягтай байдаг - 64 бит код. Ноорог дээр мэдрэгч хайх команд нэмэхийг зөвлөдөггүй. Мэдрэгчийг саатуулахын тулд Arduino-г байнга ачаалах шаардлагагүй. Тиймээс эхлээд бүгдийг цуглуулсны дараа бид File - Жишээ - Даллас температур - OneWireSearch цэсэнд байрлах Arduino тойм зургийг бөглөнө. Дараа нь бид Tools - Port Monitor ажиллуулна. Arduino нь бидний мэдрэгчийг олж, хаяг, температурын заалтыг бичих ёстой. Эдгээр хаягуудыг хаа нэгтээ бичиж эсвэл зүгээр л хуулсан байх ёстой. Одоо Ard_Tic_Tak_WG12864B_2_x_Term_Serial sketch-г нээгээд мөрүүдийг олно уу:

Byte addr1=(0x28, 0xFF, 0x75, 0x4E, 0x87, 0x16, 0x5, 0x63);// дотоод байтын хаяг addr2=(0x28, 0xFF, 0xDD, 0x14, 0xB4, 0x16, 0x7, мэдрэгч);

Бид тухайн байршилд тохирох мэдрэгчийн хаягийг өөрийн хаягаар сольдог.
Манай цаг нь RTC модулийг (бодит цагийн цаг) ашигладаггүй тул цагийг засах шаардлагатай. Тохиромжтой болгохын тулд мөрийн тайлбарыг арилгана уу (дэлгэц дээр секунд гарч ирнэ):

//u8g.setPrintPos(44, 50); u8g.print(сек); // Хөдөлгөөний зөв эсэхийг хянахын тулд секундийг гарга

Портын дэлгэцийг ашиглан зөв цагийг тохируулна уу. Үүнийг хийхийн тулд портын дэлгэцийг нээж, температурын анхны хэмжилтийг дуустал хүлээж, одоогийн огноо, цагийг "өдөр, сар, жил, цаг, минут, секунд" форматаар оруулна уу. Ямар ч хоосон зай, тоо таслал, цэгээр тусгаарлагдана.

Хэрэв цаг яарч байгаа бол утгыг том болгож өөрчил, би 100 нэгжийн алхамаар туршилт хийхийг зөвлөж байна. Хэрэв хоцрогдол нь мөрийн утгыг бууруулах ёстой:

Хэрэв (micro() - prevmicros >494000) ( // 500000 гэж тохируулахын тулд өөр зүйлээр солино уу.

Эмпирик байдлаар бид цаг хангалттай нарийвчлалтай ажиллах тоог тодорхойлдог. Хөдөлгөөний нарийвчлалыг тодорхойлохын тулд секундын гаралт хэрэгтэй. Тооны нарийн тохируулга хийсний дараа секундын тайлбарыг гаргаж, дэлгэцээс устгаж болно.
Ноорог байршуулж байна.

Яаж ийгээд хотоор явж байгаад радио электрон барааны шинэ дэлгүүр нээгдсэн байхыг олж харлаа. Дотор нь ороод би Arduino-д зориулсан олон тооны бамбай олсон. Би гэртээ Arduino Uno, Arduino Nano хоёртой байсан бөгөөд тэр даруйдаа алсаас дохио дамжуулагчтай тоглох санаа төрсөн. Би 433 МГц давтамжтай хамгийн хямд дамжуулагч, хүлээн авагч худалдаж авахаар шийдсэн.

Дохио дамжуулагч.


дохио хүлээн авагч.

Өгөгдөл дамжуулах хамгийн энгийн ноорог (жишээг эндээс авсан) бүртгэсний дараа дамжуулах төхөөрөмж нь температур, чийгшил гэх мэт энгийн өгөгдлийг дамжуулахад тохиромжтой байж болох юм.

Дамжуулагч нь дараахь шинж чанартай байдаг.
1. Загвар: MX-FS-03V
2. Үйлдлийн радиус (бөглөх объект байгаа эсэхээс хамаарна): 20-200 метр
3. Ажлын хүчдэл: 3.5 -12V
4. Модулийн хэмжээ: 19*19мм
5. Дохионы модуляц: AM
6. Дамжуулагчийн чадал: 10мВт
7. Давтамж: 433 МГц
8. Шаардлагатай гадаад антенны урт: 25см
9. Холбоход хялбар (зөвхөн гурван утас): DATA ; VCC; Дэлхий.

Хүлээн авах модулийн шинж чанарууд:
1. Ажлын хүчдэл: DC 5V
2. Гүйдэл: 4мА
3. Ажлын давтамж: 433.92MHz
4. Мэдрэмж: - 105дБ
5. Модулийн хэмжээ: 30*14*7мм
6. Шаардлагатай гадна антен: 32 см.

Интернэтийн өргөн уудам нутагт 2Кб / с хурдтай мэдээлэл дамжуулах хүрээ 150м хүртэл хүрч чаддаг гэж ярьдаг. Би өөрөө шалгаагүй ч хоёр өрөө байранд хаа сайгүй хүлээж авдаг.

Гэрийн цаг уурын станцын тоног төхөөрөмж

Хэд хэдэн туршилт хийсний дараа би температур, чийгшлийн мэдрэгч, дамжуулагчийг Arduino Nano-д холбохоор шийдсэн.


DS18D20 температур мэдрэгч нь arduino-д дараах байдлаар холбогдсон байна.

1) GND-ийг микроконтроллерийн хасах хүртэл.
2) DQ татах резистороор дамжуулан газар болон Arduino-ийн D2 зүү
3) Vdd-ээс +5V хүртэл.

MX -FS - 03V дамжуулагч модуль нь 5 вольтоор тэжээгддэг, өгөгдлийн гаралт (ADATA) нь D13 зүүтэй холбогдсон.

Би LCD дэлгэц болон BMP085 барометрийг Arduino Uno-д холбосон.


arduino uno-д зориулсан холболтын диаграм

Дохио хүлээн авагч нь D10 зүүтэй холбогдсон байна.

BMP085 модуль нь тоон атмосферийн даралт мэдрэгч юм. Мэдрэгч нь температур, даралт, өндрийг хэмжих боломжийг олгодог. Холболтын интерфейс: I2C. Мэдрэгчийн тэжээлийн хүчдэл 1.8-3.6 В

Модуль нь бусад I2C төхөөрөмжүүдийн нэгэн адил Arduino-д холбогдсон:

  • VCC - VCC (3.3V);
  • GND-GND;
  • SCL - аналог зүү 5 руу;
  • SDA - аналог зүү 4 рүү.
  • Маш бага зардал
  • Эрчим хүч ба оролт/гаралт 3-5V
  • 20-80% чийгшилийг 5% нарийвчлалтай тодорхойлох
  • 0-50 градусын температурыг тодорхойлох. 2% нарийвчлалтай
  • Санал авах давтамж 1 Гц-ээс ихгүй (1 секунд тутамд нэгээс илүүгүй)
  • Хэмжээ 15.5 мм x 12 мм x 5.5 мм
  • 0.1" хөл хоорондын зайтай 4 зүү

DHT нь 4 зүүтэй:

  1. Vcc (3-5V тэжээл)
  2. Өгөгдлийн гаралт - Өгөгдлийн гаралт
  3. Ашиглагдахгүй байгаа
  4. Генерал

D8 Arduino-д холбогдоно.

Гэрийн цаг агаарын станцын програм хангамж

Дамжуулагчийн модуль нь температурыг 10 минут тутамд хэмжиж, дамжуулдаг.

Доорх хөтөлбөр байна:

/* Sketch version 1.0 Температурыг 10 минут тутамд илгээх. */ #include #include #include #define ONE_WIRE_BUS 2 //Далласын мэдрэгчийг холбох зүү OneWire oneWire(ONE_WIRE_BUS); Даллас температур мэдрэгч (&oneWire); Термометр доторх төхөөрөмжийн хаяг; хүчингүй тохиргоо(void) ( //Serial.begin(9600); vw_set_ptt_inverted(true); // DR3100 vw_setup(2000)-д шаардлагатай; // Дамжуулах хурдыг (bps) тохируулах sensors.begin(); хэрэв (!sensors .getAddress) (дотор термометр, 0)); printAddress(insideThermometer); sensors.setResolution(insideThermometer, 9); ) void printTemperature(DeviceAddress deviceAddress) ( float tempC = sensors.getTempC(deviceAddress); //Serial.print("Temp C:" ); //Serial.println(tempC); //Int дугаар илгээх өгөгдөл үүсгэх = tempC; char тэмдэг = "c"; //Энэ мэдрэгч гэдгийг тодорхойлох үйлчилгээний тэмдэг String strMsg = "z "; strMsg + = тэмдэг; strMsg += " "; strMsg += тоо; strMsg += " "; char msg; strMsg.toCharArray(msg, 255); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); / / Шилжүүлэг дуусах хүртэл хүлээнэ үү (200); ) хүчингүй давталт(void) ( for (int j=0; j)<= 6; j++) { sensors.requestTemperatures(); printTemperature(insideThermometer); delay(600000); } } //Определение адреса void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16); //Serial.print("0"); //Serial.print(deviceAddress[i], HEX); } }

Хүлээн авагч төхөөрөмж нь өгөгдлийг хүлээн авч, өрөөний даралт, температурыг хэмжиж, дэлгэц рүү дамжуулдаг.

#include #include LiquidCrystal lcd(12, 10, 5, 4, 3, 2); #include dht11 мэдрэгч; #dHT11PIN 8-г тодорхойлох #include #include BMP085 dps = BMP085(); урт Температур = 0, Даралт = 0, Өндөр = 0; void setup() ( Serial.begin(9600); vw_set_ptt_inverted(true); // DR3100 vw_setup(2000)-д шаардлагатай); // Хүлээн авах хурдыг тохируулах vw_rx_start(); // Агаарын хяналтыг эхлүүлэх lcd.begin(16, 2); Wire.begin(); delay(1000); dps.init(); //lcd.setCursor(14,0); //lcd.write(байт(0)); //lcd.home(); ) хүчингүй loop() ( uint8_t buf; // Мессежийн буфер uint8_t buflen = VW_MAX_MESSAGE_LEN; // Хэрэв буферийн урт (vw_get_message(buf, &buflen)) // Хэрэв мессеж ирсэн бол ( // int i задлан шинжилж эхлэх; // Хэрэв мессеж бол бидэнд хаяглаагүй , exit if (buf != "z") ( return; ) char команд = buf; // Команд 2-р индекс дээр байна // Тоон параметр 4-р индексээс эхэлнэ i = 4; int тоо = 0; // Шилжүүлэлт нь тэмдэгт тус бүрээр явагдах тул (buf[i] != " ") ( тоо *= 10; тоо += buf[i] - "0"; i++; i++; ) dps.getPressure(&Даралт); dps.getAltitude (&Өндөр); dps.getTemperature(&Температур); //Serial.print(команд); Serial.print(" "); Цуваа хэвлэх(тоо); lcd.print("T="); lcd.setCursor(2,0); LCD хэвлэх (тоо); lcd.setCursor(5,0); lcd.print("P="); lcd.print(Даралт/133.3); lcd.print("ммH"); lcd.setCursor(0,1); lcd.print("T="); lcd.print(Температур*0.1); lcd.print("H="); lcd.хэвлэх(мэдрэгч.чийгшил); lcd.home(); //саатал (2000); int chk = sensor.read(DHT11PIN); шилжүүлэгч (chk) ( DHTLIB_OK: //Serial.println("OK"); завсарлага; тохиолдол DHTLIB_ERROR_CHECKSUM: //Serial.println("Шалгах нийлбэрийн алдаа"); завсарлага; тохиолдол DHTLIB_ERROR_TIMEOUT: //Serial.println("Хугацаа хэтэрсэн" алдаа"); завсарлага; анхдагч: //Serial.println("Үл мэдэгдэх алдаа"); завсарлага; ) ) )

P.S. Ирээдүйд би дараахь зүйлийг нэмж оруулахаар төлөвлөж байна.
- дамжуулагч руу чийгшил мэдрэгч, өгөгдөл дамжуулах алгоритмыг дахин боловсруулах
- салхины хурд, чиглэлийг хэмжих мэдрэгч.
- хүлээн авагчид өөр дэлгэц нэмэх.
- хүлээн авагч ба дамжуулагчийг тусдаа микроконтроллер руу шилжүүлэх.

Болсон үйл явдлын зургийг доор харуулав.

Радио элементүүдийн жагсаалт

Зориулалт Төрөл Номлол Тоо хэмжээ Анхаарна ууДэлгүүрМиний дэвтэр
дамжуулах хэсэг.
Arduino самбар

Arduino Nano 3.0

1 Тэмдэглэлийн дэвтэр рүү
температур мэдрэгч

DS18B20

1 Тэмдэглэлийн дэвтэр рүү
Эсэргүүцэл

220 ом

1 Тэмдэглэлийн дэвтэр рүү
дамжуулагч модульMX-FS-03V (433 МГц)1 Тэмдэглэлийн дэвтэр рүү
радио хүлээн авах хэсэг.
Arduino самбар

Arduino Uno

1 Тэмдэглэлийн дэвтэр рүү
Trimmer резистор 1 Тэмдэглэлийн дэвтэр рүү
Эсэргүүцэл


"Тиймээс та Холливудад зориулж кино хийхгүй гэж шууд зөвшөөрье. Гайхамшигт оронд ч гэсэн нийт скриптийн таваас илүүгүй хувь нь батлагддаг бөгөөд зөвхөн нэг хувь нь л үйлдвэрлэлд ордог ... Тэгэхээр энэ бүхний оронд та өөрийн Холливудыг бүтээх гэж байна. ”
Эд Гаскел "Дижитал кино театр эсвэл гэртээ Холливудын зураг авалт"

Өмнөх үг

Юу вэ, өөр Ардуино цаг уурын станц?! Тийм ээ, дахиад нэг юм, ямар нэг зүйл надад хэлдэг, Интернет дэх хамгийн сүүлчийнх нь биш.


Програмист бүр “Сайн уу Дэлхий!” хөтөлбөр бичих шаардлагатай байдаг шиг Ардуин хүн бүр энгийн эсвэл тийм ч цаг агаарын станц барих туршлагатай байх ёстой.
Интернет дээр аль хэдийн бий болсон цаг уурын станцуудын нэлээд олон төслүүдийг тайлбарласан бөгөөд уншигч тэдгээрийн аль нэгийг нь хэрэгжүүлэх боломжтой. Үнэнийг хэлэхэд, би үүнтэй төстэй арав орчим төсөл, холбогдох төслүүдийг сайтар судалж үзсэн. Тиймээс би бүх зүйлийг эхнээс нь бий болгосон гэж хэлж болохгүй, мэдээжийн хэрэг би "аваргуудын мөрөн дээр зогссон".


Миний төлөвлөгөөнд өгөгдөл хадгалах, харуулах гуравдагч талын үйлчилгээг ашиглахгүй гэдгийг би шууд хэлэх ёстой. Энэ бүхэн эхнээс нь дуустал, А-аас Я хүртэл хэрхэн явагддагийг би хувьдаа мэдэрч, ойлгохыг хүссэн.


Тиймээс ямар нэг зүйлийг хурдан гаргаж авахыг хүсдэг хүмүүст энэ цуврал нийтлэл тохиромжгүй байх магадлалтай. Угсрах заавар бүхий бэлэн иж бүрдэл худалдаж авах нь илүү хялбар байдаг. Микроэлектроникийн мэргэжилтнүүд энд юу ч хийхгүй, магадгүй аяллын эхэнд өөрсдийгөө санаж, хорссон байх.
Харин үнэхээр ойлгохыг хүссэн хүмүүст таалагдах байх гэж бодож байна. Магадгүй энэ материал нь сургалтын хэрэглэгдэхүүн болох байх.



Энэ төсөл 2016 онд хэрэгжиж эхэлсэн ч энэ нь хамааралтай хэвээр байна гэж найдаж байна.

Технологийн багц

Бид энгийн бөгөөд төвөгтэй зүйлсийг судалж, ажиллах болно:

  • DHT22, DHT11 төрлийн температур, чийгшлийн мэдрэгч
  • агаарын даралт мэдрэгч төрөл BMP180
  • WiFi модуль ESP8266
  • радио модулийн төрөл nRF24 2.4 GHz
  • гэр бүлийн Arduino Pro Mini, Arduino Mega
  • нарны хавтан ба батерей
  • програмчлалын хэл C/C++
  • PHP програмчлалын хэл
  • MySQL мэдээллийн сангийн удирдлагын систем
  • Java програмчлалын хэл болон Android хүрээ (ухаалаг утсан дээр цаг агаарын мэдээллийг харуулах Adnroid програмыг бий болгох).

Жагсаалтад орсон сэдвүүдийн зарим нь үнэ цэнэтэй зүйл биш бөгөөд заримыг нь олон жилийн турш судалж болно. Тиймээс бид нарийн төвөгтэй зүйлсийг зөвхөн энэ төсөлтэй шууд холбоотой хэсэгт л хөндөх бөгөөд ингэснээр энэ бүхэн хэрхэн ажилладагийг ойлгох болно.


Гэхдээ бид эхнээсээ эхэлнэЗөв. Тухайлбал, ирээдүйн төхөөрөмжийн тодорхойлолт, дизайнаас "цаасан дээр"Ингэснээр эцэст нь тоосго бүр байрандаа хэвтэв.

прототип хийх

Википедиа бидэнд зөв хэлсэнчлэн, прототип хийхажлын системийн хэрэгжилтийн хурдан төсөл юм. Тийм ээ, энэ нь бүрэн үр ашиггүй, зарим алдаатай ажиллахгүй, гэхдээ гар урлалыг үйлдвэрлэлийн загвар болгон хөгжүүлэх эсэх талаар санаа өгөх болно. Прототипийг бүтээх үйл явц удаан үргэлжлэх ёсгүй. Прототип хийх үе шат дараа нь системийн шинжилгээ, түүнийг боловсронгуй болгох явдал юм.


Гэхдээ энэ нь ажилчид бүтэн цагаар ажилладаг салбар юм.


Оройн цагаар гэрийн тэжээмэл амьтдын гар урлалыг "интернетэд" зориулж хийдэг хүн бүр хагас боловсруулсан бүтээгдэхүүн болох прототипийг бүтээж байгаагаа мэддэг байх ёстой. Энэ нь ердийн үйлдвэрийн бүтээгдэхүүний түвшнээс маш хол байна. Тийм ч учраас Та манай сонирхогчийн гар урлалыг амьдралын чухал хэсгүүдэд даатгах ёсгүймөн тэд биднийг урам хугарахгүй гэж найдаж байна.


Аж үйлдвэрийн бүтээгдэхүүн нь үйлдвэрлэлийн элементийн суурин дээр бүтээгдсэн бөгөөд дараа нь бестселлер болохоосоо өмнө дибаг хийх, турших, засвар үйлчилгээ хийх зэрэг олон үе шатыг дамждаг.


Тиймээс, энэ бүх уйтгар гунигийн оронд бид өөрсдийн тоглоомыг бүтээх болно, гэхдээ энгийн тоглоом биш. Техникийн бүтээлч байдлын элементүүд, програмчлалын эхлэл, бусад холбогдох зүйлсийн мэдлэг (бүтээлийн явцад).


Мэдээжийн хэрэг, электроникийн инженерүүд програмчлалын үе шатанд хэцүү байх болно, програмистууд хэлхээний талаар хөлсөө урсгах болно, гэхдээ зохиогч бүх зүйлийг аль болох хүртээмжтэй болгож, яагаад тодорхой шийдлүүдийг ашигласан талаар тодорхой тайлбарлахыг хичээх болно.

Шаардлага

Ихэнхдээ энэ алхамыг алгасдаг. Яг одоо ийм зүйл хийхээр шийдэж, дараа нь бүхэл бүтэн төслийг мухардалд оруулдаг эсвэл бүр тэвчихийн аргагүй болгодог жижиг нарийн ширийн зүйлс гарч ирдэг. Бидний бүх Хүслийн жагсаалтыг бичих шаардлагатай, би үүний тулд Google Drive ашигладаг, үүнийг компьютер болон хөдөлгөөнт төхөөрөмжөөс авах боломжтой.


Тиймээс манай цаг уурын станц дараахь зүйлийг хийх ёстой.

  • гаднах температур, чийгшлийг хэмжих
  • байшин доторх температур, чийгшлийг хэмжих
  • атмосферийн даралтыг хэмжих
  • дэлгэц дээр заасан утгуудыг харуулах
  • Интернэт дэх сервер рүү өгөгдөл дамжуулах, өгөгдөл нь өгөгдлийн санд хадгалагдаж вэб хуудсан дээр харагдах эсвэл гар утасны програмд ​​​​хэрэглэгдэх болно.

Мэдрэгчийг хамгийн энгийн бөгөөд хамгийн хямдаар ашигладаг. Жишээлбэл, урагшаа харахад DHT22 нь температурыг маш нарийн хэмждэг боловч чийгшилд бага зэрэг буруу байна гэж хэлэх болно. Гэхдээ дахин хэлье, энэ нь хамаагүй, учир нь бидний өмнө загвар байгаа бөгөөд 5% -ийн чийгшил нь бидний амьдралд чухал зүйлд нөлөөлөхгүй.


Системийн архитектур, техник хангамж, програм хангамж нь системийг улам өргөжүүлж, шинэ мэдрэгч, шинэ боломжуудыг нэмэх боломжийг олгох ёстой.

Төмөр. Бүрэлдэхүүн хэсгүүдийн сонголт

Энэ бол хамгийн чухал хэсэг бөгөөд гагнуур эсвэл програмчлал огт биш юм. Системд тавигдах шаардлагуудыг тодорхойлсны дараа тэдгээрийг яг юу хэрэгжүүлэх талаар шийдэх шаардлагатай.


Энд нэг нюанс байна. Бүрэлдэхүүн хэсгүүдийг сонгохын тулд та тэдгээрийн чадавхийг сайн мэдэх хэрэгтэй, та технологийг өөрсдөө мэдэх хэрэгтэй. Өөрөөр хэлбэл, энд та анхан шатны электроникийн инженер, програмистаас хол байх хэрэгтэй. Одоо боломжит төхөөрөмжүүдийг бүхэлд нь судлахад хэдэн жил зарцуулах вэ?


Харгис балмад тойрог? Гэвч тэднийг эвдэхийн тулд харгис тойрог байдаг.


Гарц байгаа. Та зүгээр л хэн нэгний төслийг аваад давтаж болно. Би цаг уурын станцуудын одоо байгаа төслүүдийг судалж үзээд нэг алхам хийсэн гэж найдаж байна.


Тэгэхээр. Цаг уурын станцын архитектур нь Arduino дээр суурилдаг. Учир нь Arduino нь нэвтрэх бага босготой бөгөөд би үүнийг аль хэдийн шийдсэн. Дараа нь сонгоход илүү хялбар болно.


Цаг агаарын станцад алсын удирдлагатай, цонхны гаднах мэдрэгч, төв модуль байх нь тэр даруй тодорхой болов.


Төв, үндсэн нэгж нь дотор байрлана. Үүнийг эхний үе шатанд тодорхойлох нь чухал бөгөөд үүнээс үйл ажиллагааны температурын горим, хүч чадлын "бүжиг" зэрэг чухал шинж чанарууд юм.


Алсын мэдрэгч (эсвэл мэдрэгч) нь "тархигүй" байх бөгөөд түүний даалгавар бол үе үе хэмжилт хийж, өгөгдлийг гэрийн төв хэсэгт дамжуулах явдал юм. Төв нэгж нь бүх мэдрэгчээс өгөгдлийг хүлээн авч, дэлгэцэн дээр гаргаж, мэдээллийн сан руу интернет рүү илгээдэг. Өгөгдөл нь өгөгдлийн санд ормогц та түүгээр хүссэн бүхнээ хийж болно, тэр ч байтугай график зурах боломжтой.


Гадаад ертөнцтэй харилцахын тулд интернетийг ESP8266 WiFi модулиар бараг ямар ч хувилбаргүйгээр сонгосон (одоо ийм хувилбарууд гарч ирсэнийг анхаарна уу). Arduino-д Ethernet өргөтгөлийн самбарууд байдаг ч би кабельд холбогдохыг огт хүсээгүй.



Сонирхолтой асуулт бол гаднах мэдрэгч (эсвэл мэдрэгч, системийн өргөтгөлийн шаардлагыг санаж байна уу?) болон төвийн хоорондох холбоог хэрхэн хангах тухай байв. 433 МГц-ийн радио дохио нь мэдээж тохиромжгүй (тэд ямар ч зүйлд тохиромжгүй).


ESP8266-г дахин ашиглах уу?


Энэ шийдлийн сул талууд:

    Гэрээс гадуур тогтвортой WiFi шаардлагатай

    харилцааны хүрээ тийм ч их биш байх болно

    найдвартай байдал алдагдах болно, хэрэв интернет доголдвол бид алсын мэдрэгчээ харахгүй

    илүү их эрчим хүчний хэрэглээ.

    Эрчим хүчний хэрэглээ ESP8266:

    120-170 мА дамжуулах үед

    50-56 мА хүлээн авах үед

    Гүн нойрны горимд 10 мкА (мкА)

    унтрах төлөв 5 мкА (мкА).

Эцэст нь алсын мэдрэгчийг гэрийн үндсэн төхөөрөмжтэй холбохын тулд нэг саванд 2.4 ГГц давтамжтай дамжуулагч, хүлээн авагч бүхий nRF24L01 + чипийг нэмэлт гадаад антеннаар сонгож, ханыг "нэвчих" нь гарцаагүй.



Эрчим хүчний хэрэглээ nRF24L01+ 2.4 GHz:

  • 11 мА хүлээн авах үед
  • 2Mbps хурдтай дамжуулах үед - 13 мА
  • зогсолтын I горимд - 26 мкА (мкА)
  • унтрах төлөв 900 нА (нА).

ESP8266 болон nRF24L01+ хоёулаа тохиромжтой ажиллах температурын хүрээтэй: -40℃-аас +80℃ хүртэл.


Та nRF24L01+-ийг ойролцоогоор 1 доллараар эсвэл гадаад антенныг 3 доллараар худалдаж авах боломжтой. Та ESP8266-01-г 4 доллараар худалдаж авах боломжтой. Бүтээгдэхүүний тайлбарыг анхааралтай уншина уу! Үгүй бол нэг антен худалдаж аваарай.


Системийн цөм нь гарч ирэв. Мэдрэгч рүү өөрсдөө шилжье.


Гудамжинд, та бүхний мэдэж байгаагаар температур нь сөрөг утгад хүрч чаддаг тул DHT11 мэдрэгч нь тохиромжгүй, харин DHT22 нь зөв юм.



DHT22 / AM2302-ийн үзүүлэлтүүд:

  • 3.3V - 5V тэжээл, 5V зөвлөж байна
  • хэмжилт хийх, өгөгдөл дамжуулах үед хамгийн их хэрэглээ 2.5 мА
  • чийгшлийн хэмжилтийн хүрээ 0-100%, алдаа 2-5%
  • температурын хэмжилтийн хүрээ -40-аас +125 ° C хүртэл ± 0.5 ° C-ийн алдаатай
  • 0.5 Гц-ээс ихгүй хэмжилт хийх хүсэлт - 2 секунд тутамд нэг удаа.

Гэрийн дотор ямар ч сөрөг температур байхгүй гэж найдаж байна, тиймээс та DHT11-ийг ашиглаж болно, ялангуяа надад аль хэдийн байсан.


DHT11-ийн онцлогууд:

  • 3.3V-ээс 5V хүртэлх тэжээл
  • хэмжилт, өгөгдөл дамжуулах үед хамгийн их хэрэглээ 2.5 мА
  • чийгшлийн хэмжилтийн хүрээ 20-80%, алдаа 5%
  • температурын хэмжилтийн хүрээ 0-ээс +50 ° C хүртэл ± 2 ° С-ийн алдаатай
  • хэмжилтийн хүсэлт 1 Гц-ээс ихгүй байна - секундэд нэг удаа.

Та DHT22-г ойролцоогоор 3 доллараар худалдаж авах боломжтой. DHT11 зардал бага - 1 доллар, гэхдээ энэ нь бас бага нарийвчлалтай.


Одоо дахин Arduino руу буцна уу. Аль самбар сонгох вэ?


Би системийн бие даасан хэсгүүдийг Arduino UNO дээр туршиж үзсэн. Тэдгээр. Би ESP модулийг uno-д холбож, судалж, унтрааж, дараа нь nRF24 гэх мэтийг холбосон. Цонхны мэдрэгчийг эцсийн байдлаар хэрэгжүүлэхийн тулд би Arduino Pro Mini-г Uno-д хамгийн ойрхон бяцхан бүтээлээр сонгосон.



Эрчим хүчний хэрэглээний хувьд Arduino Pro Mini бас сайн харагдаж байна:

  • USB-TTL хөрвүүлэгч байхгүй бөгөөд энэ нь өөрөө маш их "иддэг".
  • LED нь 10к резистороор холбогддог.

Нарийвчилсан эрчим хүч хэмнэхийн тулд дараахь зүйлийг төлөвлөсөн болно.

  • Arduino Pro Mini дээрх LED - тэжээлийн индикаторыг арилга (самбарыг эвдээгүйдээ харамсаж байна)
  • эсвэл Atmel ATmega328 микропроцессор дээр "нүцгэн" угсралт ашиглах (үүнийг ашиглаагүй)
  • Бага эрчим хүчний номын сан эсвэл JeeLib ашиглана уу.

Миний сонгосон номын сангаас Low Power Library-г сонгосон бөгөөд энэ нь энгийн бөгөөд зөвхөн танд хэрэгтэй зүйлийг агуулдаг.


Төв нэгжийн хувьд олон тооны захын төхөөрөмжийг холбохоор төлөвлөж байсан тул Arduino Mega хавтанг сонгосон. Үүнээс гадна, энэ нь UNO-тэй бүрэн нийцдэг бөгөөд илүү их санах ойтой. Цаашид энэ сонголт бүрэн үндэслэлтэй байсан гэж би хэлэх болно.


Та Arduino Mega-г 8 доллараар худалдаж авах боломжтой.

Эрчим хүч ба эрчим хүчний хэрэглээ

Одоо хоол хүнс, эрчим хүчний хэрэглээний талаар.


Arduino Pro Mini хоёр төрөл байдаг:

  • тэжээлийн хүчдэл 5V ба 16MHz давтамжийн хувьд
  • 3.3V-ийн тэжээлийн хүчдэл ба 8МГц давтамжийн хувьд.

nRF24L01+ радио модуль нь тэжээлийн хангамжид 3.3V шаардлагатай бөгөөд энд хурд чухал биш тул 8MHz ба 3.3V давтамжтай Arduino Pro Mini худалдаж аваарай.


Энэ тохиолдолд Arduino Pro Mini-ийн тэжээлийн хүчдэлийн хүрээ нь:

  • 3.3V загварын хувьд 3.35-12V
  • 5V загварын хувьд 5-12V.

Би аль хэдийн 5V Arduino Pro Mini-тэй байсан тул би үүнийг ашигласан. Та Arduino Pro Mini-г 4 доллараар худалдаж авах боломжтой.


Төвийн нэгжийн тэжээлийн хангамж нь 220 В сүлжээнээс жижиг цахилгаан хангамжийн нэгжээр дамжин 12 В, 450 мА, 5 Вт гаралт өгөх болно. Ийм зүйлийг 5 доллараар авна. Мөн 5V-д зориулсан тусдаа гаралт байдаг.



Хэрэв энэ нь хангалтгүй бол та үүнийг илүү хүчтэй болгож чадна. Өөрөөр хэлбэл, төв нэгжийн эрчим хүчийг хэмнэх нь тийм ч утгагүй юм. Гэхдээ алсын утасгүй мэдрэгчийн хувьд эрчим хүч хэмнэх нь хамгийн чухал хэсэг юм. Гэхдээ би функциональ байдлаа алдахыг хүсэхгүй байна.


Тиймээс Arduino Pro Mini болон nRF24 радио модуль нь 4 Ni-Mh батерейгаар тэжээгддэг.


Бас санаж байна орчин үеийн батерейны хамгийн их хүчин чадалойролцоогоор 2500-2700 мАч, үүнээс өөр зүйл бол маркетингийн заль (Ansmann 2850) эсвэл хуурамч (UltraFire 3500) юм.


Би хэд хэдэн шалтгааны улмаас Li-Ion батерейг ашигладаггүй:

  • маш үнэтэй
  • орчны температур 0 хэмээс доош унах үед лити-ион батерейны хүч 40-50% хүртэл буурдаг.
  • хямдхан нь хамгаалалтгүй хийгдсэн бөгөөд аюулгүй биш (богино холболт эсвэл цэнэгийн үед дэлбэрч, шатаж болно, YouTube дээр олон тооны видеог үзээрэй)
  • ашиглаагүй байсан ч хөгширдөг (гэхдээ үүнийг бүх химийн элементүүдийн талаар хэлж болно) 2 жилийн дараа ли-ион батерей нь хүчин чадлынхаа 20 орчим хувийг алддаг.

Прототипийн хувьд өндөр чанартай Ni-MH AA эсвэл AAA батерейгаар ажиллах боломжтой. Түүнээс гадна бидэнд том урсгал хэрэггүй. Ni-MH батерейны цорын ганц сул тал бол удаан цэнэглэх хугацаа юм.

Цаг уурын станцын ерөнхий схем

Дүгнэж хэлье. Энэ бүхэн хэрхэн ажилладаг тухай ерөнхий диаграмм энд байна.



Үргэлжлэл бий.

Бид цаг уурын станцаа үргэлжлүүлэн хөгжүүлсээр байна.

Шинэчлэлт рүү шилжихээсээ өмнө би жаахан тодруулахыг хүсч байна.

Манай нэг мэргэжил нэгт над руу захидал бичсэн: яагаад харуулын цаг хэмжигч нэвтрүүлсэн бэ?

Цаг хэмжигчийг онцгой байдлын үед тохируулдаг. Дадлагаас харахад ENC28J60 нь нэгэн зэрэг 4 холболтоос илүү татахгүй (санах ой ажиллахгүй бол). Сүлжээг хадгалахын тулд хэдэн үйлчилгээний холболт байнга гарч ирдэг ба гэрийн тоглоомын бүх төрлийн (жишээ нь, орчин үеийн телевизорууд сүлжээнд байгаа хостуудыг сканнердаж, тэдгээрийн портууд нээгддэг) зөвхөн зүүн урсгалыг харгалзан үзвэл загвар нь зүгээр л тэнэг байдалд ордог. . ENC28J60 нь сүлжээний протоколуудтай хэрхэн бие даан ажиллахаа мэддэггүй бөгөөд бүх зүйлийг номын санд хэрэгжүүлдэг. Магадгүй энэ нь зөвхөн тэд юм.
Би боломжтой бүх номын сан, өөр өөр модулиудыг (гэнэт гэрлэлт) шалгасан боловч удаан хугацаанд тогтвортой ажилд хүрч чадаагүй. Хамгийн их хугацаа нь ойролцоогоор 3-4 долоо хоног байв.
Үүний тулд "нохой" тэнд эргэлдэж, энэ тохиолдолд хянагчийг татдаг. Үүний дараа асуудал арилсан.
Миний гэрийн сүлжээнд тодорхой нюанс, асуудал байгааг би үгүйсгэхгүй. Гэхдээ асуудал надтай холбоотой байсан тул өөр хүнтэй холбоотой байж болно. Би одоог хүртэл энэ шийдлийг л олсон.
Миний мэдэж байгаагаар Wiznet чипүүдэд (W5100 ба түүнээс дээш) ийм зүйл байхгүй, эсвэл зүгээр л сайн хайгаагүй.

Шинэчлэлт рүү шилжье

Хамгийн гол нь бид чипээс холдож байна ENC28J60болон очих W5100. Би бүх зүйлийг хуучин чип дээр хэрэгжүүлэх гэж оролдсон боловч маш том номын сангаас болж микроконтроллерийн санах ой хангалтгүй байна. ENC28J60. Шинэ чип ашиглах үед стандартномын сангууд хөгжүүлэгчээс болон хийсэн бүх өөрчлөлтүүд нь бүр ч илүү хэвээр байна 20% микроконтроллерийн чөлөөт санах ой ATMega328. Мөн эдгээр нь шинэ боов юм!

Энэхүү хувилбар нь (хоёр дахь хувилбар гэж нэрлэе) давтамжийг ашиглан мэдрэгчээс уншсан мэдээллийг утасгүй дамжуулах чадварыг нэмсэн. 433 МГц. Би модулиудыг хятадуудаас өөрсдөө авч тэмдэглэж авсан XY-MK-5V. Дамжуулах чанар нь төгс биш гэдгийг тэмдэглэхийг хүсч байна. Дохио алдагдах, дуу чимээ гарах, нэгэн зэрэг дамжуулах боломжгүй гэх мэт. Гэхдээ тэдний үнэ (нэг багц нь 1 доллараас бага) эдгээр дутагдлыг нөхдөг. Эдгээр (хамгийн хямд) модулиуд нь гэрийн хэрэглээнд зориулагдсан олон брэндийн цаг уурын станцуудад байдаг гэдгийг би та нарт нууц хэлье. Хөөх, гэнэтийн үү?

Суурь станцаас эхэлье

Бид нүүж байна Arduino UNOТэгээд Ethernet Shield(эхний хувилбар) чип дээр суурилсан W5100. Энэ бол сэндвич бөгөөд үүнийг тайлбарлах нь утгагүй юм. Би зөвхөн модулиудын нэмэлт холбогдсон холбоо барих хаягийг тайлбарлах болно XY-MK-5V.

Дамжуулагчийн модуль нь хүчийг ашигладаг 5V, GND(тэр үед ээжгүй бол хаана) ба D2хянагч дээр зүү. Харилцагчийг засах D2 (ДАТА)функцийг ашиглаж болно vw_set_tx_pin vw номын сангаас.

Өмнөх ноорогоос ялгаатай нь энэ нь хоёр нэмэлт санг ашигладаг:

#оруулна #оруулна

Ноорог өөрөө

Нуугдсан текст

#оруулна #оруулна #оруулна #оруулна #оруулна #оруулна #оруулна #оруулна #define DHTTYPE DHT22 #define DHTPIN 5 DHT dht(DHTPIN, DHTTYPE); байт mac = (0x54, 0x34, 0x31, 0x31, 0x31, 0x31); charserver = "narodmon.ru"; int порт = 8283; IPaddress ip(192,168,0,201); EthernetClient үйлчлүүлэгч; BMP085 dps = BMP085(); урт Температур = 0, Даралт = 0; хөвөх H, dP, dPt; bool интервал = үнэн; EasyTransferVirtualWireET; struct SEND_DATA_STRUCTURE( байт ID; // Төхөөрөмжийн ID int Температур; // Температурын хөвөх даралт; // Даралтын хөвөгч чийгшил; // Чийгийн хөвөгч шүүдэр цэг; // Шүүдэр/хөлдөлтийн цэг ); SEND_DATA_STRUCTURE нэвтрүүлэг; void setup() ( // Watchdog цаг хэмжигчийг эхлүүлэх wdt_disable(); delay(8000); wdt_enable(WDTO_8S); // консолыг эхлүүлэх Serial.begin(9600); // DHT мэдрэгчийг эхлүүлэх dht.begin(); // эхлүүлэх 433 МГц-ийн модуль ET.begin(дэлгэрэнгүй мэдээлэл(нэвтрүүлэг)); vw_set_ptt_inverted(true); vw_set_tx_pin(2); vw_setup(2000); // Хэрэв бид DHCP серверээс өгөгдлийг хүлээгээгүй бол сүлжээг эхлүүлнэ үү. // хэрэв (Ethernet.begin(mac) == 0) Ethernet.begin(mac, ip); // 1-Wire Wire.begin(); хойшлуулах (200); // BMP180-ийг өндрийн тохируулгатай эхлүүлэх // dps.init (MODE_STANDARD, 3200, үнэн); // BMP180-ийг эхлүүлэх dps.init(); Serial.println(Ethernet.localIP()); // Төхөөрөмжийг асаасан даруй эхний өгөгдлийг илгээх send_info(true) ); ) // dewPoint функц NOAA / / лавлагаа (1) : http://wahiduddin.net/calc/density_algorithms.htm // лавлагаа (2) : http://www.colorado.edu/geography/weather_station/Geog_site /about.htm давхар шүүдэр цэг (цельсийн давхар, давхар чийгшил) ( // (1) Ханалтын уурын даралт = ESGG(T) давхар ХАРЬЦАА = 373.15 / (273.15 + Цельсийн); давхар RHS = -7.90298 * (Харьцаа - 1); RHS += 5.02808 * log10(RATIO); RHS += -1.3816e-7 * (pow(10, (11.344 * (1 - 1/Харьцаа)))) - 1) ; RHS += 8.1328e-3 * (pow(10, (-3.49149 * (Харьцаа - 1))) - 1) ; RHS += log10(1013.246); // хүчин зүйл -3 нь нэгжийг тохируулах явдал юм - Уурын даралт SVP * чийгшил давхар VP = pow(10, RHS - 3) * чийгшил; // (2) DEWPOINT = F(Уурын даралт) давхар T = log(VP/0.61078); // temp var return (241.88 * T) / (17.558 - T); ) void send_info(bool eth) ( bool fail = true; while(fail) ( // Үр дүн гарах хүртэл DHT чийгийн мэдрэгчээс өгөгдлийг уншихыг оролдож байна. Тохиолдлын 90%-д бүх зүйл хэвийн ажилладаг, гэхдээ бидэнд 100 хэрэгтэй. % if((H = dht.readHumidity()) >= 0) ( // BMP180 мэдрэгчээс чийгшил, температурыг авна dps.getPressure(&Pressure); dps.getTemperature(&Temperature); // Хэрэв шүүдэр цэгийг тооцоолно уу. температур Цельсийн 0 хэмээс дээш байвал // 0-ээс дээш үр дүн гарна, эс тэгвээс 0 гарна. Энэ нь өвлийн улиралд төөрөгдүүлэхгүйн тулд // зайлшгүй шаардлагатай. // dP = Температур>0?((dPt=ШүүдэрЦэг(Температур*0.1, H))<0?0:dPt):0; dP = dewPoint(Temperature*0.1, H); // Отправляем данные в эфир 433 мГц broadcast.ID = 1; broadcast.Temperature = floor(Temperature*0.1); broadcast.Pressure = floor(Pressure/133.3*10)/10; broadcast.Humidity = floor(H*10)/10; broadcast.dewPoint = floor(dP*10)/10; ET.sendData(); delay(250); if(eth) { // Подключаемся к серверу "Народный мониторинг" if(client.connect(server, port)) { // Начинаем передачу данных // адрес_устройства_в_проекте, имя_устройства, GPS широта, GPS долгота client.print(F("#fe-31-31-0e-5a-3b#Arduino Uno#71.344699#27.200014\n")); // Температура client.print(F("#T0#")); client.print(Temperature*0.1); client.print(F("#Температура\n")); // Давление client.print("#P1#"); client.print(Pressure/133.3); client.print(F("#Давление\n")); // Влажность client.print("#H1#"); client.print(H); client.print(F("#Влажность\n")); // Точка росы\инея client.print("#T1#"); client.print(dP); client.print((dP <= 0)? F("#Точка инея\n"):F("#Точка росы\n")); //client.print(F("#Точка росы\n")); // Отправляем конец телеграммы client.print("##"); // Даем время отработать Ethernet модулю и разрываем соединение delay(250); client.stop(); } } // Останавливаем цикл, если передача завершена fail = !fail; break; } delay(250); } } void loop() { // Каждые 4 секунды сбрасываем сторожевой таймер микроконтроллера // Каждые 6 минут отправляем данные на "Народный мониторинг" // Каждые 30 секунд отсылаем данные в эфир 433 if(!(millis()%1000)) wdt_reset(); if(!(millis()%360000)) send_info(true); if(!(millis()%30000)) send_info(false); }

Модулуудад өөрсдөө антен нэмэх ёстой. Учир нь 433 МГцердийн зэс утас хангалттай 17 см. Антенгүй бол та хэвийн ажиллагааг мартаж болно.

Энэ шинэчлэлийн хамгийн чухал хэсэг болох орон нутгийн утасгүй станц руу шилжиж байна

Үүнийг хэрэгжүүлэхийн тулд (өвдөг дээрээ) би аналог ашигласан Arduino NANO(суурь дээр ATMega328) Мөн TFTчип дээр харуулах ST7735Sзөвшөөрөлтэйгээр 128x160

Нуугдсан текст



Pinout дэлгэц -> хянагч

============================== LED | 3.3V SCK | SCK(13) SDA | MOSI(11) A0 | DC(9) RESET | RST(8)CS | CS (10) GND | GND VCC | 5V ============================

Хүлээн авагчийн модуль нь зөвхөн дамжуулагчтай ижил аргаар холбогдсон байна ӨГӨГДӨЛбэхлэх D7.

Энэ нь ямар харагдаж байгааг харуулсан хэдэн зураг:

Нуугдсан текст

Хүлээн авагчийн зураг

Нуугдсан текст

#оруулна #оруулна #оруулна #оруулна int x, y; int w = 128, h = 160; хэмжээ; // 433 EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE( байт ID; // Төхөөрөмжийн ID int Температур; // Температурын хөвөх даралт; // Даралтын хөвөгч чийгшил; // Чийгийн хөвөгч шүүдэр цэг; // Шүүдэр/хөлдөлтийн цэг ); SEND_DATA_STRUCTURE нэвтрүүлэг; int Log_Temperature = -1; float Log_Pressure = -1; float Log_Humidity = -1; float Log_dewPoint = -1; // TFT #define cs 10 #define dc 9 #define st 8 char Температур, даралт, чийгшил, шүүдэр цэг; Stringinfo; TFT TFT дэлгэц = TFT(cs, dc, rst); void setup()( Serial.begin(9600); // 433МГц модулийг эхлүүлэх ET.begin(дэлгэрэнгүй(дэлгэрэнгүй)); vw_set_ptt_inverted(true); vw_set_rx_pin(7); vw_setup(2000); vw_rx_start(); // Initialize дэлгэцийн анхны тохиргоо TFTscreen.begin(); TFTscreen.setRotation(2); TFTscreen.background(0, 0, 0); // Статик элементүүдийг зурах // 1. TFTscreen.stroke(255, 255, 255); TFTscreen дээр зочилно уу. .setTextSize(1); TFTscreen.text(" ", 10, 10); // 2. Мэдрэгчийн уншилтын тайлбар TFTscreen.text("mmHg", w/2+5, 80); TFTscreen.text ("% ", w/2+5, 100); TFTscreen.text("C", w/2+5, 120); цацалт. Температур = 0; цацалт. Даралт = 0; цацалт. Чийгшил = 0; цацалт .dewPoint = 0; TFTPrint(); ) хүчингүй давталт()( if(ET.receiveData())( if(broadcast.ID == 1) TFTPrint(); /* Serial.println(broadcast.Temperature); Цуваа. println(broadcast) .Даралт); Цуваа.println(нэвтрүүлэг.Чийгшил); Цуваа.println(broadcast.dewPoint); Serial.println(); */ ) ) хүчингүй өөрчлөлт (int хэмжээ, int x) , int y, bool up, bool clear = false) ( if(clear) TFTscreen.stroke(0, 0, 0); else ( өөрчлөлт(хэмжээ, x, y, !дээш, үнэн); TFTscreen.stroke((дээш)?0:255, 0, (дээш)?255:0); ) if((хэмжээ%2) == 0 )хэмжээ++; while(хэмжээ > 0) ( TFTscreen.line(x, y, x+(size--), y); ++x, (дээш)?--y:++y, --size; ) /* while( хэмжээ > 0) ( TFTscreen.line(x, y, (дээш)?x+size-1:x, (дээш)?y:y+size-1); ++x, ++y, --size; ) */ ) int x_center(int w, int урт, int хэмжээ) ( буцах шал((w-урт*(хэмжээ*5)+хэмжээ*2)/2); ) int x_alignment_right(int w, int урт, int) хэмжээ) ( буцах тааз(w-урт*(хэмжээ*5)+хэмжээ*2); ) хүчингүй TFTPrint() ( хэмжээ = 3; // =============== ================================================== ============== // Температурын заалтыг харуулах // =========================== = =================================================== == if(broadcast.Temperature != Log_Temperature) ( TFTscreen.setTextSize(size); // Хуучирсан өгөгдлийг дарж бичих String info = String(Log_Temperature); info.concat(" C"); if(Log_Temperature > 0) info = " +"+мэдээлэл; info.toCharArray(Температур, info.length()+1); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Температур, x_center(w, info.length()+1 , хэмжээ ), 35); // Шинэ уншилтуудыг гарга i info = Мөр(өргөн нэвтрүүлэг. температур); info.concat("C"); if(broadcast.Temperature > 0) info = "+"+info; info.toCharArray(Температур, info.length()+1); // Температураас хамаарч температурын утгын өнгийг өөрчлөх int r, g = 0, b; if(broadcast.Temperature > 0) ( r = газрын зураг(нэвтрүүлэг.Температур, 0, 40, 255, 150); // Улаан b = газрын зураг (цахилгаан дамжуулалт. Температур, 0, 40, 30, 0); // Өнгийг өөрчлөх илүү харааны тэг хөндлөн огтлолцохын тулд ) else ( r = газрын зураг(broadcast.Temperature, -40, 0, 0, 30); // Илүү харагдахуйц тэг огтлолцохын тулд өнгийг өөрчил b = map (broadcast.Temperature, -40, 0, 150) , 255); // Цэнхэр ) TFTscreen.stroke(b, g, r); // АНХААРУУЛГА: номын сангийн өнгөний байрлалыг өөрчилсөн, RGB газрыг BGR ашигладаг! TFTscreen.text(Температур, x_center(w, info.length()+1, хэмжээ), 35); ) хэмжээ = 1; // ================================================ = =================================== // Даралтын заалтыг харуулж байна // ======== = ================================================= ====================== if(broadcast.Pressure != Log_Pressure) ( TFTscreen.setTextSize(size); // Хуучирсан өгөгдлийг дарж бичих = String(Log_Pressure) ); info.toCharArray(Даралт, info.length()); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Даралт, x_alignment_right(w/2-5, info.length(), хэмжээ), 80 ); // Шинэ уншилтыг гаргах мэдээлэл = Мөр(broadcast.Pressure); info.toCharArray(Даралт, info.length()); TFTscreen.stroke(255, 255, 255); TFTscreen.text(Даралт, x_alignment_right(w/) 2-5, info.length(), size), 80); өөрчлөлтүүд(10, 106, 85, (өргөн.Даралт > Бүртгэлийн_даралт)? үнэн: худал); ) өөр (өөрчлөлт (10, 106, 85, үнэн,) үнэн); өөрчлөлт (10, 106, 85, худал, үнэн); ) // ============================= = ================================================= = / / Гаралтын чийгийн уншилт // ================= ================================================== ============ if(broadcast.Humidity != Log_Humidity) ( TFTscreen.setTextSize(хэмжээ); // Хуучирсан өгөгдлийн мэдээллийг дарж бичих = String(Log_Humidity); info.toCharArray(Чийгшил, мэдээлэл.урт()); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Чийглэг, x_alignment_right(w/2-5, info.length(), size), 100); // Шинэ уншилтыг гаргах мэдээлэл = String(broadcast.Humidity); info.toCharArray(Чийгшил, мэдээлэл.урт()); TFTscreen.stroke(255, 255, 255); TFTscreen.text(Чийглэг, x_alignment_right(w/2-5, info.length(), size), 100); өөрчлөлт(10, 106, 105, (нэвтрүүлэг. Чийглэг > Лог_Чийглэг)? үнэн: худал); ) else ( өөрчлөлт(10, 106, 105, үнэн, үнэн); өөрчлөлт (10, 106, 105, худал, үнэн); ) // ================= ================================================== ============= // Шүүдэр цэгийг харуулна\ хяруу // ======================== == =================================================== === хэрэв(broadcast.dewPoint ! = Log_dewPoint) ( TFTscreen.setTextSize(size); // Хуучирсан өгөгдлийг дарж бичих = String(Log_dewPoint); info.toCharArray(dewPoint, info.length()); TFTscreen.stroke(0, 0, 0); TFTscreen.text (dewPoint, x_alignment_right(w/2-5, info.length(), size), 120); // Шинэ уншилтуудыг харуулах мэдээлэл = String(broadcast.dewPoint); info.toCharArray(dewPoint, info.length()); TFTscreen.stroke(255, 255, 255);TFTscreen.text(dewPoint, x_alignment_right(w/2-5, info.length(), size), 120); өөрчлөлтүүд(10, 106, 125, (broadcast.dewPoint >) Log_dewPoint)?true:false); ) else (өөрчлөлт (10, 106, 125, үнэн, үнэн); өөрчлөлт (10, 106, 125, худал, үнэн); ) // Бүртгэл дэх утгыг дараа нь шинэчилнэ үү. харьцуулалт Log_Temperature = broadcast.Temperature; Log_Pressure = broadcast.Pressure; Log_Humidity = нэвтрүүлэг.Humidity; log_dewPoint = broadcast.dewPoint; )

Уншлага нь нэлээд авсаархан харагдаж байгаа боловч практикээс харахад (мөн миний нөхдийн зөвлөгөө) - "амт, өнгө, тэр ч байтугай эхнэр нь найз биш юм." Би маш олон зөвлөгөө, зөвлөмжийг сонссон боловч хоорондоо зөрчилддөг. Тиймээс үүнийг өөрийн үзэмжээр хий.

Загвар бол төслийн ихэнх цагийг шаарддаг хэсэг юм шиг надад санагдсан!

Нуугдсан текст

Өгөгдлийн нэг хэсэг нь дизайны зарим элементүүдийг харуулахын тулд бүтээгдсэн.

Дэлгэц дээрх олдворууд нь дэлгэц удаан хугацаанд хуримтлагдсан тоос шороо болон бусад шороо юм ... хаа нэгтээ ... би үүнийг хаанаас авснаа санахгүй байна! Намайг тайван орхи!

Ноорог нь байрлал тогтоох функцтэй. Тэд нэлээд анхдагч боловч тодорхой үр дүнд хүрэх боломжийг олгодог.

  1. x_center
  2. x_alignment_баруун

Эхнийх нь текстийг голд байрлуулж, хоёр дахь нь заасан бүсийн баруун талд зэрэгцүүлнэ. Бүх тооцооллыг илэрхийлэл дээр үндэслэн өгөгдсөн текстийн хэмжээтэй харьцуулан хийдэг 1 хэмжээ = 1PX x 1PXүсгийн сегмент.

Дэлгэц нь нэг буюу өөр унших утгын өсөлт, бууралттай харгалзах элементүүдийг харуулдаг. Тэдгээрийг гурвалжин хэлбэрээр харуулав. Гэхдээ функцийн кодонд өөрчлөлтүүд 45 градусаар эргүүлсэн гурвалжин хэлбэртэй өөр дэлгэц байдаг. Хэрэв уншилт дээшлэх юм бол элемент нь улаан, эс бөгөөс цэнхэр өнгөтэй байна.

Дашрамд хэлэхэд, үндсэн температурын өнгө, сүүдэр нь температураас хамаарч өөрчлөгддөг. Маш маргаантай шийдвэр, гэхдээ миний бодлоор харахад эвтэйхэн. Би үүнтэй хэсэг хугацаанд тэмцэж, функц дэх үнэ цэнэ гэдгийг ойлгосон цус харвалт, TFT дэлгэцийн объектыг буруу дарааллаар жагсаасан байна. BGRгазар RGB. Энэ бол хөгжүүлэгчийн алдаа, эсвэл би ямар нэг зүйлийг ойлгохгүй байна.

Жич: Бүх зүйл нэлээд сонирхолтой, гэхдээ миний бодлоор энэ нь цаашид хөгжих ёстой. Үүнийг бид хэсэг хугацааны дараа хийх болно.



Хуваалцах