Dependencies: BH1750_V2 EthernetInterface Peripherals_krivsky mbed-rtos mbed
main.cpp
- Committer:
- civava
- Date:
- 2018-01-15
- Revision:
- 0:1493befc4146
File content as of revision 0:1493befc4146:
#include "mbed.h" #include "rtos.h" #include "EthernetInterface.h" #include "BH1750.h" #include "Peripherals.h" #define ECHO_SERVER_PORT 23 BH1750 light(I2C_SDA, I2C_SCL); // Senzor osvětlení Humid humidity; // Senzor vlhkosti Temp temperature; // Snímač teploty Vent ventilation; // Otevírání ventilace Fan conditioning; // Ovládání aktivního větrání Heat heating; // Ovládání topení Water irrigation; // Spouštění zavlažování Light illumination; // Ovládání světel enum STAT // Proměnná pro uložení stavu celého systému { READY = 1, SETTINGS, MANUAL, ERROR }sklenikstav; char line1[50], line2[50], line3[50]; // Řetězce pro vypsání stavu skleníku int evaluate(char *str) { switch(sklenikstav) { case READY: if (strcmp(str, "help") == 0) { return 1; } else if (strcmp(str, "stav") == 0) { return 2; } else if (strcmp(str, "set") == 0) { return 3; } else if (strcmp(str, "man") == 0) { return 4; } else if ((strcmp(str, "quit") == 0) || (strcmp(str, "exit") == 0)) { return 5; } else return 0; case SETTINGS: return 0; case MANUAL: if (strcmp(str, "zalij") == 0) { return 1; } else if (strcmp(str, "nezalevej") == 0) { return 2; } else if (strcmp(str, "ventot") == 0) { return 3; } else if (strcmp(str, "ventzav") == 0) { return 4; } else if (strcmp(str, "vetranizap") == 0) { return 5; } else if (strcmp(str, "vetranivyp") == 0) { return 6; } else if (strcmp(str, "topzap") == 0) { return 7; } else if (strcmp(str, "topvyp") == 0) { return 8; } else if (strcmp(str, "svetlozap") == 0) { return 9; } else if (strcmp(str, "svetlovyp") == 0) { return 10; } else if (strcmp(str, "zpet") == 0) { return 11; } else if ((strcmp(str, "quit") == 0) || (strcmp(str, "exit") == 0)) { return 12; } else return 0; default: return 0; } } void state(void) { sprintf(line1, "Teplota:\t%.1f \tdegC\r\n", temperature.readTemperature()); sprintf(line2, "Vlhkost:\t%d \t%%\r\n", humidity.readHumidity()); sprintf(line3, "Osvetleni:\t%d \tlx\r\n", light.singleMeas()); } void watering_thread(void) { while(true) { uint8_t hum = humidity.readHumidity(); float avghum = 0; if(hum < humidity.getLimit()) { for(int i=0; i<6; i++) { avghum += humidity.readHumidity(); } avghum /= 6; if(avghum < humidity.getLimit()) { irrigation.Start(); Thread::wait(180000); irrigation.Stop(); } avghum = 0; } Thread::wait(900000); } } void venting_thread() { while(true) { uint8_t temp = temperature.readTemperature(); float avgtemp = 0; if(temp > temperature.getVentLimit()) { for(int i=0; i<6; i++) { avgtemp += temperature.readTemperature(); } avgtemp /= 6; if(avgtemp > temperature.getVentLimit()) { ventilation.open(); conditioning.Start(); heating.Stop(); } avgtemp = 0; } else if(temp > temperature.getHighLimit()) { for(int i=0; i<6; i++) { avgtemp += temperature.readTemperature(); } avgtemp /= 6; if(avgtemp > temperature.getHighLimit()) { ventilation.open(); conditioning.Stop(); heating.Stop(); } avgtemp = 0; } else if(temp < temperature.getLowLimit()) { for(int i=0; i<6; i++) { avgtemp += temperature.readTemperature(); } avgtemp /= 6; if(avgtemp < temperature.getLowLimit()) { ventilation.close(); conditioning.Stop(); heating.Start(); } avgtemp = 0; } else { ventilation.close(); conditioning.Stop(); heating.Stop(); } Thread::wait(100000); } } void lighting_thread() { uint16_t lx[6]; for(int i=0; i<6; i++) { lx[i] = light.singleMeas(); } while(true) { uint16_t avglx = 0; for(int i=0; i<5; i++) { lx[i] = lx[i+1]; } lx[5] = light.singleMeas(); for(int i=0; i<6; i++) { avglx += lx[i]; } avglx /= 6; if(avglx<light.getLimit()) { illumination.Start(); } else { illumination.Stop(); } Thread::wait(300000); } } int main () { sklenikstav = READY; //Thread thread1(watering_thread); /*Thread thread2(venting_thread); Thread thread3(lighting_thread);*/ //thread.start(watering_thread); //thread2.start(venting_thread); //thread3.start(lighting_thread); //Thread thread1(watering_thread, NULL, osPriorityNormal, DEFAULT_STACK_SIZE, NULL); EthernetInterface eth; char mac[6]; mbed_mac_address(mac); printf("\r\n\r\n"); printf("FRDM-K64F mbed ethernet...\r\n"); printf("MAC is %02x:%02x:%02x:%02x:%02x:%02x\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); eth.init(); // Použití DHCP (v routeru nastavena pevná adresa pro MAC adresu zařízení) if (eth.connect()) return -1; printf("IP Address is %s\r\n", eth.getIPAddress()); TCPSocketServer server; server.bind(ECHO_SERVER_PORT); server.listen(); char commandwait[] = "\nZadejte prikaz:\t"; while (true) { printf("\nWait for new connection...\r\n"); TCPSocketConnection client; server.accept(client); //client.set_blocking(false, 1500); // Povolení timeoutu po 1,5s printf("Connection from: %s\r\n", client.get_address()); char welcomemsg[] = "Projekt automatizovaneho skleniku\r\nVytvoril: Josef Krivsky, Leden 2018\r\nPro seznam validnich prikazu pouzijte prikaz 'help'\r\n"; client.send_all(welcomemsg, sizeof(welcomemsg)); client.send_all(commandwait, sizeof(commandwait)); while(true) { char message[256]; char buffer; int number = 0; while (true) { int n = client.receive(&buffer, 1); if ((n <= 0) || (number >= sizeof(message))) break; else if (buffer == 0x0A) number = number; else if (buffer == 0x0D) { message[number] = '\0'; break; } else if ((buffer < 32) || (buffer > 127)) continue; else { message[number] = buffer; number++; } } int x = evaluate(message); if(sklenikstav == READY) { if (x == 0) { client.send_all("Neplatny prikaz!\r\n", 18); client.send_all(commandwait, sizeof(commandwait)); } else if (x == 1) { char helpmsg[] = "stav\t\t-Zobrazeni aktualnich informaci\r\nset\t\t-Nastaveni skleniku\r\nman\t\t-Ovladani skleniku\r\nexit/quit\t-Konec\r\n"; client.send_all(helpmsg, sizeof(helpmsg)); client.send_all(commandwait, sizeof(commandwait)); number = 0; } else if (x == 2) { state(); client.send_all(line1, sizeof(line1)); client.send_all(line2, sizeof(line2)); client.send_all(line3, sizeof(line3)); client.send_all(commandwait, sizeof(commandwait)); sklenikstav = READY; number = 0; } else if (x == 3) { char settings[] = "Prikazy budou doplneny pozdeji - vracim do hlavniho menu\r\n"; client.send_all("Nastaveni:\r\n", 12); client.send_all(settings, sizeof(settings)); client.send_all(commandwait, sizeof(commandwait)); sklenikstav = READY; number = 0; } else if (x == 4) { char manual1[] = "Validni prikazy:\r\nzalij\t\t-Spusti zavlazovani\r\nnezalevej\t-Vypne zavlazovani\r\n"; char manual2[] = "ventot\t\t-Otevre ventilaci\r\nventzav\t\t-Zavre ventilaci\r\nvetranizap\t-Zapne vetrak\r\nvetranivyp\t-Vypne vetrak\r\n"; char manual3[] = "topzap\t\t-Zapne topeni\r\ntopvyp\t\t-Vypne topeni\r\nsvetlozap\t-Zapne osvetleni\r\nsvetlovyp\t-Vypne osvetleni\r\n"; char manual4[] = "zpet\t\t-Navrat do hlavniho menu\r\nexit/quit\t-Konec\r\n"; client.send_all("Manualni ovladani\r\n", 19); client.send_all(manual1, sizeof(manual1)); client.send_all(manual2, sizeof(manual2)); client.send_all(manual3, sizeof(manual3)); client.send_all(manual4, sizeof(manual4)); client.send_all(commandwait, sizeof(commandwait)); sklenikstav = MANUAL; number = 0; } else { break; } } //break; else if(sklenikstav == SETTINGS) sklenikstav = READY; else if(sklenikstav == MANUAL) { if (x == 0) { client.send_all("Neplatny prikaz!\r\n", 18); client.send_all(commandwait, sizeof(commandwait)); } else if (x==1) { client.send_all("Zalevam\r\n", 9); irrigation.Start(); client.send_all(commandwait, sizeof(commandwait)); } else if (x==2) { client.send_all("Nezalevam\r\n", 11); irrigation.Stop(); client.send_all(commandwait, sizeof(commandwait)); } else if (x==3) { client.send_all("Oteviram ventilaci\r\n", 20); ventilation.open(); client.send_all(commandwait, sizeof(commandwait)); } else if (x==4) { client.send_all("Zaviram ventilaci\r\n", 19); ventilation.close(); client.send_all(commandwait, sizeof(commandwait)); } else if (x==5) { client.send_all("Spoustim ventilator\r\n", 21); conditioning.Start(); client.send_all(commandwait, sizeof(commandwait)); } else if (x==6) { client.send_all("Vypinam ventilator\r\n", 20); conditioning.Stop(); client.send_all(commandwait, sizeof(commandwait)); } else if (x==7) { client.send_all("Spoustim topeni\r\n", 17); heating.Start(); client.send_all(commandwait, sizeof(commandwait)); } else if (x==8) { heating.Stop(); client.send_all("Vypinam topeni\r\n", 16); client.send_all(commandwait, sizeof(commandwait)); } else if (x==9) { illumination.Start(); client.send_all("Spoustim svetla\r\n", 17); client.send_all(commandwait, sizeof(commandwait)); } else if (x==10) { illumination.Stop(); client.send_all("Vypinam svetla\r\n", 16); client.send_all(commandwait, sizeof(commandwait)); } else if (x==11) { client.send_all(welcomemsg, sizeof(welcomemsg)); client.send_all(commandwait, sizeof(commandwait)); sklenikstav = READY; } else { break; } } } client.send_all("Closing\r\n", 9); printf("Closing"); client.close(); } }