Главная › Форумы › Конструкторское бюро › Автоматизация › D18B20, Arduino, MODBUS, Master SCADA › Ответ в теме: D18B20, Arduino, MODBUS, Master SCADA
Уже давно сделал, сегодня выложу на 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();
…
}