Зависани andurino UNO
- Войдите на сайт для отправки комментариев
Сб, 06/02/2021 - 18:01
Здравствуйте, есть две 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); } }
Забыл добавить, пинги до сервера доходят
Это мне напоминает рекламу:
Стоит дефка, стирает бельё в речке. Сзади подбегает...
Комментатор - "Ебстали, ебстут и будут ебсьать, пока Вы не изучите си!"
Да, только это была реклама стиральной машинки "снежинка".)
Да, только это была реклама стиральной машинки "снежинка".)
Да, но я оптимизировал до уровня ТС.
Шлагбаум через реле управляется? Через какое или как?
Думаю, что откуда-то прилетает помеха. Можно, конечно, аппаратный watchdog прикрутить к серверу.
Согласен с AndreyD. Очень похоже, что от релюхи прилетает. Хотя, как знать - может оно собрано на dupont-ах.
Шлагбаум через реле управляется? Через какое или как?
Думаю, что откуда-то прилетает помеха. Можно, конечно, аппаратный watchdog прикрутить к серверу.
Да, управляется через такое реле https://ibb.co/KVn2BYz , питается от отдельного источника питания, минусы объедены с arduino
Да, управляется через такое реле https://ibb.co/KVn2BYz , питается от отдельного источника питания, минусы объедены с arduino
А шлагбаум и ардуинка питаются с одной линии, может иногда пробивает источник питания ардуинки. Т.е. можно попробовать конденсатор ближе к входам питания ардуинки припаять.
Нет, от разных источников