Добрый день! Столкнулся с такой проблемой, при работе ик пульта, тухнет 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 лайк
MMM
27.Май.2024 11:17:35
10
вы используете задержку 0.5 сек всегда в цикле, плюс 0.5 сек при получении любой ИК команды, плюс 3 сек при показе часов.
И так каждый раз.
В итоге, я думаю, с такими задержками программой просто невозможно будет пользоваться.
Хотя к перезагрузке это приводить не должно.
А вот это просто смешно…
я могу убрать задержку в цикле 0.5, и 0.5 после ик, 3 секунды банально нужно чтобы задержать 1 строчку на lcd, не меняет ситуации
убрал delay полностью в коде, отрубил библиотеку ir, такая же история, периодически тухнет lcd и перезапускается скетч будто или сама arduino
В setup сделайте вывод SETUP на экран и паузу … Если увидите больше чем один раз = ПЕРЕЗАГРУЖАЕТСЯ !
BOOM
27.Май.2024 12:31:42
17
А источник питания способен обеспечить ей эти 120мА?
подаю питание через внешний бп 12в 2A - вполне
А мне одному кажется что реле раком подключено ???
управление на вход реле IN - пин 6, dc+ dc- от arduino, com + com - на насос уже