Das Funkmodul der Platine emuliert einen seriellen Port. Die Einstellungen: 115200 Bit/s, 8 Datenbits, kein Paritätsbit, 1 Stopbit. Es gibt kein Echo. Die Daten werden im Klartext als Hexadezimaldarstellung übertragen. Am Ende einer Transmission folgt immer ein \n (hier nur zur Verdeutlichung ausgeschrieben; gemeint ist ein Zeilenumbruch; ASCII-Zeichen 0x0D).
Hier zu sehen ist jeweils die Datenstruktur und darunter der Befehl, um diese von der Platine abzufragen. Zuletzt ist eine Beispielantwort aufgeführt.
Dies nach dem Verbinden abfragen, um zu verifizieren, dass das korrekte Gerät und die korrekte Firmwareversion vorliegt.
const uint8_t ReportID = 0x80; const uint8_t Device = 0x05; // BlueTWILED, Hardware-Version 2.x (nur lesbar) const uint8_t Version = 0x03; // Firmware-Version 2.x.3 (nur lesbar)
Beispielabfrage und -antwort:
80\n 800503\n
const uint8_t ReportID = 0x81; uint8_t CountSchedule; // Anzahl der Zeilen im Zeitplan (nur lesbar) uint8_t Status; // Status-Bits (nur lesbar) uint8_t Error; // Error-Bits (nur lesbar) uint8_t Flag; // Flag-Bits (nur lesbar) int8_t Position; // Aktuell aktive Zeile im Zeitplan (nur lesbar) tTime Time; // Aktuelle Uhrzeit tDate Date; // Aktuelles Datum int16_t Color16[12]; // Aktuelle Helligkeiten, jeweils 0..4096 (entspricht 0..100%) uint16_t Voltage; // in mV (nur lesbar) int16_t TempWater; // CoolTWITemp (Wassertemperatur) in 1/10 °C (nur lesbar) int16_t TempBoard; // Platinen-Temperatur in 1/10 °C (nur lesbar) int16_t TempSlave; // Slave-Temperatur in 1/10 °C (nur lesbar)
typedef struct { int8_t Jiffy; // 0..99 (Hundertstelsekunden) int8_t Second; // 0..59 int8_t Minute; // 0..59 int8_t Hour; // 0..23 } tTime; typedef struct { int8_t Day; // 1..31 int8_t Month; // 1..12 int8_t Year; // 0..99 (vergangene Jahre seit 2000) int8_t DST; // 0: Normalzeit, 1: Sommerzeit } tDate; // Bits in Info.Status #define S_CLOUD (1<<0) // Wolke aktiv #define S_STORM (1<<1) // Gewitter aktiv #define S_COOLER (1<<2) // Kühlung aktiv #define S_HEATER (1<<3) // Heizung aktiv #define S_LIGHTNING (1<<4) // Blitz aktiv #define S_TIMER (1<<5) // Timer aktiv // Bits in Info.Error #define ERR_OVERTEMP (1<<0) // Übertemperatur #define ERR_UNDERVOLT (1<<1) // Unterspannung #define ERR_QUARZ (1<<2) // Quarz-Fehler #define ERR_CHECKSUM (1<<3) // Checksummenfehler #define ERR_TEMPBOARD (1<<5) // Onboard-Temperatursensor-Fehler #define ERR_RTC (1<<6) // Echtzeituhr-Fehler #define ERR_PWM (1<<7) // PWM-Fehler // Bits in Info.Flag #define IF_RTCSAVE (1<<5) // EEPROM-Speichervorgang aktiv
Beispielabfrage und -antwort:
81\n 811B0000000C5E2307001C071001000000000000000000000000000000000000000000000000AA30040145014A02\n
Auslesen setzt gleichzeitig den Zeiger zum Auslesen des Zeitplans auf Zeile 0. Siehe auch dort.
const uint8_t ReportID = 0x82; uint8_t Mode; // 0: Manuell, 1: Auto, 2: Geo, 2: RGB-Demo, 3: Blitzer uint8_t Flag; uint8_t FanLow; // 0..255 entspricht 0%..100% uint8_t FanHigh; // 0..255 entspricht 0%..100% uint8_t LCDBLMin; // 0..255 entspricht 0%..100% uint8_t LCDBLMax; // 0..255 entspricht 0%..100% uint8_t TimeLapse; // 0..255 (Zeitraffer) uint8_t ColorName[12]; // jeweils: 0: Ausblenden, 1: Weiß, 2: Rot, 3: Grün, 4: Blau, 5: UV, 6: Mondlicht, 7: Kaltweiß, 8: Warmweiß, 9: Gelb, 10: Pink, 11: Royalblau, 12: Cyan, 13: Violett, 14: Orange, 15: Tiefrot uint16_t CloudP; uint16_t CloudD; uint16_t StormP; uint16_t StormD; int16_t Lat; // Breitengrad in 1/10° int16_t Lon; // Längengrad in 1/10°
// Bits in Config.Flag #define CF_STEPBIG (1<<0) // Große Schrittweite #define CF_LCD20X4 (1<<1) // Großes Display #define CF_FAHRENHEIT (1<<2) // Temperatureinheit: Grad Fahrenheit #define CF_AMPM (1<<3) // Uhrzeit im 12-Stunden-Format mit AM/PM #define CF_WRITEPROTECT (1<<4) // Schreibschutz (nur lesbar)
Beispielabfrage und -antwort:
82\n 820001508232FF01010101010101020201030404370044040000A70D00000CFE\n
Liest eine Zeile aus dem Zeitplan. Der Zeiger „Position“ springt danach automatisch auf die nächste Zeile.
const uint8_t ReportID = 0x83; int8_t Position; int8_t Hour; // 0..24 int8_t Minute; // 0..59 int16_t Alt; // = 10000 * sin("Sonnenhöhe über dem Horizont") int16_t Color16[12]; // jeweils 0..4096 (entspricht 0..100%) uint16_t Timer; // 0..65535 (Spalte "Timer", Angabe in Hundertstelsekunden, bei 65535 ist der Timer angehalten) uint8_t Switch; // 0..255 (Spalten "Display", "Wolken" und "Gewitter" in "Schalter")
// Bits für Schedule.Switch #define SW_LCDBL (1>>5) // Bei nicht gesetztem Bit geht die Displaybeleuchtung in den Nachtmodus #define SW_CLOUD (1>>6) // Bei nicht gesetztem Bit sind Wolken deaktiviert #define SW_STORM (1>>7) // Bei nicht gesetztem Bit sind Gewitter deaktiviert
Beispielabfrage und -antwort:
83\n 83000A0028F6000000000000000000000000000000000000000000000000000020\n
const uint8_t ReportID = 0x85; uint8_t FanMode; // 0: Helligkeitsgesteuert, 1: Temperaturgeregelt uint8_t JMPMode; // 0: IR-Lernmodus, 1: Low active bei Wolke, 2: Low active bei Gewitter, 3: Low active bei Temperaturüberschreitung (Kühlung), 4: Low active bei Temperaturunterschreitung (Heizung), 5: Low active bei Blitz, 6: Low active bei aktivem Timer uint8_t ChartMode; // 0: CoolTWITemp, 1: Platinentemperatur, 2: Eingangsspannung, 3: Slave-Temperatur uint8_t PWMPrescaler; uint8_t TWIBitrate; uint8_t RESERVED; uint8_t RandomInit; // Initwert für den Zufallsgenerator uint8_t FanOff; // 0..255 entspricht 0..100% (Lüftergeschwindigkeit bei abgeschalteten LEDs) uint8_t LCDBLNight; // 0..255 entspricht 0..100% (Displayhelligkeit bei aktivem Nachtmodus) uint8_t Language; // 0 = Englisch, 1 = Deutsch int8_t TempOffset; // in 1/10 °C int16_t TempWaterLow; // in 1/10 °C int16_t TempWaterHigh; // in 1/10 °C int16_t TempCoolLow; // in 1/10 °C int16_t TempCoolHigh; // in 1/10 °C int16_t TempHeatLow; // in 1/10 °C int16_t TempHeatHigh; // in 1/10 °C uint16_t TempInterval; // 1..255 Minuten tTimeZone TimeZone; uint16_t IRCode[8]; // Codes der IR-Universalfernbedienung
typedef struct { int8_t StandardMonth; int8_t StandardDay; int8_t StandardHour; int8_t StandardDayOfWeek; int8_t DaylightMonth; int8_t DaylightDay; int8_t DaylightHour; int8_t DaylightDayOfWeek; int16_t Bias; // -720..720 (Abweichung der Zeitzone von UTC bei Normalzeit in Minuten) } tTimeZone;
Beispielabfrage und -antwort:
85\n 850000030C260000000101000401180104011801DC00F0000C000A1F0300031F02003C0010051105210520051004250430050A05\n
const uint8_t ReportID = 0x86; uint16_t CloudStep; uint16_t StormStep; uint16_t LightningP; uint8_t CloudAlpha; uint8_t StormAlpha; uint8_t Balance[12]; uint8_t MoonColor16[12]; uint8_t LightningMask[12]; uint8_t WeatherDelay[12];
Beispielabfrage und -antwort:
86\n 8664001E00F4011E0A64646464646464646464646400000000000000000000000001020408102040804080408000060C12181E0A140A140A14\n
Werte im Chart (Temperatur oder Spannung).
const uint8_t ReportID = 0x87; int16_t Chart[40]; // jeweils in 1/10 °C oder mV, der neueste Wert ist an Index 0 (nur lesbar)
Beispielabfrage und -antwort:
87\n 874A024C024E02500250024D02440243023F0244023E023A02340237023902340238022E0217020402FB010002F7010102FF01FA010602010202020A02090202020602FD010002F201F701F8010002FA01\n
Die Platine erkennt am ersten Byte (ReportID), welche Struktur gemeint ist. Hierbei gilt, dass Bit 7 gelöscht sein muss (81 = Info-Struktur lesen; 01 = Info-Struktur schreiben). Die Strukturen sind dann jeweils so, wie oben erklärt aufgebaut.
Um Uhrzeit und Datum nicht zu verändern, als Minute -1 übergeben. Um die aktuelle Helligkeit nicht zu verändern, als ersten Helligkeitswert -1 übergeben.
7F00\n
7F01\n
7F02\n
7F03\n