Задать вопрос

Как исправить зависание arduino мега?

Ардуино мега с изернет шилдом, подключено реле и насос (насос питается отдельно от ардуинки).
Насос должен запускаться каждые 3 секунды на полторы секунды.
Работает примерно около двух часов и все зависает. ардуинка перестает отвечать, пока не перезагрузиш ее.

При необходимости залью скетч.
Возможно кто-то сталкивался и может помочь с данной проблемой.

Прикладываю код скетча
#include "Adafruit_VL53L0X.h"               
Adafruit_VL53L0X lox = Adafruit_VL53L0X();
#include <Wire.h> // библиотека для управления устройствами по I2C 
#include <LiquidCrystal_I2C.h> // подключаем библиотеку для QAPASS 1602
#include <Ethernet.h>
#include <SPI.h>
unsigned long timing;
unsigned long timingcm;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char server[] = "server.loc";
LiquidCrystal_I2C LCD(0x27,16,2); // присваиваем имя LCD для дисплея
#define PIN_REAY 3 //реле
#define CURRENT_SENSOR A2 // Analog input pin that sensor is attached to
float amplitude_current;               //amplitude current
float effective_value;       //effective current 
EthernetClient client;
  
void setup() {
  Ethernet.begin(mac);
  pinMode(PIN_REAY, OUTPUT);
  digitalWrite(PIN_REAY, HIGH);
  
  Serial.begin(9600);                     
  while (! Serial) {
    delay(1);
  }
  
  pins_init();
  
  LCD.init(); // инициализация LCD дисплея
  LCD.backlight(); // включение подсветки дисплея
  LCD.begin(16, 2);                    // Настройка количества столбцов и строк на ЖК-дисплее
  LCD.print("OkVoyt");         // Печать текста на ЖК-дисплее
  
 // Serial.println("Adafruit VL53L0X test");
  if (!lox.begin()) {
  //  Serial.println(F("Failed to boot VL53L0X"));
    while(1);
  }
 // Serial.println(F("VL53L0X API Simple Ranging example\n\n")); 

/*    Serial.println("connecting...");
  if (client.connect(server, 80)) {
    Serial.print("connected to ");
    Serial.println(server);
    // Make a HTTP request:
    client.println("GET /add.php?k=lok&doz2="+ String(dozator) +" HTTP/1.1");
    client.println("Host: server.loc");
    client.println("Connection: close");
    client.println();
  } else {
    Serial.println("connection failed");
  }
  */
}
 
void loop() {
  if (millis() - timing > 20000){
  timing = millis(); 
  lan_con_th();
 // Serial.println ("205 seconds");
 }
   if (millis() - timingcm > 7000){ // Вместо 10000 подставьте нужное вам значение паузы 
  timingcm = millis(); 
  lansn();
 // Serial.println ("7 seconds");
 }


    int sensor_max;
    sensor_max = getMaxValue();
    Serial.print("sensor_max = ");
    Serial.println(sensor_max);
    //the VCC on the Grove interface of the sensor is 5v
    amplitude_current=(float)(sensor_max-512)/1024*5/185*1000000;// for 5A mode,you need to modify this with 20 A and 30A mode; 
    effective_value=amplitude_current/1.414;
    //minimum_current=1/1024*5/185*1000000/1.414=18.7(mA)
    //Only for sinusoidal alternating current
   // Serial.println("The amplitude of the current is(in mA)");
  //  Serial.println(amplitude_current,1);//Only one number after the decimal point
   // Serial.println("The effective value of the current is(in mA)");
   // Serial.println(effective_value,1);


if (effective_value > 200){
      digitalWrite(PIN_REAY, LOW);
      delay (3000);
      digitalWrite(PIN_REAY, HIGH);
      delay (1500);
      } else {
        digitalWrite(PIN_REAY, LOW);
        Serial.println("Stop nasos");
        }
}
 void lansn()
{
        LCD.clear(); 
      LCD.setCursor(0, 0);
      LCD.print("Nasos mm");
      LCD.setCursor(0, 1);
      LCD.print(effective_value);
}

 void lan_con_th()
{
  VL53L0X_RangingMeasurementData_t measure;
  
  Serial.print("Reading a measurement... ");
  lox.rangingTest(&measure, false); 
 
  if (measure.RangeStatus != 4) {  
    Serial.print("Distance (mm): "); 
    Serial.println(measure.RangeMilliMeter);
  } else {
    Serial.println(" out of range ");
  }
      LCD.clear(); 
      LCD.setCursor(0, 0);
      LCD.print("Glubina mm");
      LCD.setCursor(0, 1);
      LCD.print(measure.RangeMilliMeter);
            
  if (client.connect(server, 80)) {
    Serial.print("connected to ");
    Serial.println(server);
    client.println("GET /add.php?k=loc&h2="+ String(measure.RangeMilliMeter) +"&doz2="+ String(effective_value) +" HTTP/1.1");
    client.println("Host: server.loc");
    client.println("Connection: close");
    client.println();
  } else {
    Serial.println("connection failed");
  }

  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    for(;;)
      ;
  }
}

void pins_init()
{
    pinMode(CURRENT_SENSOR, INPUT);
}
/*Function: Sample for 1000ms and get the maximum value from the S pin*/
int getMaxValue()
{
    int sensorValue;             //value read from the sensor
    int sensorMax = 0;
    uint32_t start_time = millis();
    while((millis()-start_time) < 1000)//sample for 1000ms
    {
        sensorValue = analogRead(CURRENT_SENSOR);
        if (sensorValue > sensorMax) 
        {
            /*record the maximum sensor value*/
            sensorMax = sensorValue;
        }
    }
    return sensorMax;
}
  • Вопрос задан
  • 831 просмотр
Подписаться 1 Средний 6 комментариев
Решения вопроса 1
valera_91
@valera_91 Автор вопроса
Решение найдено. Проблема была в том что пропадало соединение с интернетом.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
NeiroNx
@NeiroNx
Программист
А реле питается отдельно от ардуинки? Так то реле тоже сильный источник помех.
Ответ написан
@xDimus
Можно использовать встроенный Watchdog таймер, правда пишут не на всех ардуинах работает. Но лучше всё таки начать с выявления и устранения помех.
Ответ написан
Комментировать
@lonelymyp
Хочу вылезти из минуса по карме.
Если зависает через одинаковое время то ошибка в программе, если случайным образом, то проблема в реле или скачках напряжения при старте насоса.
Реле заменить на SSR, потому что один фиг обычное реле в таком режиме долго не проживёт, сгорит.
Так же стоит убедиться что блок питания ардуино качественный, а не говно за доллар.
Ответ написан
veydlin
@veydlin
Мне никогда не жалко средств на свое любопытство
К реле диод подключен?
Конденсатор тоже бы не помешал
Ответ написан
@BakaTopcat
А micros() случайно не используется? Оно переполняется каждые 70 минут
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы