#include "project.h" #define N_VALVES 8 static volatile int semaphore = 0; static const char *valve_name[N_VALVES] = { "dd_radiator1", "dd_radiator2", "dd_radiator3", "hall_radiator", "kitchen_radiator", "music_room_radiator", "bathroom_radiator", "plc0_radiator7", }; static Onewire_addr valve_owa[N_VALVES] = { {{0x28, 0xe3, 0x5d, 0x56, 0xb5, 0x01, 0x3c, 0x96}}, {{0x28, 0x0d, 0xaf, 0x56, 0xb5, 0x01, 0x3c, 0x89}}, {{0x28, 0x79, 0xb1, 0x56, 0xb5, 0x01, 0x3c, 0x13}}, {{0x28, 0x99, 0x8f, 0x56, 0xb5, 0x01, 0x3c, 0x1c}}, {{0x28, 0xb4, 0x98, 0x6e, 0x32, 0x20, 0x01, 0xc7}}, {{0x28, 0x0d, 0x4d, 0x56, 0xb5, 0x01, 0x3c, 0xd0}}, {{0x28, 0xb1, 0x71, 0x75, 0x32, 0x20, 0x01, 0xa9}}, {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, }; volatile int temp[N_VALVES]; #define BAD_TEMP 0x7fffffff int low_limit[N_VALVES] = { 15000, 15000, 15000, 15000, 15000, 15000, 15000, 00000, }; int high_limit[N_VALVES] = { 15000, 15000, 15000, 15000, 15000, 15000, 15000, 00000, }; int valve_state[N_VALVES]; void mqtt_dispatch (char *type, char *who, char *what, char *msg) { unsigned i; if (strcmp (type, "cmnd")) return; for (i = 0; i < N_VALVES; ++i) { if (!strcmp (who, valve_name[i])) { if (!strcmp (what, "var1")) low_limit[i] = atoi (msg) * 1000; if (!strcmp (what, "var2")) high_limit[i] = atoi (msg) * 1000; } } } static float scale(int i) { float ret; ret=i; return ret/1000.; } void logic_tick (void) { static unsigned i; static int read_failed = 1; static char msg_buf[80]; int t; int o; int v; if (!read_failed) read_failed = ds18b20_read (&valve_owa[i], &t); if (read_failed) { temp[i] = BAD_TEMP; valve_state[i] = 0; } else { temp[i] = t; if (t < low_limit[i]) valve_state[i] = 1; if (t >= high_limit[i]) valve_state[i] = 0; } o = valve_state[i]; output_write (i, o); v = input_get (i); usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/POWER %s\r\n", valve_name[i], o ? "ON" : "OFF")); usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/OPEN %d\r\n", valve_name[i], v)); usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/var1 %.2f\r\n", valve_name[i], scale(low_limit[i]))); usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/var2 %.2f\r\n", valve_name[i], scale(high_limit[i]))); if (!read_failed) { usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/TEMPERATURE %.2f\r\n", valve_name[i], scale(temp[i]))); usart1_queue_buf (msg_buf, sprintf (msg_buf, "\r\nMQTTR stat/%s/DELTA %.2f\r\n", valve_name[i], scale(low_limit[i]-temp[i]))); } i++; if (i >= N_VALVES) i = 0; if (request_search) { request_search = 0; onewire_search(); } read_failed = ds18b20_set_12_convert (&valve_owa[i]); } void logic_slow_tick (void) { semaphore = 1; } void logic_dispatch (void) { }