Nu är detta projekt klart och fungerar klockrent. Skall integrera air condition till min OpenHab i nästa steg.
Men för att sammanfatta, jag hade en gammal portabel air condition som inte hade någon koppling till resten av mina iot devices så jag började glad i hågen att demontera ac:n för att fixa det. Det som började med att kunna trycka på de 4 knappar på fronten för att bara slå av och på och styra temp etc växte till att även läsa av statusen på displayen (leds + 7 segment display, se bild ovan) vilket gjorde att det drog ut på tiden.
På air condition mb sitter en HMS87C1204 cpu (oxo bilder ovan) som via en SN74HC164 styr allt, dvs leds + 7-segment + känner av knapptryckningarna. Efter fundering och tips i tråden, gjorde jag så att jag låter min ESP8266 läsa av CLK+Serial data (se bild ovan) på SN74HC164 samt lite andra portar på cpu:n för att se vad som just nu styrs, och sen översatte det till variabler i mitt program som jag sen skickar till min MQTT server (vilken jag även kan skicka IN signaler från tex OpenHab till mitt program och styra aircond).
Bifogar min interrupt kod för CLK, DP1 samt DP2 för de vetvilliga:
Kod: Markera allt
void handle_interrupt_dp1() ICACHE_RAM_ATTR;
void handle_interrupt_dp2() ICACHE_RAM_ATTR;
void handle_interrupt_clk() ICACHE_RAM_ATTR;
void handle_interrupt_dp1() {
if (last_known_is_powered_on && current_dp1_value != current_complete_value && current_complete_value != 255) {
current_dp1_value = current_complete_value & 0b11101111;
dp1_is_error_waiting_for_dp2 = current_dp1_value == seven_digit_error;
dp_value_changed = true;
}
current_complete_value = 255;
}
void handle_interrupt_dp2() {
if (last_known_is_powered_on && current_dp2_value != current_complete_value && current_complete_value != 255) {
current_dp2_value = current_complete_value & 0b11101111;
current_error_value = dp1_is_error_waiting_for_dp2 && current_complete_value != 255 ? current_dp2_value : 255;
dp1_is_error_waiting_for_dp2 = false;
dp_value_changed = true;
}
current_complete_value = 255;
}
// Pattern:
// Header 255 + sync 254 for 3550uS
// dp1 high + dp2 high - Led status byte for 3550uS
// dp1 low + dp2 high - DP1 byte for 3550uS
// dp1 high + dp2 low - DP2 byte for 3550uS
void handle_interrupt_clk() {
current_micros = micros();
// Long time between packages, meaning dp1 and dp2 haven't picked the values up
if (current_micros - last_micros_clk_interrupt > 2000) {
// Ignore the header and sync value
if (last_known_is_powered_on && current_complete_value != 255 && current_complete_value != 254) {
// Ignore last bit
current_complete_value &= 0b11111110;
if (current_complete_value != current_led_value) {
previous_led_value = current_led_value;
current_led_value = current_complete_value;
led_value_changed = true;
}
}
current_serial_value = 0;
current_serial_value_index = 0;
}
last_micros_clk_interrupt = current_micros;
if (digitalRead(PIN_SERIAL) == HIGH) {
current_serial_value |= 1 << current_serial_value_index;
}
current_serial_value_index++;
if (current_serial_value_index >= 8) {
// New data package
current_complete_value = current_serial_value;
if (current_complete_value == 255) {
nb_of_255_bytes++;
}
nb_of_read_bytes++;
current_serial_value = 0;
current_serial_value_index = 0;
}
}
Iom att signalerna kommer in efter en med 3.5ms mellanrum, blir det mycket state-machine av lösningen så det blev till att hålla tungan rätt i mun.
Uppkopplad i test mode på bänken, cpu på mb krävde vattennivåsmätaren och tempgivare att vara inkopplad.
2019-05-12 20.25.45.jpg
Min design.
Schematic_KCC_Aircon_20190525.png
Som vanligt lär jag mig mer och mer för varje projekt jag gör, det är väl slutmålet?
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.