Ответ в теме: D18B20, Arduino, MODBUS, Master SCADA

Главная Форумы Конструкторское бюро Автоматизация D18B20, Arduino, MODBUS, Master SCADA Ответ в теме: D18B20, Arduino, MODBUS, Master SCADA

#15607
Nick
Участник
  • Ответов: 25
@nmakarov

Уже давно сделал, сегодня выложу на 5 датчиков.

Очень хочется посмотреть.

Отлично, я как раз сегодня планировал на millis () код переделывать

В нашем случае хорошо подойдет а-ля async, что-то вроде такого (не нашел класс для 18В20, под руку подвернулся для BMP085, но идея там та же) :

// общий предок
class Worker {
protected:
unsigned long lastUpdate;
int interval;
public:
void setup(int pInterval) {
interval = pInterval;
}
void tick() {
if ( (millis() – lastUpdate) > interval ) {
lastUpdate = millis();
execute();
}
}
virtual void execute() {
Serial.println(“worker tick ” + (String)lastUpdate);
}
};

class BMP085 : public Worker {
private:
Adafruit_BMP085_Unified bmp;
float temperature;
float pressure;
public:
void setup() {
Worker::setup(250);
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);
if( ! bmp.begin()) {
Serial.print(“No BMP085 detected, wires or I2C addr problems. Halt.”);
while(1);
}
// take the three consecutive measurements for averaging:
execute();
execute();
execute();
}
virtual void execute() {
sensors_event_t event;
bmp.getEvent(&event);
if (event.pressure) {
bmp.getTemperature(&temperature);
// hPa and C:
pressure = event.pressure;
}
}
virtual String toString() {
return “Temperature/Pressure: ” + (String)temperature + ” / ” + (String)pressure;
}
float getTemperature() {
return temperature;
}
float getPressure() {
return pressure;
}
};

BMP085 bmp085;

void setup() {
Serial.begin(115200);
bmp085.setup();

}

void loop() {
bmp085.tick();

}