Autor Thema: Fundgrube - Interessante Sketche und Lösungsansätze  (Gelesen 3710 mal)

Offline Beta-User

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 7325
  • eigentlich eher user wie "developer"
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.
« Letzte Änderung: 26 Juli 2017, 14:08:40 von Beta-User »
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM@VCCU | MySensors: seriell, v.a. 2.3.1@RS485 | MQTT2: MiLight@ESP-GW | SIGNALduino | MapleCUN | ZWave | HUE@deCONZ@docker
svn:MySensors, WeekdayTimer, AttrTemplate => {mqtt2, mysensors, httpmod}

Offline Beta-User

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 7325
  • eigentlich eher user wie "developer"
Antw:Fundgrube - Interessante Sketche und Lösungsansätze
« Antwort #1 am: 06 August 2017, 16:22:34 »
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).
« Letzte Änderung: 10 August 2017, 13:11:26 von Beta-User »
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM@VCCU | MySensors: seriell, v.a. 2.3.1@RS485 | MQTT2: MiLight@ESP-GW | SIGNALduino | MapleCUN | ZWave | HUE@deCONZ@docker
svn:MySensors, WeekdayTimer, AttrTemplate => {mqtt2, mysensors, httpmod}
Hilfreich Hilfreich x 1 Liste anzeigen

Offline Beta-User

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 7325
  • eigentlich eher user wie "developer"
Antw:Fundgrube - Interessante Sketche und Lösungsansätze
« Antwort #2 am: 13 Oktober 2017, 07:52:49 »
(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
« Letzte Änderung: 19 Oktober 2017, 14:29:08 von Beta-User »
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM@VCCU | MySensors: seriell, v.a. 2.3.1@RS485 | MQTT2: MiLight@ESP-GW | SIGNALduino | MapleCUN | ZWave | HUE@deCONZ@docker
svn:MySensors, WeekdayTimer, AttrTemplate => {mqtt2, mysensors, httpmod}

Offline Markus.

  • Sr. Member
  • ****
  • Beiträge: 765
Antw:Fundgrube - Interessante Sketche und Lösungsansätze
« Antwort #3 am: 11 November 2017, 15:39:08 »
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

Offline Ranseyer

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 1510
    • Homepage
Antw:Fundgrube - Interessante Sketche und Lösungsansätze
« Antwort #4 am: 02 Januar 2018, 15:16:18 »
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
FHEM mit FTUI. Homematic-Funk für Thermostate und Licht. MySensors als Basis für eigene HW.
Zentrale ist der MAPLE-CUL mit RFM69+HModUART-AddOn.
Doku zu meinen Projekten: Github/Ranseyer. Platinen falls verfügbar gerne auf Anfrage.
Support: gerne wenn ich Zeit+Lust habe im Forum. Nicht per PN!

Offline Brasletti

  • Full Member
  • ***
  • Beiträge: 210
Antw:Fundgrube - Interessante Sketche und Lösungsansätze
« Antwort #5 am: 15 Februar 2018, 11:35:04 »
Sollte das ganze nicht besser in einen eigenen Bereich? Dann wird das Ganze auch übersichtlich und derjenige, der den Sketch erstellt hat (falls es sich um eine Eigenentwicklung handelt) könnte auch besser Support leisten bzw Fragen dazu beantworten.

Viele Grüße
Armin

Offline Beta-User

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 7325
  • eigentlich eher user wie "developer"
Antw:Fundgrube - Interessante Sketche und Lösungsansätze
« Antwort #6 am: 14 März 2018, 11:30:17 »
Sollte das ganze nicht besser in einen eigenen Bereich? Dann wird das Ganze auch übersichtlich und derjenige, der den Sketch erstellt hat (falls es sich um eine Eigenentwicklung handelt) könnte auch besser Support leisten bzw Fragen dazu beantworten.
Na ja, den Thread hier hatte ich in der durchaus eigennützigen Absicht mal begonnen, eine Art "Linkliste" zu haben, die nur einen Überblick darstellt und das Wiederfinden erleichtert. Von daher sollten Diskussionen dazu dann tatsächlich auch nicht hier stattfinden, sondern eben in den verlinkten Threads und Fundstellen. Sollte sich aber tatsächlich zu einem (nur) hier geposteten Sketch oder Lösungsansatz eine Diskussion entwickeln, wäre mein Vorschlag, das dann abzutrennen und hier nur einen Link (ggf. mit kurzer Zusammenfassung) auf die abgetrennte Diskussion zu belassen.

Aber natürlich können wir auch andere konstruktive Vorgehensweisen diskutieren (und ggf. diese Diskussion dann abtrennen ;) ).
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM@VCCU | MySensors: seriell, v.a. 2.3.1@RS485 | MQTT2: MiLight@ESP-GW | SIGNALduino | MapleCUN | ZWave | HUE@deCONZ@docker
svn:MySensors, WeekdayTimer, AttrTemplate => {mqtt2, mysensors, httpmod}