Зависани andurino UNO

sanek100
Offline
Зарегистрирован: 26.01.2021

Здравствуйте, есть две andurino uno одна сервер , вторая клиент, задача открывать шлагбаум при нажатии на кнопку, все работает, но периодически зависает сервер, может проработать день, может неделю, работа восстанавливается только после отключения питания на сервере, подскажите может что с кодом не так ? Серверный andurino питается от внешнего блока питания 9вольт 6 ампер , так же питал и от 5 вольт 2.3 ампера, результат один и тот же

Сервер:

#include <SPI.h>
#include <Ethernet.h>

#define OUT 8   //номер выхода для шлагбаума

byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x02 };    
uint16_t k=0; 

IPAddress ip(192,168,88,5);  // IP адрес сервера

EthernetServer server(80);

void setup()
{
  pinMode(OUT, OUTPUT);       //инициализируем 8 пин как выход для шлагбаума     
  digitalWrite(OUT, HIGH);           
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600);
  delay(5);
  Serial.println("start");  
}

void loop()
{
  EthernetClient client = server.available();
  if(client){                                      
    while (client.connected()) {  
      if (client.available()) {  
        char c = client.read();       
        Serial.print(c);                                             
                              
        if(c == '$' && k<100){   
          k=0;                           
            c = client.read();
            Serial.println(c);
            if(c == '1'){                        
            Serial.println("ON");
            digitalWrite(OUT, HIGH);                
            }
            
            if(c == '2'){                            
            Serial.println("OFF");
            digitalWrite(OUT, LOW);               
            }    
          client.println("HTTP/1.1 200 OK");          //заголовочная информация
          client.println("Content-Type: text/html");
          client.println("Connection: close");  
          client.println("Refresh: 30");              //автоматическое обновление каждые 30 сек
          client.println();
          client.println("<!DOCTYPE HTML>");          //HTML тип документа
          client.println("<html>");                   //открытие тега HTML 
          client.print("<title>My web Server</title>");                  //название страницы
          client.print("<H1>My web Server</H1>");                        //заголовк на странице
          client.print("<a href=\"/$1\"><button>ON</button></a>");       //кнопка включить
          client.print("<a href=\"/$2\"><button>OFF</button></a>");      //кнопка выключить
          client.println("<br />");       
          client.println("</html>");                  //закрываем тег HTML
          break;                                      //выход
        }else{
          k++;  
        }
         
      }
      
    }
  
    delay(1);  
    client.stop(); 
  }
  static uint32_t timer_10_sec=millis();
  if(digitalRead(OUT)){
  if(millis()-timer_10_sec>=10000){
  Serial.println("OFF");
  digitalWrite(OUT,LOW);}
  }else{timer_10_sec=millis();
  }
}

Клиент:

#include <SPI.h>
#include <Ethernet.h>

#define BUT 2     //пин для кнопки
#define LED A0

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server(192,168,88,5);   //IP сервера 
IPAddress ip(192, 168, 88, 6);    //IP этого устройства
EthernetClient client;

int i=0;
uint32_t Time=0;

void setup() {
  pinMode(LED, OUTPUT);
  pinMode(BUT, INPUT_PULLUP);
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  digitalWrite(LED, 0);
  delay(1000);
  digitalWrite(LED, i);
  
  Serial.println("connecting...");
  if (client.connect(server, 80)) {
    Serial.println("---------------");
    // Создаем HTTP-запрос
    client.println("GET /utc/now HTTP/1.1");
    client.println("Host: <a href=\"http://192.168.88.5/$1\" rel=\"nofollow\">http://192.168.88.5/$1</a>");
    client.println("User-Agent: arduino-ethernet");
    client.println("Connection: close");
    client.println();
    digitalWrite(LED, i);
  } 
  else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
  Time=millis();
}

void loop() {

  if(!digitalRead(BUT) && millis()-Time>3000)
    delay(9);
    if(!digitalRead(BUT) && millis()-Time>3000){
        Serial.println("connecting...");
        if (client.connect(server, 80)){
          Serial.println("---------------");
          // Создаем HTTP-запрос
          client.println("GET /utc/now HTTP/1.1");
          if(i){
            client.println("Host: <a href=\"http://192.168.88.5/$1\" rel=\"nofollow\">http://192.168.88.5/$1</a>");
            i=0;
            digitalWrite(LED, i);
          }else{
            client.println("Host: <a href=\"http://192.168.88.5/$1\" rel=\"nofollow\">http://192.168.88.5/$1</a>");
            i=1;
            digitalWrite(LED, i);
          }  
          client.println("User-Agent: arduino-ethernet");
          client.println("Connection: close");
          client.println();
        } 
        else {
          // if you didn't get a connection to the server:
          Serial.println("connection failed");
        } 
        Time=millis();
    }
  delay(150);
  if (client.available()) {
    while(client.available()){
      char c = client.read();
      Serial.print(c);
    }
  }
  
  if(millis()-Time<0)       //если millis обнулился, то надо обнулить и переменную Time (примерно раз в 50 дней)
    Time=millis();
  
  // Если соединение прервано, отключаем клиент
  if (!client.connected()) {
 //   Serial.println();
 //   Serial.println("---------------");
 //   Serial.println("disconnecting");
    client.stop();
    // Останавливаем выполнение программы
    // while (true);
  }
}

 

sanek100
Offline
Зарегистрирован: 26.01.2021

Забыл добавить, пинги до сервера доходят

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Это мне напоминает рекламу:

Стоит дефка, стирает бельё в речке. Сзади подбегает...

Комментатор - "Ебстали, ебстут и будут ебсьать, пока Вы не изучите си!"

Green
Offline
Зарегистрирован: 01.10.2015

Да, только это была реклама стиральной машинки "снежинка".)

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Green пишет:

Да, только это была реклама стиральной машинки "снежинка".)

Да, но я оптимизировал до уровня ТС.

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

sanek100 пишет:

Шлагбаум через реле управляется? Через какое или как?

Думаю, что откуда-то прилетает помеха. Можно, конечно, аппаратный watchdog прикрутить к серверу.

sadman41
Offline
Зарегистрирован: 19.10.2016

Согласен с AndreyD. Очень похоже, что от релюхи прилетает. Хотя, как знать - может оно собрано на dupont-ах.

sanek100
Offline
Зарегистрирован: 26.01.2021

AndreyD пишет:

sanek100 пишет:

Шлагбаум через реле управляется? Через какое или как?

Думаю, что откуда-то прилетает помеха. Можно, конечно, аппаратный watchdog прикрутить к серверу.

 

Да, управляется через такое реле https://ibb.co/KVn2BYz , питается от отдельного источника питания, минусы объедены с arduino

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

sanek100 пишет:

Да, управляется через такое реле https://ibb.co/KVn2BYz , питается от отдельного источника питания, минусы объедены с arduino

А шлагбаум и ардуинка питаются с одной линии, может иногда пробивает источник питания ардуинки. Т.е. можно попробовать конденсатор ближе к входам питания ардуинки припаять.

sanek100
Offline
Зарегистрирован: 26.01.2021

Нет, от разных источников