Веб реле по таймеру /помогите

Нет ответов
dozbot
dozbot аватар
Offline
Зарегистрирован: 12.01.2013

Есть программа, управления 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>