Для данной реализации нам понадобится:
Arduino uno : http://ali.pub/1th4sk
Модуль на 4 реле: http://ali.pub/1xz018
Датчик температуры ds18b20: http://ali.pub/1xz072
Ну и дисплей Nextion: http://ali.pub/1xz0e2
Я покупал такой: http://ali.ski/zF01b
Прежде чем приступить к материалу, я Вас попрошу, если нравится то, что я делаю и хотите следить за моей деятельностью, то рекомендую подписаться на мой телеграмм канал: https://t.me/ypavla
Там я публикую новости о вышедших видео, статьях и разные устройства для умного дома и не только показываю.
Спасибо за внимание, теперь продолжим.
Давайте теперь немного расскажу о дисплеях, какие можно покупать, а какие не стоит.
При заказе дисплея Nextion Важно обратить внимание на версию, европейская или же китайская. Европейская работает с программой Nextion Editor, а китайская работает с аналогичной программой только она полностью на китайском языке и программы друг к другу не подходят.
Поэтому нужно обращать на это пристальное внимание. Ниже приведу фото маркировки дисплеев:
Вот европейская версия дисплея, здесь мы видим, что модель начинается на буквы NX.
Ну а на этом фото показана китайская версия, и ее модель начинается на буквы TJC, поэтому если вы не знаете китайский, обязательно обратите на это внимание.
Обычно китайская версия стоит подешевле, так что не попадитесь на это, как говорится скупой платит дважды, со мной так и получилось.
Ну чтож, не будем о грустном, давайте перейдем к нашему примеру.
А пример у Нас простой, выведем на дисплей 4 кнопки, для управления 4 рыле, и выведем значения с датчика ds18b20, а именно температуру.
Ниже в видео я подробно расскажу что и зачем нужно добавить и куда, чтоб пример получился.
А здесь вкратце в картинках покажу:
Это пример, как выглядит расположение всех элементов в программе Nextion Editor.
Скачать данный пример можно по ссылке: https://yadi.sk/d/lt9P6l093NzkKJ
После того как загрузили часть для дисплея, в наш дисплей, сделаем часть для Ардуино, в программе FLProg.
Как видим схема не очень большая, и все очень просто для повторения, для этого достаточно будет внимательно просмотреть мое видео ниже.
Ну и конечно оставлю ссылку для скачивания этой схемы: https://yadi.sk/d/sJN8LIKa3Nzm6N
Ну а кому лень качать программу FLProg я оставлю здесь уже готовый скетч сформированный этой программой:
#include <SoftwareSerial.h> #include <OneWire.h> byte _d18x2x1Addr[8]={0x28, 0xFF, 0xCC, 0x27, 0x64, 0x16, 0x4, 0xA1}; SoftwareSerial Serial100(2, 3); OneWire _ow5(5); String _nextionSaveDataTXT_P0_E5; struct _nextionLissenStruct{ char code; String result; long number; }; _nextionLissenStruct _nextionTempLissen; bool _changeNumber1_Out = 0; float _changeNumber1_OLV; bool _nextionGetValue2_outputValue; long _nextionGetValue2_StartTime; bool _nextionGetValue2_isNU = 0; bool _nextionGetValue4_outputValue; long _nextionGetValue4_StartTime; bool _nextionGetValue4_isNU = 0; bool _nextionSetAttr1_isNU = 0; bool _nextionSetAttr1_oldState = 0; unsigned long _d18x2x1Tti = 0UL; float _d18x2x1O = 0.00; bool _nextionGetValue3_outputValue; long _nextionGetValue3_StartTime; bool _nextionGetValue3_isNU = 0; bool _nextionGetValue1_outputValue; long _nextionGetValue1_StartTime; bool _nextionGetValue1_isNU = 0; void setup() { Serial100.begin(9600); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(12, OUTPUT); nextionSendCommand("", 100); nextionSendCommand("page 0", 100); _nextionGetValue1_StartTime = millis(); _nextionGetValue2_StartTime = millis(); _nextionGetValue3_StartTime = millis(); _nextionGetValue4_StartTime = millis(); } void loop() {float _tempVariable_float; String _tempVariable_String; //Плата:1 if(_isTimer(_d18x2x1Tti, 1000)) { _d18x2x1Tti = millis(); _d18x2x1O= _readDS18_ow5(_d18x2x1Addr, 0);} if(_isTimer(_nextionGetValue1_StartTime, 1000)){ _nextionGetValue1_StartTime = millis(); _nextionGetValue1_isNU = 1; } if(_nextionGetValue1_isNU){_tempVariable_String = "get page0.bt0.val"; _nextionTempLissen = nextionSendCommand(_tempVariable_String.c_str(), 100); if(_nextionTempLissen.code = 'q') {_nextionGetValue1_outputValue = _nextionTempLissen.number;}; _nextionGetValue1_isNU = 0;} digitalWrite(9, !(_nextionGetValue1_outputValue)); if(_isTimer(_nextionGetValue2_StartTime, 1000)){ _nextionGetValue2_StartTime = millis(); _nextionGetValue2_isNU = 1; } if(_nextionGetValue2_isNU){_tempVariable_String = "get page0.bt1.val"; _nextionTempLissen = nextionSendCommand(_tempVariable_String.c_str(), 100); if(_nextionTempLissen.code = 'q') {_nextionGetValue2_outputValue = _nextionTempLissen.number;}; _nextionGetValue2_isNU = 0;} digitalWrite(10, !(_nextionGetValue2_outputValue)); digitalWrite(11, !(_nextionGetValue3_outputValue)); if(_isTimer(_nextionGetValue3_StartTime, 1000)){ _nextionGetValue3_StartTime = millis(); _nextionGetValue3_isNU = 1; } if(_nextionGetValue3_isNU){_tempVariable_String = "get page0.bt2.val"; _nextionTempLissen = nextionSendCommand(_tempVariable_String.c_str(), 100); if(_nextionTempLissen.code = 'q') {_nextionGetValue3_outputValue = _nextionTempLissen.number;}; _nextionGetValue3_isNU = 0;} digitalWrite(12, !(_nextionGetValue4_outputValue)); if(_isTimer(_nextionGetValue4_StartTime, 1000)){ _nextionGetValue4_StartTime = millis(); _nextionGetValue4_isNU = 1; } if (nextionAskPageNamper(100) == 0) {if(_nextionGetValue4_isNU){_tempVariable_String = "get page0.bt3.val"; _nextionTempLissen = nextionSendCommand(_tempVariable_String.c_str(), 100); if(_nextionTempLissen.code = 'q') {_nextionGetValue4_outputValue = _nextionTempLissen.number;}; _nextionGetValue4_isNU = 0;}}else {_nextionGetValue4_isNU = 0;} if (_changeNumber1_Out) {_changeNumber1_Out = 0;} else {_tempVariable_float = (_d18x2x1O); if (_tempVariable_float != _changeNumber1_OLV) {_changeNumber1_OLV = _tempVariable_float; _changeNumber1_Out = 1;} } if (_changeNumber1_Out) { if (! _nextionSetAttr1_oldState ) {_nextionSetAttr1_oldState = 1; _nextionSetAttr1_isNU = 1; _nextionSaveDataTXT_P0_E5 = ( _floatToStringWitRaz((_d18x2x1O),2)) ;}} else {_nextionSetAttr1_oldState = 0;}if (_nextionSetAttr1_isNU) {_tempVariable_String = String("page0.t0.txt=\"") +_nextionSaveDataTXT_P0_E5 +String("\""); nextionSendCommand(_tempVariable_String.c_str(), 100); _nextionSetAttr1_isNU = 0; } } String _floatToStringWitRaz(float value, int raz) { return String(value,raz); } 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_ow5(byte addr[8], byte type_s) { byte data[12]; byte i; _ow5.reset(); _ow5.select(addr); _ow5.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = _ow5.read();} _ow5.reset(); _ow5.select(addr); _ow5.write(0x44, 1); return _convertDS18x2xData(type_s, data);}struct _nextionLissenStruct nextionSendCommand(const char* cmd, byte port ) { while (Serial100.available()){Serial100.read(); } Serial100.print(cmd); Serial100.write(0xFF); Serial100.write(0xFF); Serial100.write(0xFF); return nextionListen(port); } struct _nextionLissenStruct nextionListen( byte port ) { byte _bite; byte _end = 0xff; byte cmd[100]; int index = 0; _nextionLissenStruct temp; temp.result = ""; temp.code = 'z'; temp.number = 0; int countEnd = 0; delay(50); long startTime = millis(); while(! (countEnd==3)) { while(Serial100.available()>0){ if(Serial100.available()>0){ _bite = Serial100.read(); cmd[index] = _bite; index++; if(_bite == _end){countEnd++;} if(countEnd == 3){break;} }} if(_isTimer(startTime, 100)) {return temp;} } switch (cmd[0]) { case 0x66: temp.code = 'f'; temp.result = String(cmd[1], DEC); return temp; break; case 0x70: temp.code = 'p'; for (int i = 1; i < index - 3; i++) { temp.result += char(cmd[i]);} return temp; break; case 0x71: temp.code = 'q'; temp.number = (cmd[4] << 24) | (cmd[3] << 16) | (cmd[2] << 8) | (cmd[1]); return temp; break; default: return temp; break; } return temp; } int nextionAskPageNamper(byte port) { int result; _nextionLissenStruct temp; temp = nextionSendCommand("sendme",port); if((temp.code == 'f')&&(temp.result != "")){result = temp.result.toInt();} else {result = -1;} return result; }
Ах да, совсем забыл схему подключения. Ну давайте я ее опишу, рисовать мне лень.
Реле мы подключаем к 9,10,11,12 пинам ардуино.
Датчик ds18b20 подключаем к 5 пину Ардуино.
Ну и сам дисплей мы подключаем так: Rx дисплея подключаем к 3 пину Ардуино.
А Tx Дисплея к 2 пину Arduino.
Ну и подробнейшее видео, по которому Вы и без схемы все подключите и все заработает: