Verschiedenes > MySensors

Fundgrube - Interessante Sketche und Lösungsansätze

(1/2) > >>

Beta-User:
Ziel dieses Threads soll sein, gute Sketche (bzw. manchmal auch nur Lösungsansätze) zu teilen.

Vorab: Einfach mal alle "offiziellen" Beispiele in Ruhe durchzusehen, lohnt sich, da sind m.E. die Grundbausteine für alle möglichen Dinge vorhanden, die Schwierigkeit ist oft nur, diese sinnvoll zu kombinieren. Für einen ersten Einstieg in "kombinierte" Sensoren würde ich den "offiziellen" BMP180-Sketch empfehlen.

Postings hier können einfach nur Links sein, ein kleiner Kommentar wäre aber natürlich willkommen ;) .

Have fun!

Beispiel 1:
Bed Occupancy Sensor
(ist zwar noch 1.5-er Version), aber eine lustige Idee. Man kann daraus vermutlich auch einen Touch-Input mit bis zu 12 Flächen machen.
Es wird gezeigt, wie man interne Logik aufbaut und die erhaltene und verdichtete Info dann an den Controller sendet.

Beispiel 2:
Multi-Button-Relay Sketch
Schönes Beispiel mit Einsatz von Array-Funktionen, um Beschränkungen des Hardware-Designs elegant zu umgehen und dabei code zu sparen.

Beispiel 3:
Kühl- und Gefrierscharanküberwachung
Noch mehr Arrays und eine mögliche Antwort auf die Frage, wie man 1-Wire DS18B20 zuverlässig an eine ChildID binden kann.

Beta-User:
Doppelgaragentoröffner von SensorMane - einschließlich der Darstellung in FHEMWEB mittel readingsGroup.
Lichtschalter (Taster mit 12V MOSFET), der auch ohne Verbindung zum GW startet und regelmäßig den Status mit dem Controller abgleicht (Aktualisierung nach Verbindungsverlust).

Beta-User:
(Untested:) Tester-Node für nRF-Chips mit LCD-Anzeige

Es darf ruhig auch jemand anderes sowas hier verlinken, insbesondere, wenn er es selbst getestet hat ;) ).

Ergänzender Hinweis: Lt. Berichten auf der MySensors.org-Seite gibt es bei den Modulen teilweise erhebliche Serienstreuungen. Will heißen: Auch wenn man eine Platine mit mehreren zusammenhängenden nRF-Modulen bekommt, darf man leider nicht davon ausgehen, dass alle gleich gut (oder schlecht) funktionieren  >:( . (Jedenfalls, wenn es keine "Blob"-Module sind, die sind zuverlässig schlecht  ::) ).
Testen macht also tatsächlich Sinn (wenn man Zeit dafür hat oder sie sich nimmt, weil man die nicht in Fehlersuche investieren will).

Edit: Hier gibts was ähnliches für RFM69: Tester-Node

Markus.:
Hab mal einen SI7021 Sensor Sketch für RFM69 und Batteriemonitor "gebastelt". Naja aus verschiedenen Quellen zusammen geklaut...;-) Eventuell kann's ja einer gebrauchen.


--- Code: ---#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;
 

}





--- Ende Code ---

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

Ranseyer:
Der Node-Manager sieht auch nicht schlecht aus: https://www.mysensors.org/download/node-manager
Hab ich zwar noch nie genutzt, hört sich aber easy an...


--- Zitat ---NodeManager is intended to take care on your behalf of all those common tasks a MySensors node has to accomplish, speeding up the development cycle of your projects.

NodeManager includes the following main components:

Sleep manager: allows managing automatically the complexity behind battery-powered sensors spending most of their time sleeping
Power manager: allows powering on your sensors only while the node is awake
Battery manager: provides common functionalities to read and report the battery level
Remote configuration: allows configuring remotely the node without the need to have physical access to it
Built-in sensors: for the most common sensors, provide embedded code so to allow their configuration with a single line

Features
Manage all the aspects of a sleeping cycle by leveraging smart sleep
Allow configuring the node and any attached sensors remotely
Allow waking up a sleeping node remotely at the end of a sleeping cycle
Allow powering on each connected sensor only while the node is awake to save battery
Report battery level periodically and automatically or on demand
Report signal level periodically and automatically or on demand
Calculate battery level without requiring an additional pin and the resistors
Allow rebooting the board remotely
Provide out-of-the-box sensors personalities and automatically execute their main task at each cycle
Allow collecting and averaging multiple samples, tracking the last value and forcing periodic updates for any sensor
Provide buil-in capabilities to handle interrupt-based sensors
--- Ende Zitat ---

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln