von DarioC
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel Honeywell Rondostat HR20E per AVR steuern und konfigurieren gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird.
Den Thread dazu kann der interessierte Leser hier nachlesen
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln.
Dabei können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:
- Temperaturregelung
- Echtzeituhr
- Ausnutzen der Sleep Funktion
- Anzeige Soll-Temperatur und der Uhrzeit
- Einstellung der Soll-Temperatur
- Uhrzeitgesteuerte Einstellung der Soll-Temperatur
- Fenster-Offen-Erkennung
- Ventilfreispülungsfunktion
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:
- Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle
- Abfrage der Messwerte und Parameter über externe Schnittstelle
- Vernetzung der Thermostaten untereinander
- Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)
- Erweiterung der Anzeige um
- Ist-Temperatur
- Ventilstellung
- Funkschnittstelle
- ...
- Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.
Die Software wird unter GPL v2 gestellt.
[bearbeiten] Subversion Repository
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org
Repository Location: https://OpenSVN.csie.org/hr20
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20
TRAC: https://opensvn.csie.org/traccgi/hr20
Anonymous check out ist erlaubt.
Wer was committen will muss freigeschaltet werden.
Dazu brauche ich ein Usernamen, Passwort und eine Mailadresse, dann kann ich das einrichten.
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.
Oder einfch eine Email mit username und password an hr20[at]carluccio[dot]de
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern.
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.
| Entwickler
| svn Status
|
| darioc
| angelegt: rw
|
| louk
| angelegt: rw
|
| jsachs
| angelegt: rw
|
[bearbeiten] Verzeichnisstruktur
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:
| /doc
| Für alles an Dokumenten, die selbst erstellt wurden.
Specs, die man im Internet bekommen kann gehören hier nicht rein,
die machen das alles nur unnötig gross und das auschecken dauert länger.
|
| /playground
| Wie der Name schon sagt, zum rumspielen und testen.
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind
und (derzeit) noch nicht Teil des Programmes sind.
|
| /source
| Hier kommt die Applikation rein mit allen Modulen und makefiles.
Bitte haltet das Repository sauber und checkt nur Dateien ein,
die auch Sinn machen, "thumbs.db" oder andere Temp-Dateien gehören hier nicht rein.
|
[bearbeiten] SVN Client und Anleitung
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei hier runterladen kann.
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.
[bearbeiten] Analyse der Hardware
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version
als PDF hier oder hier im SVN.
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen.
Diese dient dazu später die Aufgaben zu verteilen:
| Module
| Function
| Developer
| Status
|
| LCD
| Display Driver:
- Init Display - DONE
- Set Segments - DONE
- Print HEX, DEC, TEMP, DayofWeek - DONE
- Blink - DONE
- e.t.c
| dario
| DONE
|
| LCD Simulation
| Simulation for display in AVR Studio:
- Defining Display - DONE
- Assign Segments to register bits - DONE
- Providing samplecode - DONE
| louk
| 95%
|
| RTC
| Time and Date Handler
- init timer - DONE
- use IRQ with 32kHz crystal - DONE
- handle time and date - DONE
- daylight saving - DONE
- consult leapyear - DONE
- calc day of week out of date - DONE
- Only one Byte for Year -> (2000 to 2255)
- Day of week timer with callback - DONE
TODO
- Tick counter (seconds since reboot) - OPEN
- used to detect long keypress
- used to detect motor blocked
- used for additional timer
- Additional timer based on tick counter value - OPEN
- corretion for external Crystal - OPEN
- calibrate internal RC - DONE, but not tested
| dario
| 95%
|
| COM
| COM-Driver
- menue (Debug und Steuerung)
- show and set desired temperature
- show and set Time and Date
- show actual temperature
- show (and set) actual valveposition
- show and set timetable and temperatures
- optional
- adressierung of HR20 (for BUS, RF)
- authentication end encryption
| jsachs
active
| (50%)
|
| CONFIG
| Save Config in EEPROM
- driver for EEPROM access
- save values to EEPROM
- load values from EEPROM
|
|
|
| MENU
| Control Menu State Machine
- show values on display
- functionality:
- show and set desired temperature
- show and set time and date
- show actual temperature
- show actual valveposition
- show and set timetable and temperatures
|
|
|
| MAIN
| Main Loop
- init everything
- global vars - DONE
- rtc - DONE
- lcd - DONE
- motor - DONE
- tempsensor
- get keystate - DONE (ISR in main.c)
- debounce - not needed
- multi keypress (needed for hidden menue?) - can be checked by main loop
- get position of wheel (incremental counter) - DONE (ISR in main.c)
TODO
- call menue
- detect longer keypress / double click - needed?
| dario
| (70%)
|
| MOTOR
| Motor-Driver
- set desired valveposition - DONE
- quick, asympthotic, quiet - DONE (speed can be chosen)
- callibrate for Valve - DONE
- optimised (less motor consumption depending on desired final position) - DONE
- Stop motor if not turning (blocked) - DONE
TODO
- stop calibration if valve is removed - OPEN
- Genereate ERROR if motor is not turning (blocked or low energy) - OPEN
| dario
| (95%)
|
| ADC
| ADC-Driver (measure Temp and U_Bat)
- init Sensor - DONE
- start A/D conversion (Temp and U_Bat) - DONE
- calc temperature in 1/100 degree Celsius - DONE
- calc battery voltage in mV - DONE
- calibration for sensor (needed?) - DONE
- IRQ driven (IRQ generated by RTC or LCD, called from main.c)
| dario
| (95%)
|
| PID
| PID Algorithm
- calculate desired valveposition out of
- last valveposition(s)
- last temperature(s)
- actual temperature
|
|
|
| LOG
| Datalogger
- Operating Hours
- motor in action
- ODOmeter
- since Battery Exchange
- Errors
- Logfiles (only with additional hardware)
|
|
|
| UID
| Unique ID for identification
|
|
|
| BOOT
| Bootloader
we need a bootloader so that the developers can flash the software
without a JTAG cable and without disassembling the HR20.
I have a working XModem bootloader. We should discuss if we want to use it.
Still need some size optimisation
| jsachs
|
(95%)
|
Das Projekt wird mit doxygen dokumentiert,
die API-Beschreibung kann aus dem Source-Code generiert werden.
Es soll möglich sein den Thermostaten über eine Schnittstelle anzusteuern.
An dem externen Stecker liegt schon die Serielle Schnittstelle an.
Wir definieren ein Protokoll, welches dem Datenaustausch zwischen einem HR20 und einem externen Gerät dienst. So kann man einen PC direkt (über einen 3V Pegelwandler) anschließen.
Wenn man ein anderes Medium nutzen will, muss man dafür sorgen, dass genau diese
Pakete an den Kommandohandler übergeben werden. So kann man darüber oder darunter, je nach Sichtweise jedes Medium (Kabel, Funk, IR) und jedes Protokoll legen.
Folgede Anforderungen werden an das Nachrichtenformat gestellt.
- Jeder Befehl soll zu jedem Zeitpunkt möglich sein (nicht state orientiert)
- Befehle sollen eingetippt werden können (z.B. am Terminalprogramm)
- Es soll einfach möglich sein, das Protokoll um neue Befehle zu erweitern.
- Der Parser läuft im Mikrocontroller, er sollte wirklich klein sein. Es wäre nicht schön, wenn dazu jede Menge Strings gespeichert werden müssen.
Folgende Befehle sollten verfügbar sein:
- Soll Temperatur setzen und lesen
- Programm Manuell / Auto Umschaltung, setzen und lesen
- Datum / Zeit Einstellung, setzen und lesen
- Sommer Winterzeit setzen und lesen
- Programm für die Wochentage 1-7, vermute hier auch 2 Zeiten pro Tag wie beim Original ?
- Temperatur für Absenk Temperatur und Normal Temperatur setzen und lesen
- Version lesen
- Batteriespannung (Zustand) lesen
- Ventilstellung setzen und lesen
- Kalibrierung auslösen
- Bootloader starten für Update über RS232
Generell sollten alle Veränderungen automatisch gemeldet werden (Notify) um ein Polling zu vermeiden.<br
Byte1: Befehl
Byte2: Länge Daten
Byte3: Daten
Maximal 16 oder 32 Byte, wegen Buffergröße.
Beispiel:
Befehle:
- 00 OK
- 01 Gettime
- 02 Get SollTemp
- 03 Get IstTemp
- 04 Get Ventilpos
- 81 Settime
- 82 Set SollTemp
- 83 n/a
- 84 n/a
- FF NOK
-> 81,03,12,30,17
<- 00
-> 01,00
<- time: 12:30:17
-> 02,00
<- soll: 20.0
-> 03,00
<- ist: 19.95 |
Richtig zufrieden bin ich damit nicht, hat jemand bessere Vorschlage, dann hier eintragen:
- Einfaches ASCII Protokoll.
- Die Kommandos müssen kurz aber Aussagekräftig sein.
- Alle Strings müssen im Flash liegen um Speicher zu sparen.
- Rückmeldungen und Notifys müssen eindeutig unterscheidbar sein
Eine kleine Protokollbeschreibung ist im SVN zusammengepackt unter "doc/protokoll/".
Beispiel :
"!VER\r" -> "$VER-1.2.17"
"?TEMP\r" -> "$TEMP-CUR=20.5,MIN=16.3,MAX=24.5\r"
"!SET-TIME=17:30:55\" -> "$SET-TIME=OK\r"
Notify: "@TEMP-CUR=20.5,MIN=16.3,MAX=24.5\r"
Der Aufbau ist ja im SVN Erklärt.
Der Aufwand fürs Parsen hält sich mehr als in grenzen.
Die Strings alle ins Flash.
Der Bootloader ist hier außen vor. Der wird nur per Kommando angestoßen und fährt dann ein eigenes Protokoll. Hier würde ich XModem vorschlagen. Kompakt und mit Prüfsumme. Zum Upload kann jedes Terminalprogramm genutzt werden.
"BOOTLOAD\r" -> "BOOTLOAD-OK\r" dann sendet der Controller die XModem start Sequenz und es geht los.
Um ein einfaches Update der Software, auch ohne Programmer und Zerlegen des HR20E zu ermöglichen, sollte ein Bootloader implementiert werden.
- Einfaches Update ohne öffnen des HR20E
- Nutzen bestehender Programme (Terminalprogramm), das erspart das schreiben von Update Software
- HR20E sollte nach dem Start prüfen ob Programm gültig und nur dann das Anwenderprogramm starten
- Protokoll sollte Updatevorgang aus dem laufenden Betrieb unterstützen (Sprung in den Bootloader)
X-Modem Protokoll (mit CRC)
Hier gibt es eine fertige Lösung für das Etherboot projekt, deren übername gestattet ist.
Größe ist hier kleiner 1kb und wohl verkraftbar.
Vorteil:
- etablierte Technik
- von anderen Herstellern Verwendet
- wird von den meisten Terminal Programmen unterstützt
- Gesichert durch Checksumme
Nachteil:
- Aufwendige Checksummen Berechnung oder Lookup Tabelle Notwendig
[bearbeiten] Entwicklungsumgebung
- Editor, Debugger, Compiler
- WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0
- AVR Studio 4
- JTAG ICE
Hier hat mal einer ein Protokoll eingegeben.
Das scheint aber nicht zu der Version 2.04 zu passen.
Ich habe es nicht gelöscht, falls es jemanden interessiert.