Веб реле по таймеру /помогите
- Войдите на сайт для отправки комментариев
Ср, 08/06/2016 - 00:46
Есть программа, управления 6 реле через WEB, но как оказалось работает все туговато.
Вообщем в чем проблемы : Кнопка запуска таймеров (не работает как нопка, работает как сенсор пин, ткнул проводком в пин и программа запустилась, подтяжка 10КоМ не помогает)
Кнопка Ресета, сбрасывает введеные ранее даные (мин), но по сути должна вернуть контроллер в режим ожидания(так же работает как сенсор пин)
После отработки допустим 3 или 2 реле поочередно, не переходит в режим ожидания( тупо крутит их по кругу без остановки)
Помогите разобраться оть с программной частью, эл я постараюсь уж решить сам. Собственно само детище:
/*============================================================================= Порты 1, 3, 4, 10, 11, 12, 13 заняты под SPI Порты под УЗ датчики: 22, 24 26,28 30,32 Распиновка RTC модуля. SDA - 20 SCL - 21 Распиновка контактов реле: Реле 1 - 38 Реле 2 - 40 Реле 3 - 42 Реле 4 - 44 Реле 5 - 46 Реле 6 - 48 */ #include <Ethernet.h> #include <SPI.h> #include <RTC.h> #include <SD.h> #define Relay_1_pin 38 #define Relay_2_pin 40 #define Relay_3_pin 42 #define Relay_4_pin 44 #define Relay_5_pin 46 #define Relay_6_pin 48 #define ResetPin 33 #define StartPin 34 #define REQ_BUF_SZ 30 char HTTP_req[REQ_BUF_SZ] = { 0}; char req_index = 0; RTC time; long dist_1; long dist_2; long dist_3; int current_minute; int start_second; byte r1; byte r2; byte r3; byte r4; byte r5; byte r6; byte minute_tick=0; byte cycle_stage=1; bool r1_state; bool r2_state; bool r3_state; bool r4_state; bool r5_state; bool r6_state; bool log_written=false; bool SD_card; bool iswork = false; int value; File myFile; byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; IPAddress ip(192, 168, 1, 50); EthernetServer server(80); void setup() { Serial.begin(9600); time.begin(RTC_DS1307); Ethernet.begin(mac, ip); server.begin(); if (SD.begin(4)) { Serial.println("SD init done"); SD_card = true; } else { Serial.println("SD init failed"); SD_card = false; } if (SD.exists("log.txt")) { Serial.println("Log file exist"); myFile = SD.open("log.txt", FILE_WRITE); if (myFile) { myFile.print("Controller ON in "); myFile.println(time.gettime("d-m-Y, H:i:s")); myFile.close(); } } else { Serial.println("Log file doesn't exist... Trying to create"); Serial.println("Creating log.txt..."); myFile = SD.open("log.txt", FILE_WRITE); if (myFile) { myFile.print("Controller ON in "); myFile.println(time.gettime("d-m-Y, H:i:s")); } myFile.close(); if (SD.exists("log.txt")) { Serial.println("Log file Created"); SD_card = true; } else { Serial.println("Can't create file. Unknown error. Leaving procedure"); SD_card = false; } } current_minute = atoi(time.gettime("i")); pinMode(22, INPUT); pinMode(24, INPUT_PULLUP); pinMode(26, INPUT); pinMode(28, OUTPUT); pinMode(30, INPUT); pinMode(32, OUTPUT); pinMode(Relay_1_pin, OUTPUT); pinMode(Relay_2_pin, OUTPUT); pinMode(Relay_3_pin, OUTPUT); pinMode(Relay_4_pin, OUTPUT); pinMode(Relay_5_pin, OUTPUT); pinMode(Relay_6_pin, OUTPUT); r1 = 0; r1_state = false; r2 = 0; r2_state = false; r3 = 0; r3_state = false; r4 = 0; r4_state = false; r5 = 0; r5_state = false; r6 = 0; r6_state = false; } void loop() { start_mark: if (iswork) { if (atoi(time.gettime("i")) != current_minute && atoi(time.gettime("s")) == start_second) { current_minute = atoi(time.gettime("i")); Serial.print("A minute passed.. Current_minute is "); Serial.println(current_minute); delay(500); minute_tick++; } if (cycle_stage==1){ if(r1==0) { cycle_stage=2; r1_state=false; goto start_mark; } if(!log_written){ log_insert(1, true); log_written=true; } r1_state=true; if (minute_tick==r1){ r1_state=false; log_insert(1, false); log_written=false; cycle_stage=2; minute_tick=0; } } if (cycle_stage==2){ if(r2==0) { r2_state=false; cycle_stage=3; goto start_mark; } if(!log_written){ log_insert(2, true); log_written=true; } r2_state=true; if (minute_tick==r2){ r2_state=false; log_insert(2, false); log_written=false; cycle_stage=3; minute_tick=0; } } if (cycle_stage==3){ if(r3==0) { r3_state=false; cycle_stage=4; goto start_mark; } if(!log_written){ log_insert(3, true); log_written=true; } r3_state=true; if (minute_tick==r3){ r3_state=false; log_insert(3, false); log_written=false; cycle_stage=4; minute_tick=0; } } if (cycle_stage==4){ if(r4==0) { r4_state=false; cycle_stage=5; goto start_mark; } if(!log_written){ log_insert(4, true); log_written=true; } r4_state=true; if (minute_tick==r4){ r4_state=false; log_insert(4, false); log_written=false; cycle_stage=5; minute_tick=0; } } if (cycle_stage==5){ if(r5==0) { r5_state=false; cycle_stage=6; goto start_mark; } if(!log_written){ log_insert(5, true); log_written=true; } r5_state=true; if (minute_tick==r5){ r1_state=false; log_insert(1, false); log_written=false; cycle_stage=6; minute_tick=0; } } if (cycle_stage==6){ if(r6==0) { r6_state=false; cycle_stage=1; goto start_mark; } if(!log_written){ log_insert(6, true); log_written=true; } r6_state=true; if (minute_tick==r6){ r1_state=false; log_insert(6, false); log_written=false; cycle_stage=1; minute_tick=0; iswork=false; myFile = SD.open("log.txt"); if (myFile) { myFile.print(time.gettime("d-m-Y, H:i:s")); myFile.println(" Cycle end"); myFile.close(); } } } } else { if (digitalRead(StartPin)) { Serial.println("All of the distances is less than 5 sm, start work..."); myFile = SD.open("log.txt"); if (myFile) { myFile.print(time.gettime("d-m-Y, H:i:s")); myFile.println(" Start work"); myFile.close(); } iswork = true; cycle_stage=1; start_second = atoi(time.gettime("s")); } } //==========================SERVER================================= EthernetClient client = server.available(); if (client) { //Serial.println("New client"); // an http request ends with a blank line boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); Serial.write(c); if (req_index < (REQ_BUF_SZ - 1)) { HTTP_req[req_index] = c; // save HTTP request character req_index++; } if (c == '\n' && currentLineIsBlank) { if (StrContains(HTTP_req, "GET /set?")) { int var = HTTP_req[10] - '0'; //GET /set?r2_input?123? char buf[10]; byte step_pch = 0; char * pch = strtok(HTTP_req, "?"); while (pch != NULL) { pch = strtok(NULL, "?"); step_pch++; if (step_pch == 1) { value = atoi(strtok(NULL, "?")); Serial.println(value); break; } } switch (var) { case 1: r1 = value; Serial.println("case 1"); break; case 2: r2 = value; Serial.println("case 2"); break; case 3: r3 = value; Serial.println("case 3"); break; case 4: r4 = value; Serial.println("case 4"); break; case 5: r5 = value; Serial.println("case 5"); break; case 6: r6 = value; Serial.println("case 6"); break; } client.print("OK"); goto exit_mark; } if (StrContains(HTTP_req, "GET /ajax")) { client.print(r1_state); client.print("?"); client.print(r2_state); client.print("?"); client.print(r3_state); client.print("?"); client.print(r4_state); client.print("?"); client.print(r5_state); client.print("?"); client.print(r6_state); client.print("?"); client.print(r1); client.print("?"); client.print(r2); client.print("?"); client.print(r3); client.print("?"); client.print(r4); client.print("?"); client.print(r5); client.print("?"); client.print(r6); client.print("?"); if (iswork) { client.print("Работает"); } else { client.print("Ожидает срабатывания датчиков расстояния"); } client.print("?"); client.print(time.gettime("d-m-Y H:i:s")); goto exit_mark; } //if (StrContains()) if (StrContains(HTTP_req, "GET / ")) { Serial.println("html request"); client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connnection: close"); client.println(); myFile = SD.open("relay.htm"); if (myFile) { while (myFile.available()) { client.write(myFile.read()); // send web page to client } myFile.close(); } } else if (StrContains(HTTP_req, "GET /relay.css")) { Serial.println("css request"); myFile = SD.open("relay.css"); if (myFile) { client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/css"); client.println("Connnection: close"); client.println(); if (myFile) { while (myFile.available()) { client.write(myFile.read()); // send web page to client } myFile.close(); } } } exit_mark: req_index = 0; StrClear(HTTP_req, REQ_BUF_SZ); break; } if (c == '\n') { // you're starting a new line currentLineIsBlank = true; } else if (c != '\r') { // you've gotten a character on the current line currentLineIsBlank = false; } } } // give the web browser time to receive the data delay(1); // close the connection: client.stop(); } digitalWrite(Relay_1_pin, r1_state); digitalWrite(Relay_2_pin, r2_state); digitalWrite(Relay_3_pin, r3_state); digitalWrite(Relay_4_pin, r4_state); digitalWrite(Relay_5_pin, r5_state); digitalWrite(Relay_6_pin, r6_state); if (digitalRead(ResetPin)) { iswork=false; r1=0; r2=0; r3=0; r4=0; r5=0; r6=0; } }//loop long request_dist(int echo, int trigger) { digitalWrite(trigger, LOW); delayMicroseconds(2); digitalWrite(trigger, HIGH); delayMicroseconds(10); digitalWrite(trigger, LOW); long duration = pulseIn(echo, HIGH); long distance_cm = duration / 29 / 2; return distance_cm; } void log_insert(byte relay, bool state) { Serial.println("Inserting to log..."); myFile.close(); myFile = SD.open("log.txt", FILE_WRITE); if (myFile) { Serial.print(time.gettime("d-m-Y, H:i:s")); if (state) { Serial.print(" Relay "); Serial.print(relay); Serial.println(" HIGH"); } else { Serial.print(" Relay "); Serial.print(relay); Serial.println(" LOW"); } myFile.print(time.gettime("d-m-Y, H:i:s")); if (state) { myFile.print(" Relay "); myFile.print(relay); myFile.println(" HIGH"); } else { myFile.print(" Relay "); myFile.print(relay); myFile.println(" LOW"); } myFile.close(); Serial.println("Inserting to log file done..."); SD_card = true; } else { Serial.println("Can't open file, ERROR"); SD_card = false; } } void StrClear(char *str, char length) { for (int i = 0; i < length; i++) { str[i] = 0; } } char StrContains(char *str, const char *sfind) { char found = 0; char index = 0; char len; len = strlen(str); if (strlen(sfind) > len) { return 0; } while (index < len) { if (str[index] == sfind[found]) { found++; if (strlen(sfind) == found) { return 1; } } else { found = 0; } index++; } return 0; }
Web морда (заранее сорян за вставку Хтмлщины)
<!DOCTYE html> <html> <head> <meta charset="utf-8"> <title>Система контроля</title> <link rel="stylesheet" href="relay.css"> <script> function start() { nocache = "&nocache=" + Math.random() * 1000000; var request = new XMLHttpRequest(); request.onreadystatechange = function () { if (this.readyState === 4) { if (this.status === 200) { if (this.responseText !== null) { var arrayOfStrings = this.responseText.split("?"); document.getElementById("r1").innerHTML = arrayOfStrings[0]; document.getElementById("r2").innerHTML = arrayOfStrings[1]; document.getElementById("r3").innerHTML = arrayOfStrings[2]; document.getElementById("r4").innerHTML = arrayOfStrings[3]; document.getElementById("r5").innerHTML = arrayOfStrings[4]; document.getElementById("r6").innerHTML = arrayOfStrings[5]; document.getElementById("r1_interval").innerHTML = arrayOfStrings[6]; document.getElementById("r2_interval").innerHTML = arrayOfStrings[7]; document.getElementById("r3_interval").innerHTML = arrayOfStrings[8]; document.getElementById("r4_interval").innerHTML = arrayOfStrings[9]; document.getElementById("r5_interval").innerHTML = arrayOfStrings[10]; document.getElementById("r6_interval").innerHTML = arrayOfStrings[11]; document.getElementById("iswork").innerHTML = arrayOfStrings[12]; document.getElementById("time").innerHTML = arrayOfStrings[13]; } } } } request.open("GET", "ajax" + nocache, true); request.send(); setTimeout('start()', 3000); } function send(referer) { var id= referer.id; var value = document.getElementById(id).value; nocache = "&nocache=" + Math.random() * 1000000; var request = new XMLHttpRequest(); request.onreadystatechange = function () { if (this.readyState === 4) { if (this.status === 200) { if (this.responseText !== null) { } } } } request.open("GET", "set?"+id +"?"+value+"?"+ nocache, true); request.send(); } </script> </head> <body onload="start()"> <div class="clear"> <h2 id="time">Запрашиваем</h2> <h2 id="iswork">Запрашиваем</h2> </div> <div class="L_state"> <h3>Состояние индикаторов</h3> <p id="r1">Запрашиваем</p> <p id="r2">Запрашиваем</p> <p id="r3">Запрашиваем</p> </div> <div class="L_interval"> <h3>Текущий интервал</h3> <p><span id="r1_interval">Запрашиваем</span> минут <p><span id="r2_interval">Запрашиваем</span> минут <p><span id="r3_interval">Запрашиваем</span> минут </div> <div class="L_input"> <h3>Поле ввода</h3> <form method="get"> <p><input type="text" name="r1" id="r1_input" onchange="send(this);"></p> <p><input type="text" name="r2" id="r2_input" onchange="send(this);"></p> <p><input type="text" name="r3" id="r3_input" onchange="send(this);"></p> </form> </div> <div class="R_state"> <h3>Состояние индикаторов</h3> <p id="r4">Запрашиваем</p> <p id="r5">Запрашиваем</p> <p id="r6">Запрашиваем</p> </div> <div class="R_interval"> <h3>Текущий интервал</h3> <p><span id="r4_interval">Запрашиваем</span> минут</p> <p><span id="r5_interval">Запрашиваем</span> минут</p> <p><span id="r6_interval">Запрашиваем</span> минут</p> </div> <div class="R_input"> <h3>Поле ввода</h3> <p><input type="text" name="r4" id="r4_input" onchange="send(this);"></p> <p><input type="text" name="r5" id="r5_input" onchange="send(this);"></p> <p><input type="text" name="r6" id="r6_input" onchange="send(this);"></p> </div> </body> </html>