Помогите разобраться со сном ардуинки.
- Войдите на сайт для отправки комментариев
Вс, 03/03/2019 - 15:09
Добрый день. Подскажите в чем дело? Не работает скетч. Задача следующая: нужно чтобы ардуинка считала нарастающий счетчик с определенного времени с помощью часов реального времени DS3231, просыпалась от тех же часов, включала дисплей lcd-1600 выводила нарастающее значение и засыпала через 10 секунд на 2 минуты. Скетч без дисплея работает, как только подключаю дисплей, скетч перестает работать. Питание дисплея подключаю на 11 пин. Подскажите пожалуйста, что я делаю не правильно?
[code]
#include "LowPower.h"
#include <Wire.h>
#include <DS3231.h>
#include "GyverTimer.h"
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3f, 16, 2);
GTimer_ms myTimer1(1000);
GTimer_ms myTimer2(1000);
#define PIN 11
const int wakeUpPin = 2;
int count = 0;
int year;
int month;
int day;
int hour;
int min;
unsigned long year_min;
unsigned long month_min;
unsigned long day_min;
unsigned long hour_min;
unsigned long min_min;
unsigned long summ_min;
int summ_min_of;
int year_of = 2019;
int month_of = 3;
int day_of = 3;
int hour_of = 12;
int min_of = 0;
int loga;
DS3231 clock;
RTCDateTime dt;
void wakeUp()
{
}
void setup()
{
pinMode(wakeUpPin, INPUT);
pinMode(PIN, OUTPUT);
Serial.begin (9600);
clock.begin();
// clock.setDateTime(__DATE__, __TIME__);
clock.enableOutput(false);
clock.armAlarm1(false);
clock.armAlarm2(false);
clock.clearAlarm1();
clock.clearAlarm2();
}
void loop()
{
setSleepTimer(2);
timer ();
digitalWrite(PIN, HIGH);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(4, 0);
lcd.print(summ_min);
if (myTimer1.isReady()) {
count++;
Serial.println(count);
}
if (count >= 10) {
Serial.println ("Timer: Entering Sleep mode");
Serial.println(summ_min);
delay(100);
count = 0;
sleep ();
}
}
void timer () {
dt = clock.getDateTime();
year = dt.year;
month = dt.month;
day = dt.day;
hour = dt.hour;
min = dt.minute;
year_min = (year - year_of) * 525600;
month_min = (month - month_of) * 43200;
day_min = (day - day_of) * 1440;
hour_min = (hour - hour_of) * 60;
min_min = min - min_of;
summ_min = year_min + month_min + day_min + hour_min + min_min;
}
void sleep () {
attachInterrupt(0, wakeUp, LOW);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
detachInterrupt(0);
}
void setSleepTimer(int mins) {
uint8_t hours = mins / 60;
uint8_t mins_left = mins - hours * 60;
dt = clock.getDateTime();
uint8_t hnow = dt.hour;
uint8_t mnow = dt.minute;
uint8_t sec = dt.second;
mnow += mins_left;
if (mnow >= 60) {
mnow -= 60;
hnow += 1;
}
hnow += hours;
if (hnow > 23) {
hnow -= 24;
}
clock.setAlarm1(0, hnow, mnow, sec, DS3231_MATCH_H_M_S);
}
[/code]
Ответ: продолжаете считать, что мы все сидим в вашей голове и точно знаем, что такое "перестаёт работать".
Буквально отсоединяю vcc (11 пин) и gnd дисплея от ардуинки, в сериал начинает выводиться отсчет до сна. Перед сном выводится нарастающая, потом через 2 минуты она просыпается и все по циклу. А если дисплей подключён как я написал, то вообще ничего не происходит... Не идёт отсчет до сна, не засыпает, не просыпается, не включает дисплей...
тебе надо идти, преподавать аратарское искусство... А не вот это вот всё.
Сколько тока употребляет LSD-1600? А максимально ардуина с пина скоко даёт?
Сколько тока употребляет LSD
Это смотря, на сколько ЛСД разбодяжен.))))
Дисплей потребляет 7 mA.
А пин вроде как 40 mA даёт.
Он без подсветки что-ли?
С подсветкой (тусклой наверное). Только мультимитр подключил, показывает 7 mA. Подключаю дисплей к постоянным 5 В на ардуинке, все работает и скетч прокручивпется, только вот когда ардуинка спит, дисплей не тухнет.
Не могу понять, почему виснет весь цикл когда я дисплей на цифровые пины подключаю?
может потому что вы его в лупе включаете каждый раз и каждый раз заново даете init() ? -думаю на третий -пятый раз у вас ардуина тупо виснет
И кстати. совершенно неясно, нафига дисплей каждый раз включать заново, если вы его в программе нигде не выключаете....
Наверное таки не 7мА. По даташиту сколько?
По даташиту 1,2 mA. А вот подсветка пишет, что максимум 260 mA.
Не включайте подсветку.
Не включая подсветку, все равно программа не работает как только питание дисплея подключено к цифровым пинам. Что за ерунда?
Провел тест. Подлючил только один дисплей (питание) без часов к цифровым выходам, и написал скетч для проверки хватит ли тока для работы дисплея от цифровых пинов. Результат - хватает с достатком и на подсветку тоже и потребление тока 7 mA.
[code] #include <Wire.h> #include "GyverTimer.h" #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3f, 16, 2); GTimer_ms myTimer1(1000); #define PIN 11 int count = 0; void setup() { pinMode(PIN, OUTPUT); Serial.begin (9600); } void loop() { if (myTimer1.isReady()) { count++; Serial.println(count); } if (count > 10) { digitalWrite(PIN, LOW); delay(100); // count = 0; } if (count <= 10) { digitalWrite(PIN, HIGH); lcd.init(); lcd.backlight(); lcd.clear(); lcd.setCursor(4, 0); lcd.print("Privet"); delay(100); // count = 0; } if (count >= 20) { count = 0; } } [/code]Удивительные штуки - эти LSD. По даташиту 260мА, по факту 7....
Удивительные штуки - эти LSD. По даташиту 260мА, по факту 7....
одно слово - LSD
Мож лучше с косяка начать? Чо LSD то сразу?
Помогите разобраться пожалуйста!)
Так LSD то палёное, от Гайвера
Причём тут лсд и гайвер. Что за флуд?
Это не флуд. Если в программе используется
#include "GyverTimer.h"
то за помощью нужно обращаться не сюда, а на https://community.alexgyver.ru/
гайвер - потому что у вас в коде используется библиотека от гайвера. Кстати, зачем используется - непонятно, она там нафик не нужна.
А ЛСД - потому что если в даташите на дисплей указан ток 260мА - он НИКАК не может работать всего от 7 Ма. В 150 еще можно поверить - бывает, что в даташите пишут с запасом - но разница в 30 раз исключается.
Вы явно что-то не там или не то померяли.
С гайверской библиотекой просто гораздо удобнее паузы делать через millis. И ничего больше эта библиотека не делает. И какая разница 7 или 160. Проверил только дисплей запитав от цифрового пина, работает все и дисплей и подсветка. Значит дело не в том что не хватает тока на пине...
ИМХО после
все перезагружается и так по кругу, или виснит наглухо.
и че все ключи на пины ставят, надо напрямую мотор цеплять и удивляться потом.
Виснет. Через ключ ток и осталось наверное.
но это не факт, проверить можно вставив в сетап
Serial.println ("Start...");Так отсчет до 10 прописан в сериал. И его нет как только на цифровой пин подключено питание дисплея.
так count сразу >10 становится ?
Сериал вообще молчит. Не идёт ни какого отсчёта. И часы ардуинку не будят. Она просто висит как будто. Как только отсоединяешь vcc дисплея от цифрового пина, программа запускается и работает все корректно.
Для разнообразия померяйте напряжение на питании контроллера (пин +5V).
как вы программы пишите...
зашли в лооп, 20 строка не выполнилось условие, дальше
24 строка не выполнилось условие, дальше
29 строка выполнилось - перезагрузка...
Этот скетч работает как нужно. Ни каких нариканий нет. На скетче в первом посте не работает дисплей при питании от цифрового пина.
блин, вот я слепой.
ссори тогда.
и че дисплей включается ??
Если запитать его от цифрового пина то ничего не включается. Программа висит. Отсоединяю провод, программа запускается, замеряю напряжение на этом пине, показывает 5 В. Фигня какая-то, не могу понять почему подключение питания дисплея на цифровой пин, виснет программа.
пойду 1602 достану, ток померяю...
дисплей с нашлепкой I2C
Похоже, как взял любую либу Гайвера - так сразу разжижение мозга. Проще ему, видите ли, через библиотеку, чем одна строка на миллис...
прям интересно стало :)
ну че мне еще ардуино с часами достать...
Так почему не подходит? Не понятно же...
подкинул часы
дуня какая ??
Уно
есть такая...
где брали LiquidCrystal_I2C откуда
в моей нет метода init есть begin, хочется воспроизвести один в один
.
Вот выложил.
https://1drv.ms/f/s!Ai-6GhJNEDRorzuFnuzSAsyeiC8F
потверждаю, без часов все работает ! (2 код)
И подсветка 7мА?