/*
* Raumthermostat RS485 Modbus
* 4 Holding Register
* Version 0.1 für HW Version 0.0.0.1
*
* Register 0 = Temperatur * 10
* Register 1 = Luftfeuchte * 10
* Register 2 = Update Interval SHT31
* Register 3 = LED ein / aus
*
*/
//Includes & Defines
#include <Adafruit_SHT31.h>
#include <Wire.h>
#include <SimpleModbusSlave.h>
#define ledPin 12
//Sensor deklarieren
Adafruit_SHT31 sht31 = Adafruit_SHT31();
//Deklarationen
boolean value = LOW; // Startwert der LED
unsigned long previousMillis = 0; // speichert wie viele Sekunden seit derletzten Änderung vergangen sind
unsigned long interval = 10000; // Interval zwischen zwei Änderungen
//Register deklarieren
enum
{
temp,
humidity,
timer_interval,
led,
TOTAL_ERRORS,
// leave this one
TOTAL_REGS_SIZE
// total number of registers for function 3 and 16 share the same register array
};
unsigned int holdingRegs[TOTAL_REGS_SIZE]; // function 3 and 16 register array
//Setup
void setup()
{
modbus_configure(9600, 1, 4, TOTAL_REGS_SIZE, 0);
pinMode(ledPin, OUTPUT);
sht31.begin(0x44);
}
//Hauptprogramm
void loop()
{
holdingRegs[TOTAL_ERRORS] = modbus_update(holdingRegs);
//holdingRegs[TOTAL_REGS_SIZE] = TOTAL_REGS_SIZE;
//Abfrage ob Interval Wert über Modbus eingestellt wurde. Minimaler Interval ist 10s
if (holdingRegs[2] < 10000)
{
holdingRegs[2]=10000;
interval = 10000;
}
else
{
interval = holdingRegs[2];
}
//Interval für Abfrage von SHT31 Sensor
if (millis() - previousMillis > interval)
{
previousMillis = millis(); // aktuelle Zeit abspeichern
// LED Zustand wecheln.
value = !value;
// Wert auf den Ausgang schreiben
digitalWrite(ledPin, value);
holdingRegs[0] = sht31.readTemperature()*10;
holdingRegs[1] = sht31.readHumidity()*10;
}
//Regsiter 4 für LED einschalten
if (holdingRegs[3]==0)
{
digitalWrite(13,LOW);
}
else
{
digitalWrite(13,HIGH);
}
}
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?