Forum

Einloggen | Registrieren | RSS  

volvodidi(R)

Bonn / Medevi,
22.03.2020,
09:24
(editiert von volvodidi
am 22.03.2020 um 09:26)


@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

So, hier wie versprochen die fertige Arduinoschaltuhr.
Das lesen von SD und ablegen, so das es in einem Stück gesendet werden kann war das schwierigste.
Eine riesen Dankeschön an bastelix der mir da weitergeholfen hat. Alleine hätte ich das nicht hinbekommen.
Aber jetzt ist sie fertig und funktionsfähig.
Angefangen hat alles damit, das die neu Klima (bzw. Wärmepumpe) keine Wochenschaltuhr hatte, nur einen Timer der jeden Tag neu gesetzt werden musste. Die WP soll aber jede Nacht ab ca 22:00 die Nachtabsenkung (18°) übernehmen. Das war Schaltuhr Nr1. Dann kam im Winter noch ein Deckenventilator dabei, der die warme Luft des Pelletofens gleichmäßiger im Raum verteilen soll (Funk 433Mhz gesteuert). Daraus wurde dann Ver. 1.1.. Da aber Änderungen im IR-Protokoll aufwändig waren (mit einem zweiten Arduino IR code einlesen, und in das Schaltuhrprogramm rein kopieren und neu kompillieren). Kam mir die Idee, das man das auch einlesen und abspeichern könnte um es zu senden.
Da kam dann die SD ins Spiel. Da der Code nicht oft geändert werden muss, sollte die SD das aushalten. Und wie dann alles lief, kam noch ein Temperatursensor dabei, der die WP ab 23:00 Uhr und ab 18° einschaltet. Das will ich jetzt erstmal im nächsten Winter probieren ob das praktikabel ist, oder sich noch was verbessern lässt.
Aufgrund der langen IR-Code geht es nur mit einem Mega, dazu ein 4 Zeilen Display, ein 4x4 Keypad für Eingaben, eine RTC 1302, einen 433Mhz Sender, SD Modul, Temperatursensor DHT22, IR Diode und IR Receiver. Das Display und Keypad werden über I2C angesteuert. Die IR Diode wird über Transistor wie hier (https://www.mikrocontroller.net/topic/246059#2514200) angesteuert um Reichweite zu bekommen. Das 433Mhz Funkmodul verträgt bis 12V, also hab ich die Versorgung an VIN des Arduino (in meinem Fall 9V DC) angeschlossen. Das bringt gegenüber der 5V vom Arduino auch höhere Reichweite für den Sender. Die Bibliothek für den 433Mhz Sender musste ich anpassen, da diese nicht wie ich dachte universell alles einlesen kann. Es wurden nur die Hälfte der Signale der Fernbedienung eingelesen (natürlich nicht die die ich brauchte). Auch für das senden der Funksignale musste die Bibliothek angepasst werden. Der Potiknopf auf der Rückseite ist für die Display helligkeit. Der ir Receiver sitz vorne links neben dem Display. Die Sendediode rechts im Gehäuse in Richtung WP.

Gruß und nochmal Dankeschön an bastelix
Dieter

Hier der Sketch dazu:
https://www.elektronik-kompendium.de/forum/upload/20200322091948.txt





bastelix(R)

26.03.2020,
23:24

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

» So, hier wie versprochen die fertige Arduinoschaltuhr.
Hübsch ists geworden :-)

» Gruß und nochmal Dankeschön an bastelix
Gern, freut mich das es funktioniert :-)

volvodidi(R)

Bonn / Medevi,
12.10.2020,
17:53

@ bastelix

Arduino Problem, von SD File lesen und in int ablegen

@bastelix,
ich hoffe es geht dir gut und die Familie ist gesund.
Bin im Moment wieder in S und optimiere die Schaltuhr weiter, habe aber ein Problem mit den Schaltbedingungen zum einschalten der Klima (zum Heizen).
Ich habe die Uhr ja noch mit einem DHT22 versehen, und wollte das Einschalten der Klima noch an eine Temp. Bedingung knüpfen.
Dazu habe ich mir noch 2 Variablen erstellt, einmal "int temp_trigger = 0;//Hilfsvariable für Schalttemperatur", und "int schalt_temp = 18;//Schalttemperatur".
Der temp_trigger sagt ob die Klima an oder aus ist, und schalt_temp ab wann sie eingeschaltet werden soll.
Es wird aber kein Schaltimpuls gesendet ab der eingestellten Schalttemperatur.

In Zeile 119 frage ich ab ob, es in dem eingestellten Zeitbereich liegt, die Klima geschaltet werden soll (AlarmIsActiveLG), die Klima noch ausgeschaltet ist (temp_trigger), und die Schalttemperatur (schalt_temp) unterhalb der Temperatur des Fühlers (t) liegt.
Wenn alle Bedingungen erfüllt sind soll die Klima eingeschaltet werden, und der temp_trigger auf 1 gesetzt werden (also Klima ist an).
Es tut sich aber nix.

Könnte es sein, das die Zahlenformate von "schalt_temp" und "float t = dht.readTemperature()-1.2 " unterschiedlich sind und deshalb nix geht?
Die -1,2 ist eine Temperaturanpassung.

//Klima einschalten zwischen Zeit A und B ab eingestellter Temperatur (18°C default)
if (myRTC.hours >= A_hour && myRTC.minutes >= A_minute && myRTC.hours <= B_hour && myRTC.minutes <= B_minute && AlarmIsActiveLG == 1 && temp_trigger == 0 && t <= schalt_temp)
{
sd_read_ir("ON.TXT";); //Aufruf Unterprogramm SD lesen (sd_read_ir)
lcd.setCursor(0, 1);
lcd.print("Klima ein ";);
delay(500);
(temp_trigger = 1);
}

Der komplette Sketch hängt unten dran.
Gruß
Dieter

https://www.elektronik-kompendium.de/forum/upload/20201012175239.ino

volvodidi(R)

Bonn / Medevi,
13.10.2020,
09:58

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

Ich hab es jetzt mal so probiert, mal sehen ob das läuft:

Mit:
int temp = round(t)
und der Vergleich
&& temp == schalt_temp

float t = dht.readTemperature()-1.2;//Temp. Anpassung -1.2
int temp = round(t)

//Schaltpunktabfrage:

//Klima einschalten zwischen Zeit A und B ab eingestellter Temperatur (18°C default)
if (myRTC.hours >= A_hour && myRTC.minutes >= A_minute && myRTC.hours <= B_hour && myRTC.minutes <= B_minute && AlarmIsActiveLG == 1 && temp_trigger == 0 && temp == schalt_temp)
{
sd_read_ir("ON.TXT";); //Aufruf Unterprogramm SD lesen (sd_read_ir)
(temp_trigger = 1);
lcd.setCursor(0, 1);
lcd.print("Klima ein ";);
delay(500);
}

Kompletter Sketch siehe oben.
Gruß
Dieter

volvodidi(R)

Bonn / Medevi,
13.10.2020,
12:55

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

Es läuft nicht, ich hab aber den Fehler gefunden.
Das Problem lag in meiner Zeitabfrage mit
myRTC.hours >= A_hour && myRTC.minutes >= A_minute && myRTC.hours <= B_hour && myRTC.minutes
Das geht wohl nicht mit größer und kleiner gleich.
Habe jetzt noch eine Hilfsvariable eingesetzt die ich mit einer == Zeitabfrage auf 1 setze und beim 2. Schaltpunkt wieder auf 0.
Damit geht es jetzt.
Sketch im Anhang.
Gruß
Dieter



https://www.elektronik-kompendium.de/forum/upload/20201013125520.txt

bastelix(R)

13.10.2020,
21:59

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

Hallo Dieter,

bei uns ist soweit alles gut, hoffe bei euch auch.

Sorry, ich war gestern Abend zu platt um noch den Code anzuschauen.

Vorab, du darfst float und int nicht direkt vergleichen. float ist eine Gleitkommazahl und wird binär im IEEE-754 repräsentation gespeichert, int wird binär anders gespeichert (mir fällt grad nicht ein wie das heißt)
Wenn du jetzt float f = 3,5; mit int i = 5; vergleichst ist das Binär
f = 0100 0000 0110 0000 0000 0000 0000 0000
i = 0000 0000 0000 0000 0000 0000 0000 0101
wenn man den float nach int castest vergleichst du 5 mit 1080033280 was nur selten gut geht ;-)
Du kannst runden, was du ja dann auch gemacht hast. Noch besser wäre wenn du den Sollwert auch als float deklarierst und dann mit >= bzw <= vergleichst (Gleitkommazahlen nie mit == vergleichen, das kann wegen den Rundungsfehlern in der Binärrepräsentation gewaltig schief gehen!)

» myRTC.hours >= A_hour && myRTC.minutes >= A_minute && myRTC.hours <= B_hour
» Das geht wohl nicht mit größer und kleiner gleich.
Eigentlich schon die RTC verwendet uint8_t (das ist ein unsigned int mit 8 bit) und deine Variablen sind int (signed int 32 bit), so lange da keine negativen Zahlen im spiel sind funktioniert das. Der Bug muss irgendwo anders sitzen. Ich sehs aber spontan auch nicht.

» Habe jetzt noch eine Hilfsvariable eingesetzt die ich mit einer ==
» Zeitabfrage auf 1 setze und beim 2. Schaltpunkt wieder auf 0.
Damit sind deine Schaltpunkte halt immer auf die Minute genau. Wenn deine loop-Methode mal länger ungünstig lange läuft (z.B. weil viel mit der SD-Karte gemacht wird, etc.) kann es sein, dass ein Schaltzeitpunkt unter den Tisch fällt. Das ist dann ein Bug den man nur sehr schwer reproduzieren kann. Außerdem denke ich, dass da noch was anderes nicht passt weil die >=, <= eigentlich funktionieren sollten.

Ich komme die Woche leider nicht dazu das mal selber auszuprobieren, aber du könntest nochmal mit der alten Version testen und dir die Variablenwerte über Serial in die Konsole loggen lassen.
Serial.print("myRTC.hours = ";);
Serial.println(myRTC.hours);
und so weiter bis alle Werte rausgeloggt werden. Dann kannst du nachvollziehen warum der boolsche Term false ergibt, statt true.

Gruß
Bastelix

volvodidi(R)

Bonn / Medevi,
14.10.2020,
08:02
(editiert von volvodidi
am 14.10.2020 um 10:14)


@ bastelix

Arduino Problem, von SD File lesen und in int ablegen

Hej Bastelix,
schön das es euch gut geht.
Diese Nacht hat die Schaltuhr das gemacht, wofür ich sie gebaut habe.

Das runden des Temperaturwertes reicht mir aus, Ich will mit der Klima nur abfangen das das Haus nicht noch weiter auskühlt (Nachtabsenkung) da kommt es nicht auf ein paar zehntel Grad an.
Die Klima sollte nur nicht von 22:00-6:00 Uhr durch laufen. Je nach Aussentemperatur wird das manchmal auch nicht gebraucht.
Meine alte Panasonic hat wenn die Temp erreicht war ausgeschaltet und ist auf Standby gegangen. Bei der LG läuft das Innengerät durch und nur das Aussengerät taktet.

Die genauen Schaltpunkte machen eigentlich kein Problem Es wird ja auf die Minute genau geschaltet und nicht wie am Anfang auf die Sekunde.
Der Zugriff auf die SD passiert nur beim ein und ausschalten, dann ist der Schaltpunkt ja erreicht. Das sollte eigentlich zu keinem Überschlag führen.
Werd mal weiter suchen und mir die Zeit und die Schaltpunkte an der Konsole ausgeben. Ich glaube mein Fehler liegt beim Vergleich des Zeitbereichs.
Einmal von 22:00 Einschaltpunkt bis 24:00 (myRTC.hours >= A_hour && myRTC.minutes >= A_minute) und dann von 0:00 bis 6:00 Ausschaltpunkt
(myRTC.hours <= B_hour && myRTC.minutes <= B_minute).

Kann es sein, das ich zwischen vor und nach 24:00 bzw 0;00 kein && sondern ein oder || setzen muss?
etwa so:
if (myRTC.hours >= A_hour && myRTC.minutes >= A_minute || myRTC.hours <= B_hour && myRTC.minutes <= B_minute && AlarmIsActiveLG == 1 && temp_trigger == 0 && temp <= schalt_temp)

Gruß
Dieter

bastelix(R)

14.10.2020,
22:58

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

Hi Dieter

» Kann es sein, das ich zwischen vor und nach 24:00 bzw 0;00 kein && sondern
» ein oder || setzen muss?
» etwa so:
» if (myRTC.hours >= A_hour && myRTC.minutes >= A_minute || myRTC.hours <=
» B_hour && myRTC.minutes <= B_minute && AlarmIsActiveLG == 1 && temp_trigger
» == 0 && temp <= schalt_temp)
Kann sein, ich kann mich leider nicht mehr genau erinnern was die A_* bzw. B_* Konstanten aussagen. (Ich verwende lieber sprechende Namen wie EINSCHALTZEITPUNKT_STUNDE_KLIMA und AUSCHALTZEITPUNKT_MINUTE_KLIMA )

(23 >= 22 && 5 >= 0 || 23 <= 22 && 5 <= 0) ergibt true
wegen
23 >= 22 -> true
5 >= 0 -> true
damit ist der erste term true und was hinter dem OR kommt wir garnicht mehr ausgewertet

(23 >= 22 && 5 >= 0 && 23 <= 22 && 5 <= 0) ergibt false
23 >= 22 -> true
5 >= 0 -> true
23 <= 22 -> false
Wegen dem AND wird dann 5 <= 0 garnichtmehr betrachtet weil FALSE in einem Teil-Term ergibt immer FALSE wenn alle Teil-Terme nur mit AND verknüpft sind.

Was mir grad noch auffällt, auch bei boolscher Algebra gilt Punkt vor Strich, Punkt ist in dem Fall AND (&&;), Strich ist OR (||). 1 && 0 || 1 ist nicht das gleiche wie 1 && (0 || 1). Wenn ich in deinem Term mal Klammer gemäß der Regel einsetzte sieht der so aus

(myRTC.hours >= A_hour && myRTC.minutes >= A_minute) || (myRTC.hours <= B_hour && myRTC.minutes <= B_minute && AlarmIsActiveLG == 1 && temp_trigger == 0 && temp <= schalt_temp)
Wenn also Teil-Term "myRTC.hours >= A_hour && myRTC.minutes >= A_minute" false ergiebt dann ist es schon relativ egal was in B_* steht weil dann "AlarmIsActiveLG == 1 && temp_trigger == 0 && temp <= schalt_temp" das gleiche Gewicht haben wie "myRTC.hours <= B_hour && myRTC.minutes". Ich glaube du willst eher etwas in die Richtung
((myRTC.hours >= A_hour && myRTC.minutes >= A_minute) || (myRTC.hours <= B_hour && myRTC.minutes <= B_minute)) && (AlarmIsActiveLG == 1 && temp_trigger == 0 && temp <= schalt_temp)

Gruß
Bastelix

volvodidi(R)

Bonn / Medevi,
16.10.2020,
09:31
(editiert von volvodidi
am 16.10.2020 um 14:24)


@ bastelix

Arduino Problem, von SD File lesen und in int ablegen

Moin Bastelix,
Jetzt geht es, mit den Klammern. Danke.
Gruß
Dieter

Hiermit hab ich es probiert.
https://www.elektronik-kompendium.de/forum/upload/20201016142417.txt

bastelix(R)

17.10.2020,
00:24

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

» Moin Bastelix,
» Jetzt geht es, mit den Klammern. Danke.
» Gruß
» Dieter
Main Dieter,

ich hätte schwören können ich hätte da in der Mittagspause noch was anderes gelesen :-D Freut mich, dass du weitergekommen bist. :ok:

Gruß
Bastelix

volvodidi(R)

Bonn / Medevi,
17.10.2020,
07:50

@ bastelix

Arduino Problem, von SD File lesen und in int ablegen

Moin Bastelix,
stimmt, mein Fehler lag da bei der Temperatureinstellung. Nachdem ich das gemerkt hatte fluppte es dann.

Gruß Dieter

volvodidi(R)

Bonn / Medevi,
18.01.2021,
19:43

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

Und weiter gehts mit Erweiterungen.
Mittlerweile werden auch Brennenstuhl Funksteckdosen geschaltet, und aufgrund der Ungenauigkeit der RTC 1302 von ca. 7sec Vorlauf / 24h wird jetzt die Zeit mit einem DCF77 Modul 1x in 24h gesetzt. Wie bei Funkuhren auch.
Ein Tip zur Verwendung von DHT22 Temperaturgebern. Die Teile sind bei 5V Betriebsspannung nicht gerade genau und träge, aber bei 3,3V arbeiten sie deutlich genauer und schneller.
Sketch im Anhang.
Mal sehen was mir noch so einfällt.
Dieter

https://www.elektronik-kompendium.de/forum/upload/20210118194334.txt

bastelix(R)

19.01.2021,
00:01

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

» Und weiter gehts mit Erweiterungen.
:ok: :ok: :ok:

Freut mich, dass es weiter geht und dass du deinen Code mit allen teilst :-)
» https://www.elektronik-kompendium.de/forum/upload/20210118194334.txt

volvodidi(R)

Bonn / Medevi,
09.05.2021,
12:14

@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

Und hier noch mal ein Update mit Absicherung zum Zeit holen per DCF, Anzeige, etc..
Gruß
Dieter


https://www.elektronik-kompendium.de/forum/upload/20210509121330..txt

volvodidi(R)

Bonn / Medevi,
09.09.2021,
21:10
(editiert von volvodidi
am 09.09.2021 um 21:11)


@ volvodidi

Arduino Problem, von SD File lesen und in int ablegen

Hi bastelix,
ich glaub ich brauch nochmal einen Anschub.
Habe die Uhr im Sommer (erst) oben in S probieren können, und wie erwartet keinen brauchbaren DCF empfang.
Gut dann also GPS Empfänger rein. Das funktioniert wunderbar. GPS Empfang hab ich im ganzen Haus.
Ich hab dann noch einen Funktemperatursensor mit eingebunden den ich mit einem Arduino mini Pro auslese und per seriell vom Mega auslese und anzeige (alles in einem Gehäuse).
Dann hab ich noch für die Innen und Außentemp. einen min/max Speicher angelegt.
Das Funktioniert innen ohne Probleme, aber außen.
Es funktioniert ein paar Tage und dann hab ich plötzlich nix da stehen. Mal ist der max. Speicher leer mal der min. Ist leider nicht reproduzierbar.
Hatte erst die Idee mit isdigit zu kontrollieren ob ich wirklich eine Zahl habe, kann aber nur auf char angewendet werden. Ist aber ein int.
Dann hab ich eine Abfrage gesetzt die kontrolliert ob der Wert in einem bestimmten Bereich liegt, bringt aber auch nix.
Die serielle Übergabe aus dem mini Pro mach ich in 3 Teilen. Einmal der Bereich 0-25,5° und 25,6 bis 51,2°, den Wert selber, und das Vorzeichen + oder -.
Da ich seriell nur 1byte übertrage und das nur bis 255 geht, hab ich den Bereich über das 1. bit von den 9 als Bereich gesetzt. Bei Minustemperaturen werden die vom Funktempgeber gesendeten bits invertiert. Für die Verarbeitung auf dem Meg rechne ich damit bis es passt. Ich krieg es nicht hin 2 bytes zu senden und diese dann zusammenzusetzen. Es geht auch ohne :-).
Im Moment komme ich da nicht mehr weiter.
Ich hab das Gefühl das da irgendwas reinhaut was nicht Zahl ist, anders kann ich mir das im Moment nicht erklären.
Gruß
Dieter

Schaltuhr:
https://www.elektronik-kompendium.de/forum/upload/20210909211018.txt
Funkgeber auslesen:
https://www.elektronik-kompendium.de/forum/upload/20210909211106.txt