Donnerstag, 16. Februar 2017

Wifi led Fluter mit MQTT, ESP8266 und Arduino IDE

im Winter ist es bei uns dunkel 😑:


Abhilfe schafft ein neuer Led Fluter von 100W aus China. dieser bekam noch einen Esp8266, seit einiger Zeit gibt es fertige Relay Boards für wenige Euro.


programmiert wurde der ESP mit der Arduino IDE und fast dem gleichen Sketch wie die anderen SmartHome Arduinos die schon ihre Arbeit seit Jahren tun.

auf Bewegungsmelder haben wir bewusst verzichtet, die Praxis zeigt, sie gehen kaputt, sie gehen am Tag an, oder reagieren schon auf Katzen - alles Mist.
also muss das Licht per Hand angeschalten werden.
aber Handy anschalten - warten bis es sich per Wlan verbunden hat - App öffnen - Licht anschalten, dass ist auch nicht smart 😂

hier kommt der Amazon Dash Button ins Spiel


für 5€ bekommt man dann einen Wifi Schalter

hier der ganze Aufbau:



😀

Donnerstag, 9. Februar 2017

Arduino Speicherproblem, kein RAM mehr, out of free RAM

bei großen Projekten geht der Ram eines Arduino uno schneller zu neige als man denkt.
unsere Frischwasserstation nutzt einen Arduino und dort gab es mitlerweile Probleme.
der Funktionsumfang ist seit dem Bau erheblich gewachsen:

Frischwasserstation Anzeige im smarthome fhem
als es dann beim kompillieren die Warnung für wenig freien Ram gab, folgten auch die ersten Abstürze:



das eigentliche Problem sind nicht etwa Variablen, sondern die vielen Zeichenketten, die über die serielle Schnittstelle und über MQTT zum smarthome übertragen werden.
folgendes Beispiel soll dies verdeutlichen:


dieser Sketch macht nichts anderes als etwas Text auf der Schnittstelle auszugeben. der avr lädt aber die Literale beim Start in den RAM, somit sind 21% einfach weg. um dieses Problem zu beheben kann man sich des F() Makros behelfen:


nun werden die Literale nicht mehr in den RAM geladen, leider funktioniert das nur bei den print Befehlen.

andere Funktionen die eine Zeichenkette (char) erwarten, wollen sie auch im RAM liegen haben.

dazu kann man sich ein eigenes Makro schreiben:

char StringBuffer[80];
#define P(str) strncpy_P(StringBuffer, PSTR(str), sizeof(StringBuffer))

ab jetzt können Literale auch an Funktionen übergeben werden die einen char im RAM erwarten, da er ja vorher ins RAM kopiert worden ist. die größe des StringBuffer sollte man etwas größer wählen als die längste Zeichenkette [80].

ein Beispiel sähe dann so aus:
client.publish(P("/Frischwasserstation1/VorlaufHeizung"), [char] );


in diesem Sinne frohes programmieren.