Веб реле по таймеру /помогите
- Войдите на сайт для отправки комментариев
Ср, 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>