Прошу помощи разобраться с реле

Brother_Thief
Offline
Зарегистрирован: 11.10.2018

Добрый день. Вопрос мой возможно будет банален, но я надеюсь на подсказку более знающих людей.

Планирую домашнюю автоматику на модулях:

1. Ардуино Мега 2560.
2. Модуль из 16 реле.

Все это выглядит вот так:

Веб морда выглядит пока что так:

Суть проблемы в следующем:

При включении реле от первого и до четырнадцатого, включение происходит отлично, без сбоев, а вот когда я начию выключать реле с четырнадцатого по первый происходит проблема. Она вырожается в следующем, как только я выключаю реле номер 14 то совместно с ним выключается реле номер 4 и тоже самое происходит при включении (и так с 14го по 11, например выключая 11 выключается 1е тоже), но не наоборот, если я включаю 1е, то включается 1е. Надеюсь объяснил понятно.

Прошу взглянуть на скетч (знаю колхозно довольно), и потыкать носом, что же я делаю не так?

 

За ранее благодарю всех, кто потратит на меня свое время. Спасибо.

 

#include <SPI.h>       
#include <Ethernet2.h> 
#include <DHT.h>

#define DHT_1_PIN 40
#define DHT_2_PIN 41
#define DHT_3_PIN 42
#define DHT_4_PIN 43
#define DHT_5_PIN 44
#define DHT_6_PIN 45

DHT dht1(DHT_1_PIN, DHT11), dht2(DHT_2_PIN, DHT11), dht3(DHT_3_PIN, DHT11), dht4(DHT_4_PIN, DHT11),
dht5(DHT_5_PIN, DHT11), dht6(DHT_6_PIN, DHT11);

int relayA = 22,relayB = 23, relayC = 24, relayD = 25, relayE = 26, relayF = 27, relayG = 28,relayJ = 29, 
relayK = 30, relayL = 31, relayM = 32, relayN = 33, relayO = 34,relayP = 35, relayQ = 36, 
relayR = 37, relayS = 38, relayT = 39;

int temp1, temp2, temp3, temp4, temp5, temp6;

float h1, h2, h3, h4, h5, h6, t1, t2, t3, t4, t5, t6;

boolean statusRA, statusRB, statusRC, statusRD, statusRE, statusRF, statusRG, 
statusRJ, statusRK, statusRL, statusRM, statusRN, statusRO, statusRP, statusRQ, 
statusRR, statusRS, statusRT  = false;

String readString;
char c;
byte mac[] = { 0x61, 0x34, 0x41, 0x30, 0x30, 0x49 };
IPAddress ip(10, 0, 0, 238);
EthernetServer server(81);

void setup() {
  pinMode(relayA, OUTPUT);  pinMode(relayB, OUTPUT);  pinMode(relayC, OUTPUT);  pinMode(relayD, OUTPUT);
  pinMode(relayE, OUTPUT);  pinMode(relayF, OUTPUT);  pinMode(relayG, OUTPUT);  pinMode(relayJ, OUTPUT);
  pinMode(relayK, OUTPUT);  pinMode(relayL, OUTPUT);  pinMode(relayM, OUTPUT);  pinMode(relayN, OUTPUT);
  pinMode(relayO, OUTPUT);  pinMode(relayP, OUTPUT);  pinMode(relayQ, OUTPUT);  pinMode(relayR, OUTPUT);
  pinMode(relayS, OUTPUT);  pinMode(relayT, OUTPUT);
    
  Serial.begin(9600);
  while (!Serial) { ; }
  Ethernet.begin(mac, ip);
  server.begin();
  dht1.begin(); dht2.begin(); dht3.begin(); dht4.begin(); dht5.begin(); dht6.begin();
}

void loop() {
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {   
      if (client.available()) {
        c = client.read(); 
        if (readString.length() < 100) {
          readString += c;
        }
  if (c == '\n') {
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println();     
  client.println("<HTML>");
  client.println("<HEAD>");
  client.println("<meta http-equiv=\"Refresh\" content=\"4; url=/Home_controller\" />");
  client.println("<meta http-equiv=\"Content-Type\" content=\"application/vnd.wap.xhtml+xml; charset=utf-8\" />");
  client.println("<TITLE>Комнатная автоматика</TITLE>");
  client.println("</HEAD>");
  client.println("<BODY align=\"center\">");
  client.println("<h1>Пульт управления реле </h1>");
  client.println("<hr />"); 
  client.println("<br />"); 
  client.println("<br />"); 
  client.println("<table align=\"center\"><tr>");
  client.println("<th width=\"10%\">Номер розетки</th>");
  client.println("<th width=\"10%\">Тумблер управления</th>");
  client.println("<th width=\"10%\">Номер комнаты</th>");
  client.println("<th width=\"10%\">Статус комнаты</th></tr>");
  client.println("<tr class=\"trh1\"><td align=\"center\">");
  client.println(" ");
  client.println(" ");
  client.println("Состояние розетки 1");
  client.println("</td><td align=\"center\">");
  if (statusRA == false) {
    client.println("<a href=\"/1on\" />Включено</a>");
  } else {
    client.println("<a href=\"/1off\" />Выключено</a>");
  }
 client.println("</td><td align=\"center\">");
   client.println("Комната № 1");
  client.println("</td><td align=\"center\">");
  client.print("Влажность: ");
  client.println(h1);
  client.print("Температура: " );
  client.print(t1);
  
  client.println("</td></tr>");
  client.println();
  client.println("<tr class=\"trh2\"><td align=\"center\">");
  client.println(" ");
  client.println(" ");
  client.println("Состояние розетки 2");
  client.println("</td><td align=\"center\">");
  
  if (statusRB == false) {
    client.println("<a href=\"/2on\" />Включено</a>");
  } else {
    client.println("<a href=\"/2off\" />Выключено</a>");
  }

client.println("</td><td align=\"center\">");
   client.println("Комната № 2");
  client.println("</td><td align=\"center\">");
  client.print("Влажность: ");
  client.println(h2);
  client.print("Температура: " );
  client.print(t2);
  
  client.println("</td></tr>");
  client.println();
  client.println("<tr class=\"trh1\"><td align=\"center\">");
  client.println(" ");
  client.println(" ");
  client.println("Состояние розетки 3");
  client.println("</td><td align=\"center\">");
  
  if (statusRC == false) {
    client.println("<a href=\"/3on\" />Включено</a>");
  } else {
    client.println("<a href=\"/3off\" />Выключено</a>");
  }

  client.println("</td><td align=\"center\">");
  client.println("Комната № 3");
  client.println("</td><td align=\"center\">");
  client.print("Влажность: ");
  client.println(h3);
  client.print("Температура: " );
  client.print(t4);
  
  client.println("</td></tr>");
  client.println();
  client.println("<tr class=\"trh2\"><td align=\"center\">");
  client.println(" ");
  client.println(" ");
  client.println("Состояние розетки 4");
  client.println("</td><td align=\"center\">");
  
  if (statusRD == false) {
     client.println("<a href=\"/4on\" />Включено</a>");
  } else {
     client.println("<a href=\"/4off\" />Выключено</a>");
  }

  client.println("</td><td align=\"center\">");
  client.println("Комната № 4");
  client.println("</td><td align=\"center\">");
  client.print("Влажность: ");
  client.println(h4);
  client.print("Температура: " );
  client.print(t4);

  client.println("</td></tr>");
  client.println();
  client.println("<tr class=\"trh1\"><td align=\"center\">");
  client.println(" ");
  client.println(" ");
  client.println("Состояние розетки 5");
  client.println("</td><td align=\"center\">");
  
  if (statusRE == false) {
     client.println("<a href=\"/5on\" />Включено</a>");
  } else {
     client.println("<a href=\"/5off\" />Выключено</a>");
  }

client.println("</td><td align=\"center\">");
   client.println("Комната № 5");
  client.println("</td><td align=\"center\">");
  client.print("Влажность: ");
  client.println(h5);
  client.print("Температура: " );
  client.print(t5);
  
  client.println("</td></tr>");
  client.println();
  client.println("<tr class=\"trh2\"><td align=\"center\">");
  client.println(" ");
  client.println(" ");
  client.println("Состояние розетки 6");
  client.println("</td><td align=\"center\">");
  
  if (statusRF == false) {
     client.println("<a href=\"/6on\" />Включено</a>");
  } else {
     client.println("<a href=\"/6off\" />Выключено</a>");
  }

client.println("</td><td align=\"center\">");
   client.println("Комната № 6");
  client.println("</td><td align=\"center\">");
  client.print("Влажность: ");
  client.println(h6);
  client.print("Температура: " );
  client.print(t6);
  
  client.println("</td></tr>");
  client.println();
  client.println("<tr class=\"trh1\"><td align=\"center\">");
  client.println(" ");
  client.println(" ");
  client.println("Состояние розетки 7");
  client.println("</td><td align=\"center\">");
  
  if (statusRG == false) {
     client.println("<a href=\"/7on\" />Включено</a>");
  } else {
     client.println("<a href=\"/7off\" />Выключено</a>");
  }
  client.println("</td></tr>");
  client.println();
  client.println("<tr class=\"trh2\"><td align=\"center\">");
  client.println(" ");
  client.println(" ");
  client.println("Состояние розетки 8");
  client.println("</td><td align=\"center\">");
  
  if (statusRJ == false) {
     client.println("<a href=\"/8on\" />Включено</a>");
  } else {
     client.println("<a href=\"/8off\" />Выключено</a>");
  }
  client.println("</td></tr>");
  client.println();
  client.println("<tr class=\"trh1\"><td align=\"center\">");
  client.println(" ");
  client.println(" ");
  client.println("Состояние розетки 9");
  client.println("</td><td align=\"center\">");
  
  if (statusRK == false) {
     client.println("<a href=\"/9on\" />Включено</a>");
  } else {
     client.println("<a href=\"/9off\" />Выключено</a>");
  }
  client.println("</td></tr>");
  client.println();
  client.println("<tr class=\"trh2\"><td align=\"center\">");
  client.println(" ");
  client.println(" ");
  client.println("Состояние розетки 10");
  client.println("</td><td align=\"center\">");
  
  if (statusRL == false) {
     client.println("<a href=\"/10on\" />Включено</a>");
  } else {
     client.println("<a href=\"/10off\" />Выключено</a>");
  }
  client.println("</td></tr>");
  client.println();
  client.println("<tr class=\"trh1\"><td align=\"center\">");
  client.println(" ");
  client.println(" ");
  client.println("Состояние розетки 11");
  client.println("</td><td align=\"center\">");
  
  if (statusRM == false) {
     client.println("<a href=\"/11on\" />Включено</a>");
  } else {
     client.println("<a href=\"/11off\" />Выключено</a>");
  }
  client.println("</td></tr>");
  client.println();
  client.println("<tr class=\"trh2\"><td align=\"center\">");
  client.println(" ");
  client.println(" ");
  client.println("Состояние розетки 12");
  client.println("</td><td align=\"center\">");
  
  if (statusRN == false) {
     client.println("<a href=\"/12on\" />Включено</a>");
  } else {
     client.println("<a href=\"/12off\" />Выключено</a>");
  }
  client.println("</td></tr>");
  client.println();
  client.println("<tr class=\"trh1\"><td align=\"center\">");
  client.println(" ");
  client.println(" ");
  client.println("Состояние розетки 13");
  client.println("</td><td align=\"center\">");
  
  if (statusRO == false) {
     client.println("<a href=\"/13on\" />Включено</a>");
  } else {
     client.println("<a href=\"/13off\" />Выключено</a>");
  }
  client.println("</td></tr>");
  client.println();
  client.println("<tr class=\"trh2\"><td align=\"center\">");
  client.println(" ");
  client.println(" ");
  client.println("Состояние розетки 14");
  client.println("</td><td align=\"center\">");
  
  if (statusRP == false) {
     client.println("<a href=\"/14on\" />Включено</a>");
  } else {
     client.println("<a href=\"/14off\" />Выключено</a>");
  }

  client.println("</td></tr>");
  client.println();
  client.println("</BODY>");  
  delay(1);
  client.stop();

  h1= dht1.readHumidity();
  t1= dht1.readTemperature();
  h2= dht2.readHumidity();
  t2= dht2.readTemperature();
  h3= dht3.readHumidity();
  t3= dht3.readTemperature(); 
  h4= dht4.readHumidity();
  t4= dht4.readTemperature();
  h5= dht5.readHumidity();
  t5= dht5.readTemperature();
  h6= dht6.readHumidity();
  t6= dht6.readTemperature();  

//--------------------------------- Диапазон для управления розетками  
           
  if (readString.indexOf("1on") >0){ 
    digitalWrite(relayA, HIGH); 
    statusRA = true; 
  }

  if (readString.indexOf("1off") >0){ 
    digitalWrite(relayA, LOW); 
    statusRA = false; 
  }
  if (readString.indexOf("2on") >0){ 
    digitalWrite(relayB, HIGH); 
    statusRB = true; 
  }
  if (readString.indexOf("2off") >0){ 
    digitalWrite(relayB, LOW); 
    statusRB = false; 
  }
  if (readString.indexOf("3on") >0){ 
    digitalWrite(relayC, HIGH); 
    statusRC = true; 
  }
  if (readString.indexOf("3off") >0){ 
    digitalWrite(relayC, LOW); 
    statusRC = false; 
  }
  if (readString.indexOf("4on") >0){ 
    digitalWrite(relayD, HIGH); 
    statusRD = true; 
  }
  if (readString.indexOf("4off") >0){ 
    digitalWrite(relayD, LOW); 
    statusRD = false; 
  }
  if (readString.indexOf("5on") >0){ 
    digitalWrite(relayE, HIGH); 
    statusRE = true; 
  }
  if (readString.indexOf("5off") >0){ 
    digitalWrite(relayE, LOW); 
    statusRE = false; 
  }
    if (readString.indexOf("6on") >0){ 
    digitalWrite(relayF, HIGH); 
    statusRF = true; 
  }
  if (readString.indexOf("6off") >0){ 
    digitalWrite(relayF, LOW); 
    statusRF = false; 
  }
  if (readString.indexOf("7on") >0){ 
    digitalWrite(relayG, HIGH); 
    statusRG = true; 
  }
  if (readString.indexOf("7off") >0){ 
    digitalWrite(relayG, LOW); 
    statusRG = false; 
  }
  if (readString.indexOf("8on") >0){ 
    digitalWrite(relayJ, HIGH); 
    statusRJ = true; 
  }
  if (readString.indexOf("8off") >0){ 
    digitalWrite(relayJ, LOW); 
    statusRJ = false; 
  }
  if (readString.indexOf("9on") >0){ 
    digitalWrite(relayK, HIGH); 
    statusRK = true; 
  }
  if (readString.indexOf("9off") >0){ 
    digitalWrite(relayK, LOW); 
    statusRK = false; 
  }
  if (readString.indexOf("10on") >0){ 
    digitalWrite(relayL, HIGH); 
    statusRL = true; 
  }
  if (readString.indexOf("10off") >0){ 
    digitalWrite(relayL, LOW); 
    statusRL = false; 
  }
  if (readString.indexOf("11on") >0){ 
    digitalWrite(relayM, HIGH); 
    statusRM = true; 
  }
  if (readString.indexOf("11off") >0){ 
    digitalWrite(relayM, LOW); 
    statusRM = false; 
  }
  if (readString.indexOf("12on") >0){ 
    digitalWrite(relayN, HIGH); 
    statusRN = true; 
  }
  if (readString.indexOf("12off") >0){ 
    digitalWrite(relayN, LOW); 
    statusRN = false; 
  }
  if (readString.indexOf("13on") >0){ 
    digitalWrite(relayO, HIGH); 
    statusRO = true; 
  }
  if (readString.indexOf("13off") >0){ 
    digitalWrite(relayO, LOW); 
    statusRO = false; 
  }
  if (readString.indexOf("14on") >0){ 
    digitalWrite(relayP, HIGH); 
    statusRP = true; 
  }
  if (readString.indexOf("14off") >0){ 
    digitalWrite(relayP, LOW); 
    statusRP = false; 
  }

//--------------------------------- Диапазон для управления кранами
  
  if (t1<=20.0){ 
    digitalWrite(relayQ, LOW); 
  }
  if (t1>=25.0){ 
    digitalWrite(relayQ, HIGH); 
  }
  if (t2<=20.0){ 
    digitalWrite(relayR, LOW); 
  }
  if (t2>=25.0){ 
    digitalWrite(relayR, HIGH); 
  }
  if (t3<=20.0){ 
    digitalWrite(relayS, LOW); 
  }
  if (t3>=25.0){ 
    digitalWrite(relayS, HIGH); 
  }
  if (t4<=20.0){ 
    digitalWrite(relayT, LOW); 
  }
  if (t4>=25.0){ 
    digitalWrite(relayT, HIGH); 
  }
  
  readString=""; } } } } }

 

 

 

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Если на входе попалась строка "11on", то какая строка программы должна отреагировать? 330-я? 411-я? Обе?

Brother_Thief
Offline
Зарегистрирован: 11.10.2018

Вообще должна отреагировать 411, но я кажется понимаю к чему вы клоните. К тому что считывается строка не полностью а лишь ее часть 11on читается как 1on? Я правильно понимаю? Я уже думал об этом, по этому заменил всю нумерацию переменных буквами алфавита. Сейчас проверю.

Brother_Thief
Offline
Зарегистрирован: 11.10.2018

О благодарю тебя! Все заработало. Ведь ну на поверхности было! Можно и удалять тему.

b707
Offline
Зарегистрирован: 26.05.2017

Брат, это не скетч, а какая-то "Палата №6"...

Вам не приходило в голову, что семь абсолютно одинаковых кусков HTML

client.println("</td><td align=\"center\">");
  client.println("Комната № 3");
  client.println("</td><td align=\"center\">");
  client.print("Влажность: ");
  client.println(h3);
  client.print("Температура: " );
  client.print(t4);
  
  client.println("</td></tr>");
  client.println();
  client.println("<tr class=\"trh2\"><td align=\"center\">");
  client.println(" ");
  client.println(" ");
  client.println("Состояние розетки 4");
  client.println("</td><td align=\"center\">");
  
  if (statusRD == false) {
     client.println("<a href=\"/4on\" />Включено</a>");
  } else {
     client.println("<a href=\"/4off\" />Выключено</a>");
  }

можно заменить одним, если положить параметры в массивы?

Блин, неужели непонятно, что большие проекты не пишутся путем многократного копирования маленьких??? Ну изучите вы хоть чуть-чуть язык, прежде чем брать за монстрообразные конструкции из 14 реле...После этого понятно, почему почти каждый новичек сразу хватает Мегу... у них же ничего в Уно-то не влазит...

Brother_Thief
Offline
Зарегистрирован: 11.10.2018

Конечно можно, почему бы и нет. Тогда сразу напрашивается пример. Это первый опыт работы с HTML в ардуино, сам вижу что так себе портянка.

b707
Offline
Зарегистрирован: 26.05.2017

Brother_Thief пишет:

Конечно можно, почему бы и нет. Тогда сразу напрашивается пример. Это первый опыт работы с HTML в ардуино, сам вижу что так себе портянка.

да причем тут HTML? тут речь-то о элементарном знании Си - положить температуру и влажность в массивы и итерировать по ним циклом for

Что, неужели и на это пример нужен?

for (byte i =0; i<7; i++ ) {
  client.println("</td><td align=\"center\">");
  client.print("Комната № ");
  client.println(i);
  client.println("</td><td align=\"center\">");
  client.print("Влажность: ");
  client.println(h[i]);
  client.print("Температура: " );
  client.print(t[i]);
  
  client.println("</td></tr>");
  client.println();
  client.println("<tr class=\"trh2\"><td align=\"center\">");
  client.println(" ");
  client.println(" ");
  client.print("Состояние розетки ");
  client.println(i);
  client.println("</td><td align=\"center\">");
  
  if (statusR[i] == false) {
     client.print("<a href=\"/");
     client.print(i);
     client.println("on\" />Включено</a>");
  } else {
      client.print("<a href=\"/");
     client.print(i);
     client.println("off\" />Выключено</a>");
  }
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Пример не нужен. Нужно вотпрямщас работающее решение как БратуВору надо. 

b707
Offline
Зарегистрирован: 26.05.2017

Дед, меня от подобных проектов просто тошнит уже... мало того, что сама идея управлять светом в комнате по сети - полный бред, так еще и люди, не написавщие до того в жизни и сотни строк на Си - сразу берутся писать управление  на полтора десятка реле...

Где светодиодики? Где блинк через миллис? хотя какой тут миллис, когда человек цикл ФОР не знает.

Brother_Thief
Offline
Зарегистрирован: 11.10.2018

Не надо так ребята, я услышал и увидел, спасибо за пример. А вот желчь не надо тут спускать. Ну не нравится, тошнит, ну зачем заходить, тратить время и что-то, кому-то писать? Решение тут и сейчас я не прошу, свой первый вопрос я исчерпал полностью, а вот остальное вы сами развели. Я же уже выше написал и еще раз повторю, что тему можно закрывать.