поставил в код milis и он перестал работать :(
- Войдите на сайт для отправки комментариев
Чт, 20/05/2021 - 17:47
в MQTT с лишком большой поток сообщений, хотел паузу между публикациями сделать 10мин, вписал в код milis но не пойму где что обрезал, что температура теперь не считывается, другие сообщения приходят с интервалом 10 мин, а температуры только 0.00 если убираю обработку milis тогда всё востонавливается
uint32_t myTimer1; int period = 600000; // mqtt publication timer wait 10 minutes byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED }; IPAddress ip{192, 168, 1, 24}; IPAddress server{192, 168, 1, 240}; void callback(char* topic, byte* payload, unsigned int length); EthernetClient ethClient; PubSubClient client(server, 1883, callback, ethClient); #define ONE_WIRE_BUS 2 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); float temp1; float temp2; float temp3; byte sensor1[8] = {0x28, 0x88, 0xD9, 0x46, 0x92, 0x11, 0x02, 0xE2}; byte sensor2[8] = {0x28, 0xCC, 0xAF, 0x45, 0x92, 0x0C, 0x02, 0x57}; byte sensor3[8] = {0x28, 0x95, 0x03, 0x46, 0x92, 0x09, 0x02, 0x8A}; void callback(char* topic, byte* payload, unsigned int length){ byte* p = (byte*)malloc(length); memcpy(p, payload, length); client.publish("Boiler", p, length); free(p); } void setup(){ sensors.begin(); Ethernet.begin(mac, ip); pinMode(level,INPUT); //connect yellow wire from the sensor to pin 4 } void loop(){ sensors.requestTemperatures(); } if (millis() - myTimer1 >= period) { // eqv period myTimer1 += period; // reset timer if (client.connect("MDMClient")){ client.publish("Boiler/alarm", (buttonState == 0) ? "0" : "1"); client.publish("Boiler/level", (Liquid_level == 0) ? "0" : "1"); client.publish("Boiler/VK1", String(temp1).c_str()); // VK-1 client.publish("Boiler/VK2", String(temp2).c_str()); // VK-2 client.publish("Boiler/HK", String(temp3).c_str()); // HK delay(2000); client.disconnect(); } } } void printTemperature(DeviceAddress address){ float tempC = sensors.getTempC(address); if (address == sensor1){temp1 = tempC;} if (address == sensor2){temp2 = tempC;} if (address == sensor3){temp3 = tempC;} }
В строке #41 что стоит и зачем?
ewas
А я себе делал так: если какая-нибудь переменная изменилась, то только тогда её публикуем, а считывал датчики уже как мне удобно, раз в секунду или раз в минуту. И публиковал по очереди с задержкой 100+ миллисекунд delay-ем в loop. Но давно этот код писал, всё не соберусь переписать, работает и работает круглосуточно уже пару лет.
ewas,
давайте Вы выложите ИМЕННО ТОТ код, с которым у Вас проблемы. Не "похожий", не "я тут убрал неважное, чтобы сократить", не "ну, чё, всю портянку выкладывать", а ИМЕННО ТОТ.
Потому, что то, что Вы вложили попросту не компилируется, а потому, это абсолютно точно не тот код про который Вы писали
ewas
И оно компилируется?
ewas
И оно компилируется?
извините не весь мусор убрал. Одни скобки } оставил . теперь убрал.
Строка №8 - так не бывает. Число 600000 не поместится в переменную типа int. И компилятор Вам говорит об этом! У Вас его предупреждения выключены что-ли? Или Вы их не читаете?
Исправьте это, проверьте, потом будем дальше двигаться.
Да, кстати, какая ардуина?
В настойке IDE включить уровень уведомлений компилятора - "все".
поменял int на long (или надо на unsigned long ?) но лучше не стало. Всё же сообщение приходят на сервер через каждые10 мин, но температура 0.00 из всех датчиков. Как-то надо иначе с этим таймером.
пробовал вот такую конструкцию таймера, всё ровно ни чего
в 21 строке нужно timer = milis();
в 21 строке нужно timer = milis();
ewas
Где происходит чтение температуры?
ewas,
Вы вчера чего-то недопоняли.
пробовал вот такую конструкцию
Вы не могли её попробовать, т.к. она не компилируется.
Я Вам вчера писал, всегда выкладывайте ИМЕННО ТОТ код, который Вы пробовали. Ну, на каком языке мне ещё повторить?
В идеале, код нужно сократить, выбросить всё лишнее, но так, чтобы код оставался рабочим и проблема осталась. И этот код выложить. Но код должен быть рабочим! Если код рабочий, я могу запустить его у себя и посмотреть. Если он "как у Вас", то мне надо долго трахаться, разглядывая его и пытаясь угадать что там было ещё и что Вы выбросили. Т.е. выкладываете как можно более короткий, но полностью рабочий код из которого видна проблема.
Повторяю ещё раз - нужен именно тот код, ну вот прямо вот совсем тот самый с которым проблема! Больше повторять не буду - просто уйду из темы, трахайтесь сами.