Отрубается, перезагружается Arduino

Добрый день! Столкнулся с такой проблемой, при работе ик пульта, тухнет LCD экран и будто Arduino перезагружается, либо перезапускает заново скетч. При чём это работает периодически, то устройство в порядке, то будто по питанию просадка, но уже перебрал всё, и выяснил что просадки по питанию нет, Arduino не потребляет более 120 mA

вот код

iarduino_RTC clock(RTC_DS1302, 5, 9, 8);                             
#include <Wire.h>                                 
#include <iarduino_I2C_TDS.h>     
#include <iarduino_I2C_pH.h>
#include <LiquidCrystal_I2C.h>
#include <TimerFreeTone.h>
iarduino_I2C_TDS tds;    
iarduino_I2C_pH sensor; 
LiquidCrystal_I2C lcd(0x27,16,2); 
#include <iarduino_IR_RX.h> 
int RECV_PIN = 11;             
iarduino_IR_RX ir(RECV_PIN); 
int avalue;
int vol = 7;
int key = 6;
int avalue2;
bool fortone = false; 
int mode = 0;
String code;
bool stoped = false;
int n1;
int n2;
int start = 0;
void setup()
{
  mode = 0;
  lcd.init();
  lcd.backlight();
  ir.begin(); 
  pinMode(vol, OUTPUT);
  pinMode(key, OUTPUT);                                          
  tds.begin();
  sensor.begin();
  clock.begin();
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(clock.gettime("d-m, H:i:s"));

}

void loop()
{
  if (ir.check())
  {
    delay(500);
    code = ir.data;
  }

  if (code == "16724175")
  {
    mode = 1;
  }
  else if (code == "16718055")
  {
    mode = 2;
  }
  else if (code == "16743045")
  {
    mode = 3;
  }
  else if (code == "16716015")
  {
    mode = 0;
    lcd.clear();
    code = "";
  }
  else {}

  if (mode == 1)
  {
    on();
  }
  else if (mode == 2)
  {
    off();
  }
  else if (mode == 3)
  {
    show();
    delay(100);
  }
  else if (mode == 0)
  {
    clocks();
  }
  avalue = analogRead(A3);
  avalue2 = analogRead(A2);

  if (avalue < 200)
  {
    if (avalue2 > 300)
    {
      pumpon();
    }
    else
    {
      pumpoff();
    }
  }
  else
  {
    delay(100);
    digitalWrite(key, LOW);
    TimerFreeTone(vol, 500, 500);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("2 BAK");
    lcd.setCursor(0,1);
    lcd.print("PEREPOLNEN!");
    mode = 5;
  }
  delay(500);
}


void clocks()
{
  lcd.setCursor(0,0);
  String data = clock.gettime("d-m, H:i:s");
  delay(100);
  lcd.print(data);
}

void off()
{
  digitalWrite(key, LOW);
  stoped = true;
  delay(100);
}

void on()
{
  if (analogRead(avalue2) > 300)
  {
    digitalWrite(key, HIGH);
    stoped = false;
  }
  else
  {
    TimerFreeTone(vol, 500, 500);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("NET VODI V");
    lcd.setCursor(0,1);
    lcd.print("V PERVOM BAKE");
    digitalWrite(key, LOW);
    delay(3000);
    lcd.clear();
    mode = 0;
    code = "";
  }
}

void show()
{
  lcd.clear();
  lcd.setCursor(0,0);
  if (start >= 1)
  {
    float pH = sensor.getPH();
    int Tds = tds.getTDS();
    if ((pH > 5.5 & pH < 8.5) && (Tds > 70 & Tds < 250))
    {
      lcd.print(pH);
      lcd.print(" pH ");
      lcd.print (tds.get_S());
      lcd.print("Sm/m");
      lcd.setCursor(0,1);
      lcd.print(Tds);
      lcd.print(" TDS - NORMA");
    }
    else
    {
      lcd.print(pH);
      lcd.print(" pH ");
      lcd.print (tds.get_S());
      lcd.print("Sm/m");
      lcd.setCursor(0,1);
      lcd.print(Tds);
      lcd.print(" TDS - NENORMA");
    }
  }
  else
  {
    TimerFreeTone(vol, 500, 500);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("NE XVATAET");
    lcd.setCursor(0,1);
    lcd.print("VODI VO 2 BAKE");
    delay(3000);
    mode = 0;
    code = "";
    lcd.clear();
  }
  
}

void pumpon()
{
  n2 = 0;
  if (stoped == true)
  {
    if (mode == 0)
    {
            
    }
    else
    {
      mode = 3;
      code = "";
    }
  }
  else
  {
    if (fortone == false)
    {
      TimerFreeTone(vol, 500, 500);
      fortone = true;
    }
    digitalWrite(key, HIGH);
    if (n1 == 0)
    {
      lcd.clear();
      
      lcd.setCursor(0,0);
      lcd.print("FILTRACYA");
      lcd.setCursor(0,1);
      lcd.print("VODI");
      mode = 3;
      code = "";
      n1 = 1;
      start++;
      delay(3000); 
    }
    else
    {
      if (mode == 0)
      {

      }
      else
      {
        mode = 3;
        code = "";
      }
    }
  }
  
}

void pumpoff()
{
  n1 = 0;
  if (fortone == true)
  {
    TimerFreeTone(vol, 500, 500);
    fortone = false;
  }

  if (n2 == 0)
  {
    if (start == 0)
    {
      TimerFreeTone(vol, 500, 500);
    }
    else {}
    lcd.clear();
    delay(100);
    lcd.setCursor(0,0);
    lcd.print("NET VODI V");
    lcd.setCursor(0,1);
    lcd.print("V PERVOM BAKE");
    digitalWrite(key, LOW);
    n2 = 1;
    delay(3000);
    if (start == 0)
    {
      mode = 0;
      code = "";
      lcd.clear();
      
    }
    else
    {
      mode = 3;
      code = "";
    }
  }
  else 
  {
    if (mode == 0)
    {

    }
    else
    {
      mode = 3;
      code = "";
    }
  }
  
}

мне также посоветовали поменять delay на millis но в моей программе он не резонен, я задержку использую чтоб банально выводить 1-2 строки на экран в течение 3 секунд и не более, сама программа работает циклически.

Библиотеки от iarduino имеют не самую лучшую репутацию по качеству кода. А у Вас их 4 штуки. Плюс ещё какая-то незнакомая библиотека TimerFreeTone.
У Вас тут несколько внешних устройств, к каждому по библиотеке. Я бы попробовал по одному из кода выкидывать и смотреть - меняется ситуация или нет.
Много устройств на шине I2C. Там всем хорошо? У каждого свой адрес?
А так, проблемы с питанием, конечно, просятся в подозреваемые.

у I2C адреса забиты верно, конфликта нет все три устройства работают. Когда нажимаю на ИК-пульт - где просто подаю на реле LOW → перезагружается Arduino. При чём периодически реле закрывается, экран не тухнет, а иногда происходит такая демагогия

TimerFreeTone нужен для пьезо, так как у меня ИК датчик, обычная библиотека Tone не работает с ик - скетч просто не грузится, поэтому пришлось взять его

и по питанию, все датчики и с lcd вместе потребляют до 100мА, а arduino дает за глаза. пробовал уже датчики от arduino отдельно - такая же история

И пока не будет полной схемы (от слова полной, с питанием и свей остальной лабудой), разговор будет исключительно “в пользу бедных”.

по моему тут даже дальше гадать не надо.

схему рисуйте, что коммутирует реле?

1 лайк

вы используете задержку 0.5 сек всегда в цикле, плюс 0.5 сек при получении любой ИК команды, плюс 3 сек при показе часов.
И так каждый раз.

В итоге, я думаю, с такими задержками программой просто невозможно будет пользоваться.
Хотя к перезагрузке это приводить не должно.

А вот это просто смешно…

я могу убрать задержку в цикле 0.5, и 0.5 после ик, 3 секунды банально нужно чтобы задержать 1 строчку на lcd, не меняет ситуации

ну-ну


убрал delay полностью в коде, отрубил библиотеку ir, такая же история, периодически тухнет lcd и перезапускается скетч будто или сама arduino

В setup сделайте вывод SETUP на экран и паузу … Если увидите больше чем один раз = ПЕРЕЗАГРУЖАЕТСЯ !

да перезагружается

А источник питания способен обеспечить ей эти 120мА?

подаю питание через внешний бп 12в 2A - вполне

А мне одному кажется что реле раком подключено ???

управление на вход реле IN - пин 6, dc+ dc- от arduino, com + com - на насос уже