Для данного проекта нам понадобится:
Приемник и передатчик на 433МГц в количестве 2 шт. http://ali.pub/1joehv
Arduino uno http://ali.pub/1joeoa
Arduino Mega http://ali.pub/1joeqf
Arduino nano http://ali.pub/1joes6
BME 280 http://ali.pub/1joewn
BMP180 http://ali.pub/1joey7
DS18b20 http://ali.pub/1jof0j
LCD nokia 5110 http://ali.pub/1jof7c
Прежде чем приступить к материалу, я Вас попрошу, если нравится то, что я делаю и хотите следить за моей деятельностью, то рекомендую подписаться на мой телеграмм канал: https://t.me/ypavla
Там я публикую новости о вышедших видео, статьях и разные устройства для умного дома и не только показываю.
Спасибо за внимание, теперь продолжим.
Давайте для начала рассмотрим схему подключения приемника
Из данной схемы видно какой пин датчиков к какому пину ардуино подключен.
В FLProg данная схема выглядит вот таким образом:
Ниже в видео в конце этой статьи я подробно рассказываю, какой блок для чего служит в данной схеме.
Скетч приемника:
#include <Adafruit_Sensor.h> #include <VirtualWire.h> #include <Adafruit_BME280.h> #include <SPI.h> #include <EasyTransferVirtualWire.h> #include <LCD5110_Graph.h> int out1; int out2; int out3; int out4; EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE{ //Struct can'e be bigger then 26 bytes for VirtualWire version int data1; int data2; int data3; int data4; }; //give a name to the group of data SEND_DATA_STRUCTURE mydata; LCD5110 myGLCD(8,9,10,11,12); extern uint8_t TinyFont[]; // Объявление трех внешних extern uint8_t SmallFont[]; // массивов символов extern uint8_t BigNumbers[]; bool en_str_214990099_1; String in_str_214990099_1; bool en_str_214990099_2; String in_str_214990099_2; bool en_str_214990099_3; String in_str_214990099_3; float Temperature_168723051_1; float Pressure_168723051_1; float Altitude_168723051_1; float Humidity_168723051_1; #define BME_SCK_168723051_1 13 #define BME_MISO_168723051_1 12 #define BME_MOSI_168723051_1 11 #define BME_CS_168723051_1 10 #define SEALEVELPRESSURE_HPA_168723051_1 (1013.25) Adafruit_BME280 bme_168723051_1; // I2C bool en_str_214990099_4; String in_str_214990099_4; void setup() { ET.begin(details(mydata)); vw_set_rx_pin(4); vw_set_ptt_inverted(true); // Required for DR3100 vw_setup(2000); vw_rx_start(); // Start the receiver PLL running if ( 1 ) { pinMode(13, OUTPUT); } randomSeed(analogRead(0)); myGLCD.InitLCD(); myGLCD.setContrast (60); // установка контраста if (!bme_168723051_1.begin()) { Serial.println("Could not find a valid BME280 sensor, check wiring!"); while (1); } } void loop() { myGLCD.update(); delay (100); // Задержка 0.1 с myGLCD.clrScr(); // Очистка экрана en_str_214990099_1 = 1; in_str_214990099_1 = ((String("Zal ")) + ((String(out1, DEC)))); if (en_str_214990099_1==1) { myGLCD.setFont(SmallFont); myGLCD.print(in_str_214990099_1, 0, 10); } //check and see if a data packet has come in. if(ET.receiveData()){ if ( 1 ) { digitalWrite(13, HIGH); } out1 = mydata.data1; out2 = mydata.data2; out3 = mydata.data3; out4 = mydata.data4; if ( 1 ) { digitalWrite(13, LOW); } } //you should make this delay shorter then your transmit delay or else messages could be lost delay(250); en_str_214990099_2 = 1; in_str_214990099_2 = ((String("spalnya ")) + ((String(out2, DEC)))); if (en_str_214990099_2==1) { myGLCD.setFont(SmallFont); myGLCD.print(in_str_214990099_2, 0, 20); } en_str_214990099_3 = 1; in_str_214990099_3 = ((String("kuhnya ")) + (( _floatToStringWitRaz(Temperature_168723051_1,2)))); if (en_str_214990099_3==1) { myGLCD.setFont(SmallFont); myGLCD.print(in_str_214990099_3, 0, 30); } Temperature_168723051_1 = bme_168723051_1.readTemperature(); Pressure_168723051_1 = bme_168723051_1.readPressure() / 100.0F * 0.7500; Altitude_168723051_1 = bme_168723051_1.readAltitude(SEALEVELPRESSURE_HPA_168723051_1); Humidity_168723051_1 = bme_168723051_1.readHumidity(); en_str_214990099_4 = 1; in_str_214990099_4 = String("METEOSTATION"); if (en_str_214990099_4==1) { myGLCD.setFont(SmallFont); myGLCD.print(in_str_214990099_4, 5, 0); } } String _floatToStringWitRaz(float value, int raz) { return String(value,raz); }
Ссылка на проект в FLProg: https://yadi.sk/d/xaPb9cJv3JyG9p
Модуль LCD 5110 : https://yadi.sk/d/wxYROnHtvwjFE
Модуль BME 280: https://yadi.sk/d/V-yyGBC8vwjMp
Модуль приемника и передатчика 433МГц: https://yadi.sk/d/rgQ1TDXl3JyGPR
Теперь давайте рассмотрим схему подключения передатчика на DS18b20:
Из схемы видно что куда подключается.
Ссылка проект: https://yadi.sk/d/12b0tZG63JyGwK
#include <OneWire.h> #include <EasyTransferVirtualWire.h> #include <VirtualWire.h> byte _d18x2x1Addr[8]={0x28, 0xFF, 0xCC, 0x27, 0x64, 0x16, 0x4, 0xA1}; OneWire _ow2(2); bool in1; float in2; int in3; int in4; EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE{ //Struct can'e be bigger then 26 bytes for VirtualWire version int data1; int data2; int data3; int data4; }; //give a name to the group of data SEND_DATA_STRUCTURE mydata; unsigned long _d18x2x1Tti = 0UL; float _d18x2x1O = 0.00; void setup() { ET.begin(details(mydata)); vw_set_tx_pin(12); //установка пина, к которому подключен data-вход передатчика vw_set_ptt_inverted(true); // Required for DR3100 vw_setup(2000); if ( 1 ) { pinMode(13, OUTPUT); } randomSeed(analogRead(0)); } void loop() { in1 = 0; in2 = (_d18x2x1O); in3 = 0; in4 = 0; mydata.data1 = in1; mydata.data2 = in2; mydata.data3 = in3; mydata.data4 = in4; if ( 1 ) { digitalWrite(13, HIGH); } ET.sendData(); if ( 1 ) { digitalWrite(13, LOW); } delay(1000); if(_isTimer(_d18x2x1Tti, 1000)) { _d18x2x1Tti = millis(); _d18x2x1O= _readDS18_ow2(_d18x2x1Addr, 0);} } bool _isTimer(unsigned long startTime, unsigned long period ) { unsigned long currentTime; currentTime = millis(); if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));} } float _convertDS18x2xData(byte type_s, byte data[12]) { int16_t raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw & ~7; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1; } return (float)raw / 16.0; } float _readDS18_ow2(byte addr[8], byte type_s) { byte data[12]; byte i; _ow2.reset(); _ow2.select(addr); _ow2.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = _ow2.read();} _ow2.reset(); _ow2.select(addr); _ow2.write(0x44, 1); return _convertDS18x2xData(type_s, data);}
Ну и схема передатчика на BMP180:
В схеме также показано какой пин куда подключается.
Ссылка на проект: https://yadi.sk/d/6iRGWq-z3JyHPG
#include <Wire.h> #include <EasyTransferVirtualWire.h> #include <VirtualWire.h> #include <BMP085.h> BMP085 _bmp085 = BMP085(); long _bmp085T = 0; int in1; int in2; int in3; int in4; EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE{ //Struct can'e be bigger then 26 bytes for VirtualWire version int data1; int data2; int data3; int data4; }; //give a name to the group of data SEND_DATA_STRUCTURE mydata; unsigned long _bmp0851Tti = 0UL; void setup() { Wire.begin(); _bmp085.init(); ET.begin(details(mydata)); vw_set_tx_pin(12); //установка пина, к которому подключен data-вход передатчика vw_set_ptt_inverted(true); // Required for DR3100 vw_setup(2000); if ( 1 ) { pinMode(13, OUTPUT); } randomSeed(analogRead(0)); } void loop() {if(_isTimer(_bmp0851Tti, 1000)) { _bmp0851Tti = millis(); _bmp085.getTemperature(&_bmp085T); } in1 = (_bmp085T)/(10); in2 = 0; in3 = 0; in4 = 0; mydata.data1 = in1; mydata.data2 = in2; mydata.data3 = in3; mydata.data4 = in4; if ( 1 ) { digitalWrite(13, HIGH); } ET.sendData(); if ( 1 ) { digitalWrite(13, LOW); } delay(1000); } bool _isTimer(unsigned long startTime, unsigned long period ) { unsigned long currentTime; currentTime = millis(); if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));} }
Демонстрация работы данной программы можно увидеть в видео приведенном в конце статьи.
Видео: