поставил в код 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,
давайте Вы выложите ИМЕННО ТОТ код, с которым у Вас проблемы. Не "похожий", не "я тут убрал неважное, чтобы сократить", не "ну, чё, всю портянку выкладывать", а ИМЕННО ТОТ.
Потому, что то, что Вы вложили попросту не компилируется, а потому, это абсолютно точно не тот код про который Вы писали
#include <SPI.h> #include <Ethernet2.h> #include <PubSubClient.h> #include <OneWire.h> #include <DallasTemperature.h> 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); const int ledPin = 3; // the number of the LED pin const int level = 4; //level to arduino pin const int buzzer = 5; //buzzer to arduino pin 9 const int buttonPin = 6; // the number of the alarm relay pin int buttonState = 0; // variable for reading the pushbutton status bool Boiler_alarm = 0; bool Liquid_level = 0; float temp1; float temp2; float temp3; float temp4; float temp5; float temp6; float temp7; byte sensor1[8] = {0x28, 0x88, 0xD9, 0x46, 0x92, 0x11, 0x02, 0xE2}; // VK1 vertical collector byte sensor2[8] = {0x28, 0xCC, 0xAF, 0x45, 0x92, 0x0C, 0x02, 0x57}; // VK2 vertical collector byte sensor3[8] = {0x28, 0x95, 0x03, 0x46, 0x92, 0x09, 0x02, 0x8A}; // HK horizontal collector byte sensor4[8] = {0x28, 0x04, 0x2B, 0x46, 0x92, 0x05, 0x02, 0x87}; // GG geotehrmal back byte sensor5[8] = {0x28, 0x76, 0x7F, 0x53, 0x2D, 0x19, 0x01, 0xE2}; // KP hot water out byte sensor6[8] = {0x28, 0x18, 0xF0, 0x3C, 0x2D, 0x19, 0x01, 0x9C}; // TP heating water out byte sensor7[8] = {0x28, 0xB0, 0x87, 0x70, 0x2D, 0x19, 0x01, 0xAF}; // TG heating water back //------------------------------------------------------------------------------------ void callback(char* topic, byte* payload, unsigned int length){ // Выделяем необходимое кол-во памяти для копии payload byte* p = (byte*)malloc(length); // Копирование payload в новый буфер 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 pinMode(buzzer, OUTPUT); // Set buzzer - pin 3 as an output pinMode(ledPin, OUTPUT); // initialize the LED pin as an output pinMode(buttonPin, INPUT); // initialize the pushbutton pin as an input } void loop(){ sensors.requestTemperatures(); Liquid_level = digitalRead(level); buttonState = digitalRead(buttonPin); // read the state of the pushbutton value //-------ALARM RELAY--------------------------------------------------------------------- if (buttonState == HIGH) { // check if the Alarm Relay status in "ALARM" is HIGH // turn LED on: digitalWrite(ledPin, HIGH); tone(buzzer, 1000); // Send 1KHz sound signal... delay(400); // ...for 1 sec digitalWrite(ledPin, LOW); noTone(buzzer); // Stop sound... } else { // turn LED off: digitalWrite(ledPin, LOW); } //--------LIQUID ALARM------------------------------- if (Liquid_level == 0){ // turn LED on: digitalWrite(ledPin, HIGH); tone(buzzer, 1000); // Send 1KHz sound signal... delay(400); noTone(buzzer); // Stop sound... digitalWrite(ledPin, LOW); }else { // turn LED off: digitalWrite(ledPin, LOW); } //---------------------------------------------------- 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 client.publish("Boiler/GR", String(temp4).c_str()); // GG geotehrmal back client.publish("Boiler/KVP", String(temp5).c_str()); // KVP hot water feed client.publish("Boiler/TP", String(temp6).c_str()); // TP heating water feed client.publish("Boiler/TG", String(temp7).c_str()); // TG heating water back 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;} if (address == sensor4){temp4 = tempC;} if (address == sensor5){temp5 = tempC;} if (address == sensor6){temp6 = tempC;} if (address == sensor7){temp7 = tempC;} }ewas
И оно компилируется?
ewas
И оно компилируется?
извините не весь мусор убрал. Одни скобки } оставил . теперь убрал.
Строка №8 - так не бывает. Число 600000 не поместится в переменную типа int. И компилятор Вам говорит об этом! У Вас его предупреждения выключены что-ли? Или Вы их не читаете?
Исправьте это, проверьте, потом будем дальше двигаться.
Да, кстати, какая ардуина?
В настойке IDE включить уровень уведомлений компилятора - "все".
поменял int на long (или надо на unsigned long ?) но лучше не стало. Всё же сообщение приходят на сервер через каждые10 мин, но температура 0.00 из всех датчиков. Как-то надо иначе с этим таймером.
пробовал вот такую конструкцию таймера, всё ровно ни чего
#define period 600000 uint32_t timer = 0; void loop() { if (millis() - timer >= period) { 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 client.publish("Boiler/GR", String(temp4).c_str()); // GG geotehrmal back client.publish("Boiler/KVP", String(temp5).c_str()); // KVP hot water feed client.publish("Boiler/TP", String(temp6).c_str()); // TP heating water out client.publish("Boiler/TG", String(temp7).c_str()); // TG heating water feed delay(2000); client.disconnect(); timer += period; } }в 21 строке нужно timer = milis();
в 21 строке нужно timer = milis();
ewas
Где происходит чтение температуры?
ewas,
Вы вчера чего-то недопоняли.
пробовал вот такую конструкцию
Вы не могли её попробовать, т.к. она не компилируется.
Я Вам вчера писал, всегда выкладывайте ИМЕННО ТОТ код, который Вы пробовали. Ну, на каком языке мне ещё повторить?
В идеале, код нужно сократить, выбросить всё лишнее, но так, чтобы код оставался рабочим и проблема осталась. И этот код выложить. Но код должен быть рабочим! Если код рабочий, я могу запустить его у себя и посмотреть. Если он "как у Вас", то мне надо долго трахаться, разглядывая его и пытаясь угадать что там было ещё и что Вы выбросили. Т.е. выкладываете как можно более короткий, но полностью рабочий код из которого видна проблема.
Повторяю ещё раз - нужен именно тот код, ну вот прямо вот совсем тот самый с которым проблема! Больше повторять не буду - просто уйду из темы, трахайтесь сами.