поставил в код milis и он перестал работать :(

ewas
Offline
Зарегистрирован: 26.09.2016
 
в 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;}
}

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

В строке #41 что стоит и зачем?

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

ewas

А я себе делал так: если какая-нибудь переменная изменилась, то только тогда её публикуем, а считывал датчики уже как мне удобно, раз в секунду или раз в минуту. И публиковал по очереди с задержкой 100+ миллисекунд delay-ем в loop. Но давно этот код писал, всё не соберусь переписать, работает и работает круглосуточно уже пару лет.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ewas,

давайте Вы выложите ИМЕННО ТОТ код, с которым у Вас проблемы. Не "похожий", не "я тут убрал неважное, чтобы сократить", не "ну, чё, всю портянку выкладывать", а ИМЕННО ТОТ.

Потому, что то, что Вы вложили попросту не компилируется, а потому, это абсолютно точно не тот код про который Вы писали

ewas пишет:
другие сообщения приходят с интервалом 10 мин, а температуры только 0.00

ewas
Offline
Зарегистрирован: 26.09.2016
иногда как раз не любят полный код, мол чего там копаться в твоём ведре.
Вот код

#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;}   
}

 

Feofan
Offline
Зарегистрирован: 28.05.2017

ewas
И оно компилируется?

ewas
Offline
Зарегистрирован: 26.09.2016

Feofan пишет:

ewas
И оно компилируется?

извините не весь мусор убрал. Одни скобки } оставил . теперь убрал.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Строка №8 - так не бывает. Число 600000 не поместится в переменную типа int. И компилятор Вам говорит об этом! У Вас его предупреждения выключены что-ли? Или Вы их не читаете?

Исправьте это, проверьте, потом будем дальше двигаться.

Да, кстати, какая ардуина?

ewas
Offline
Зарегистрирован: 26.09.2016
Ардуина такая  Arduino pro mini Atmega 32 5V 16MHz
 
Сообщение такое:
 
Sketch uses 15342 bytes (49%) of program storage space. Maximum is 30720 bytes.
Global variables use 561 bytes (27%) of dynamic memory, leaving 1487 bytes for local variables. Maximum is 2048 bytes.
sadman41
Offline
Зарегистрирован: 19.10.2016

В настойке IDE включить уровень уведомлений компилятора - "все".

ewas
Offline
Зарегистрирован: 26.09.2016

поменял 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;
  }
}

 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

в 21 строке нужно timer = milis();

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

v258 пишет:

в 21 строке нужно timer = milis();

Это на основании чего так?

Feofan
Offline
Зарегистрирован: 28.05.2017

ewas
Где происходит чтение температуры?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ewas,

Вы вчера чего-то недопоняли.

ewas пишет:

пробовал вот такую конструкцию 

Вы не могли её попробовать, т.к. она не компилируется.

Я Вам вчера писал, всегда выкладывайте ИМЕННО ТОТ код, который Вы пробовали. Ну, на каком языке мне ещё повторить?

В идеале, код нужно сократить, выбросить всё лишнее, но так, чтобы код оставался рабочим и проблема осталась. И этот код выложить. Но код должен быть рабочим! Если код рабочий, я могу запустить его у себя и посмотреть. Если он "как у Вас", то мне надо долго трахаться, разглядывая его и пытаясь угадать что там было ещё и что Вы выбросили. Т.е. выкладываете как можно более короткий, но полностью рабочий код из которого видна проблема.

Повторяю ещё раз  - нужен именно тот код, ну вот прямо вот совсем тот самый с которым проблема! Больше повторять не буду - просто уйду из темы, трахайтесь сами.