Hab mal einen SI7021 Sensor Sketch für RFM69 und Batteriemonitor "gebastelt". Naja aus verschiedenen Quellen zusammen geklaut...;-) Eventuell kann's ja einer gebrauchen.
#define MY_DEBUG
#define MY_NODE_ID 104 // <<<<<<<<<<<<<<<<<<<<<<<<<<< Enter Node_ID
#define MY_RADIO_RFM69
#define MY_RFM69_FREQUENCY RFM69_868MHZ
#define MY_BAUD_RATE 38400
#include <MySensors.h>
#include <Wire.h>
#include <SI7021.h>
#include <SPI.h>
#include <RunningAverage.h>
//#define DEBUG
#ifdef MY_DEBUG
#define DEBUG_SERIAL(x) Serial.begin(x)
#define DEBUG_PRINT(x) Serial.print(x)
#define DEBUG_PRINTLN(x) Serial.println(x)
#else
#define DEBUG_SERIAL(x)
#define DEBUG_PRINT(x)
#define DEBUG_PRINTLN(x)
#endif
#define CHILD_ID_TEMP 0
#define CHILD_ID_HUM 1
#define VOLTAGE_CHILD_ID 3
//#define SLEEP_TIME 5000 // 5s for DEBUG
#define SLEEP_TIME 300000 // 5 min
#define FORCE_TRANSMIT_CYCLE 6 // 5min*12=1/hour, 5min*36=1/3hour
#define HUMI_TRANSMIT_THRESHOLD 3.0 // THRESHOLD tells how much the value should have changed since last time it was transmitted.
#define TEMP_TRANSMIT_THRESHOLD 0.5
#define AVERAGES 2
int measureCount = 0;
float lastTemperature = -100;
int lastHumidity = -100;
RunningAverage raHum(AVERAGES);
SI7021 humiditySensor;
MyMessage msgTemp(CHILD_ID_TEMP,V_TEMP); // Initialize temperature message
MyMessage msgHum(CHILD_ID_HUM,V_HUM);
MyMessage voltageMsg(VOLTAGE_CHILD_ID, V_VOLTAGE);
int BATTERY_SENSE_PIN = A0; // select the input pin for the battery sense point
int oldBatteryPcnt = 0;
float oldBatteryV = 0;
void presentation()
{
sendSketchInfo("SI7021-Powermonitor", "1.0 09.11.17");
present(CHILD_ID_TEMP, S_TEMP); // Present sensor to controller
present(CHILD_ID_HUM, S_HUM);
present(VOLTAGE_CHILD_ID, S_MULTIMETER);
// metric = getControllerConfig().isMetric;
analogReference(INTERNAL);
}
void setup() {
DEBUG_SERIAL(38400); // <<<<<<<<<<<<<<<<<<<<<<<<<< Note BAUD_RATE in MySensors.h
DEBUG_PRINTLN("Serial started");
delay(500); // Allow time for radio if power useed as reset
DEBUG_PRINT("Node and "); DEBUG_PRINTLN("3 children presented.");
raHum.clear();
}
void loop() {
measureCount ++;
bool forceTransmit = false;
if (measureCount > FORCE_TRANSMIT_CYCLE) {
forceTransmit = true;
}
sendTempHumidityMeasurements(forceTransmit);
/*
// Read and print internal temp
float temperature0 = static_cast<float>(static_cast<int>((GetInternalTemp()+0.5) * 10.)) / 10.;
DEBUG_PRINT("Internal Temp: "); DEBUG_PRINT(temperature0); DEBUG_PRINTLN(" *C");
*/
sleep(SLEEP_TIME);
}
/*********************************************
* * Sends temperature and humidity from Si7021 sensor
* Parameters
* - force : Forces transmission of a value (even if it's the same as previous measurement)
*********************************************/
void sendTempHumidityMeasurements(bool force) {
bool tx = force;
si7021_env data = humiditySensor.getHumidityAndTemperature();
float temperature = data.celsiusHundredths / 100.0;
DEBUG_PRINT("T: ");DEBUG_PRINTLN(temperature);
float diffTemp = abs(lastTemperature - temperature);
DEBUG_PRINT(F("TempDiff :"));DEBUG_PRINTLN(diffTemp);
if (diffTemp > TEMP_TRANSMIT_THRESHOLD || tx) {
send(msgTemp.set(temperature,1));
lastTemperature = temperature;
measureCount = 0;
DEBUG_PRINTLN("T sent!");
}
int humidity = data.humidityPercent;
DEBUG_PRINT("H: ");DEBUG_PRINTLN(humidity);
raHum.addValue(humidity);
humidity = raHum.getAverage(); // MA sample imply reasonable fast sample frequency
float diffHum = abs(lastHumidity - humidity);
DEBUG_PRINT(F("HumDiff :"));DEBUG_PRINTLN(diffHum);
if (diffHum > HUMI_TRANSMIT_THRESHOLD || tx) {
send(msgHum.set(humidity));
lastHumidity = humidity;
measureCount = 0;
DEBUG_PRINTLN("H sent!");
}
// get the battery Voltage
int sensorValue = analogRead(BATTERY_SENSE_PIN);
Serial.println(sensorValue);
// 1M, 470K divider across battery and using internal ADC ref of 1.1V
// Sense point is bypassed with 0.1 uF cap to reduce noise at that point
// ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts
// 3.44/1023 = Volts per bit = 0.003363075
float batteryV = sensorValue * 0.004106;
int batteryPcnt = sensorValue / 10;
Serial.print("Battery Voltage: ");
Serial.print(batteryV);
Serial.println(" V");
Serial.print("Battery percent: ");
Serial.print(batteryPcnt);
Serial.println(" %");
// Power up radio after sleep
sendBatteryLevel(batteryPcnt);
send(voltageMsg.set(batteryV,2));
oldBatteryPcnt = batteryPcnt;
oldBatteryV = batteryV;
}
Batteriespannung wird fix alle 5 Minuten übertragen (Sleeping time), Luftfeuchtigkeit und Temperatur wird nach Abhängigkeit der Größe der Änderung des letzten Wertes oder nach einer gewissen Anzahl der Messzyklen gesendet. Glaube als Reading kann man noch die Differenz HUM und TEMP seit der letzten Messung einrichten, hab ich aber nicht gemacht.
Gruß
Markus