Не могу вставить вывод часов в меню
- Войдите на сайт для отправки комментариев
Сб, 29/01/2022 - 23:14
Привет, помогите разобраться, при попытке вывода часов на олед дисплей в меню всё зависает, комментирую строку 31 всё работает. Спасибо.
#define CLK A1
#define DT A2
#define SW A3
#include <GyverOLED.h>
#include <Wire.h>
#include <iarduino_RTC.h>
#include <EEPROM.h>
GyverOLED<SSD1306_128x32, OLED_BUFFER> oled(0x3C);
#include "GyverEncoder.h"
Encoder enc1(CLK, DT, SW, TYPE2);
int v0 = 0;
int v1 = 0;
int v2 = 0;
int v3 = 0;
int8_t arrowPos = 0;
iarduino_RTC watch(RTC_DS1307);
void setup() {
oled.init();
Serial.begin(9600);
enc1.setTickMode(AUTO);
}
void loop() {
v0 = EEPROM.read(0);
v1 = EEPROM.read(1);
v2 = EEPROM.read(2);
v3 = EEPROM.read(3);
oled.clear();
oled.setCursor (0, 0);
//oled.print(watch.gettime("H:i:s"));
oled.setCursor (10, 1);
oled.print(v0);
oled.setCursor (25, 1);
oled.print(":");
oled.setCursor (40, 1);
oled.print(v1);
oled.setCursor (10, 2);
oled.print(v2);
oled.setCursor (25, 2);
oled.print(":");
oled.setCursor (40, 2);
oled.print(v3);
if (enc1.isRight()) {
arrowPos++;
if (arrowPos >= 4) arrowPos = 0;
}
if (enc1.isLeft()) {
arrowPos--;
if (arrowPos < 0) arrowPos = 3;
}
if (enc1.isRightH()) {
switch (arrowPos) {
case 0: v0++;
break;
case 1: v1++;
break;
case 2: v2++;
break;
case 3: v3++;
break;
}
}
if (enc1.isLeftH()) {
switch (arrowPos) {
case 0: v0--;
break;
case 1: v1--;
break;
case 2: v2--;
break;
case 3: v3--;
break;
}
}
v0 = constrain(v0, 0, 23);
v1 = constrain(v1, 0, 59);
v2 = constrain(v2, 0, 23);
v3 = constrain(v3, 0, 59);
if (enc1.isTurn()) {
printGUI();
EEPROM.put(0, v0);
EEPROM.put(1, v1);
EEPROM.put(2, v2);
EEPROM.put(3, v3);
}
}
void printGUI() {
switch (arrowPos) {
case 0: oled.circle(2, 10, 2);
break;
case 1: oled.circle(32, 10, 2);
break;
case 2: oled.circle(2, 20, 2);
break;
case 3: oled.circle(32, 20, 2);
break;
}
oled.update();
}
Это на форум Гайвера, здесь его библиотеки никто исправлять не будет
Часы 1307 неправильно подключены или неисправны.
Проверено работают, комментирую строку 86 и 92, часы работают, меню нет.
или гайверовская либа Олед блочит шину I2C
В строчке 31 точно H;i;s а не Н;м;s ?
Точно
Чо гадать то? Попробуй другу либу для олед.
Ну да:
- что делать, если программа не работает?
- Переустанови Windows!
Существуют же более или менее стандартные как способы отладки, так и способы облегчить себе эту отладку.
Во-первых, никогда не следует писать так, как написано в строке 31 - передавать одной функции результат работы второй безо всякой проверки.
Во-вторых, в данном конкретном случае следует разделить строку 31 на две - с использованием временной переменной.
Ну и окружить эти две строки диагностической печатью:
- перед строкой 31а,
- между строками 31а и 31б распечатать значение переменной,
- после строки 31б.
так работать с библиотекой надо правильно!
Serial.println(watch.gettime("d-m-Y, H:i:s, D")); // Выводим время.ну чем я вывел не правильно? oled.print(watch.gettime("H:i:s"));
ну чем я вывел не правильно? oled.print(watch.gettime("H:i:s"));
а сам не видишь в чём разница?
а если мне нужны только часы, минуты и секунды, а дата не нужна? )
переделал на кнопки всё отлично работает, но очень нужно на энкодер
http://disk.yandex.ru/i/ijLVGHDl-YAR8w
//#define CLK A1 //#define DT A2 //#define SW A3 #define BTN_PIN5 5 #define BTN_PIN6 6 #include <GyverOLED.h> #include <Wire.h> #include <iarduino_RTC.h> #include <EEPROM.h> GyverOLED<SSD1306_128x32, OLED_BUFFER> oled(0x3C); //#include "GyverEncoder.h" #include "GyverButton.h" GButton butt5(BTN_PIN5); GButton butt6(BTN_PIN6); //Encoder enc1(CLK, DT, SW, TYPE2); int v0 = 0; int v1 = 0; int v2 = 0; int v3 = 0; int8_t arrowPos = 0; iarduino_RTC watch(RTC_DS1307); void setup() { watch.begin(); oled.init(); Serial.begin(9600); //enc1.setTickMode(AUTO); v0 = EEPROM.read(0); v1 = EEPROM.read(1); v2 = EEPROM.read(2); v3 = EEPROM.read(3); } void loop() { butt5.tick(); butt6.tick(); oled.clear(); oled.setCursor (0, 0); oled.print(watch.gettime("H:i:s")); oled.setCursor (10, 1); oled.print(v0); oled.setCursor (25, 1); oled.print(":"); oled.setCursor (40, 1); oled.print(v1); oled.setCursor (10, 2); oled.print(v2); oled.setCursor (25, 2); oled.print(":"); oled.setCursor (40, 2); oled.print(v3); //oled.update(); if (butt5.isClick()) { arrowPos++; if (arrowPos >= 4) arrowPos = 0; } if (butt6.isClick()) { arrowPos--; if (arrowPos < 0) arrowPos = 3; } if (butt5.isHold()) { switch (arrowPos) { case 0: v0++; break; case 1: v1++; break; case 2: v2++; break; case 3: v3++; break; } } if (butt6.isHold()) { switch (arrowPos) { case 0: v0--; break; case 1: v1--; break; case 2: v2--; break; case 3: v3--; break; } } v0 = constrain(v0, 0, 23); v1 = constrain(v1, 0, 59); v2 = constrain(v2, 0, 23); v3 = constrain(v3, 0, 59); printGUI(); if ((butt5.isHold())||(butt6.isHold())) { EEPROM.put(0, v0); EEPROM.put(1, v1); EEPROM.put(2, v2); EEPROM.put(3, v3); } } void printGUI() { switch (arrowPos) { case 0: oled.circle(2, 10, 2); break; case 1: oled.circle(32, 10, 2); break; case 2: oled.circle(2, 20, 2); break; case 3: oled.circle(32, 20, 2); break; } oled.update(); }ну значит я был не прав в прошлый раз, это не Гайвер-Олед гадит, а гайвер-энкодер...
Не суть важно что, главное - гайвер...
но очень нужно на энкодер
у гайвера есть и на часы библа, вместе то они должны работать)
у гайвера есть и на часы библа, вместе то они должны работать)
работать должны... но не работают.
у гайвера есть и на часы библа, вместе то они должны работать)
работать должны... но не работают.
так библа на часы не его, у него
microDS3231
его библа на часы и его же библа на энкодер имеют больше шансов заработать вместе чем две библиотеки от разных разработчиков.
у гайвера есть и на часы библа, вместе то они должны работать)
работать должны... но не работают.
так библа на часы не его, у него
microDS3231
его библа на часы и его же библа на энкодер имеют больше шансов заработать вместе чем две библиотеки от разных разработчиков.
DS1307
емнип там чем то не принципиальным отличается. по крайней мере у меня 3231 с библой для 1307 работало.
а если таки нет, лишний повод на нормальные часы перейти)
так библа на часы не его, у него
microDS3231
его библа на часы и его же библа на энкодер имеют больше шансов заработать вместе чем две библиотеки от разных разработчиков.
почему бы вам с этим вопросом не отправится на его форум?
так библа на часы не его, у него
microDS3231
его библа на часы и его же библа на энкодер имеют больше шансов заработать вместе чем две библиотеки от разных разработчиков.
почему бы вам с этим вопросом не отправится на его форум?
зачем?
А зачем нам копаться в этом?
А вот участники гайверофорума никуда не денутся
хз зачем.
я вот уверен не на сотку, конечно, но все же, что обе две его либы вместе заработают и копаться не придется.
хз зачем.
я вот уверен не на сотку, конечно, но все же, что обе две его либы вместе заработают и копаться не придется.
ну так делайте, зачем об этом на форум писать?
ну так делайте, зачем об этом на форум писать?
вы меня с тс походу перепутали
а не нужно писать типа там wath.begin();?
ну и если вдаваться в отладку, то есть ли зависание на вызове функции те заменить 31 строку на watch.gettime("H:i:s");
Да зависает, если в 31 строку ставлю watch.gettime("H:i:s");
а не нужно писать типа там wath.begin();?
ну и если вдаваться в отладку, то есть ли зависание на вызове функции те заменить 31 строку на watch.gettime("H:i:s");
Следовательно проблемма не в либе гайвера.
Подключена правильная либа?
Может быть поможет установка времени в setup:
Но так же есть вариант, что функция не "зависает", а исправно выполняет свою работу, то есть постоянно в конекте с модулем. В таком случае предлагаю, установить
Проверял часы работают, комментирую строку 86 и 92, часы работают, меню нет.
Следовательно проблемма не в либе гайвера.
Подключена правильная либа?
Может быть поможет установка времени в setup:
Но так же есть вариант, что функция не "зависает", а исправно выполняет свою работу, то есть постоянно в конекте с модулем. В таком случае предлагаю, установить
На гитхабе нашёл такой вариант
#include "DS1307.h" DS1307 clock; ... void loop{ clock.getTime(); oled.print(clock.hour, DEC); }вот так как то вроде работает, часы правда 3231 других нет.
#define CLK A1 #define DT A2 #define SW A3 #include <GyverOLED.h> #include <Wire.h> #include <iarduino_RTC.h> #include <EEPROM.h> GyverOLED<SSD1306_128x32, OLED_BUFFER> oled(0x3C); #include "GyverEncoder.h" Encoder enc1(CLK, DT, SW, TYPE2); int v0 = 0; int v1 = 0; int v2 = 0; int v3 = 0; int8_t arrowPos = 0; //iarduino_RTC watch(RTC_DS1307); iarduino_RTC watch(RTC_DS3231); uint32_t timer; void setup() { oled.init(); Serial.begin(9600); enc1.setTickMode(AUTO); v0 = EEPROM.read(0); v1 = EEPROM.read(1); v2 = EEPROM.read(2); v3 = EEPROM.read(3); } void printGUI() { switch (arrowPos) { case 0: oled.circle(2, 10, 2); break; case 1: oled.circle(32, 10, 2); break; case 2: oled.circle(2, 20, 2); break; case 3: oled.circle(32, 20, 2); break; } } void loop() { enc1.tick(); if (millis() - timer >= 250) { oled.clear(); oled.setCursor (0, 0); oled.print(watch.gettime("H:i:s")); oled.setCursor (10, 1); oled.print(v0); oled.setCursor (25, 1); oled.print(":"); oled.setCursor (40, 1); oled.print(v1); oled.setCursor (10, 2); oled.print(v2); oled.setCursor (25, 2); oled.print(":"); oled.setCursor (40, 2); oled.print(v3); printGUI(); oled.update(); timer = millis(); } if (enc1.isRight()) // если был поворот { arrowPos++; if (arrowPos >= 4) arrowPos = 0; } if (enc1.isLeft()) { // если был поворот arrowPos--; if (arrowPos < 0) arrowPos = 3; } { if (enc1.isRightH()) { // если было удержание + поворот switch (arrowPos) { case 0: v0++; break; case 1: v1++; break; case 2: v2++; break; case 3: v3++; break; } } if (enc1.isLeftH()) { // если было удержание + поворот switch (arrowPos) { case 0: v0--; break; case 1: v1--; break; case 2: v2--; break; case 3: v3--; break; } } } v0 = constrain(v0, 0, 23); v1 = constrain(v1, 0, 59); v2 = constrain(v2, 0, 23); v3 = constrain(v3, 0, 59); /* if (enc1.isTurn()) // сохранять при любом повороте { EEPROM.put(0, v0); EEPROM.put(1, v1); EEPROM.put(2, v2); EEPROM.put(3, v3); } // */ // /* if (enc1.isHolded()) // сохранить при удержании кнопки { oled.circle(2, 10, 2); oled.circle(32, 10, 2); oled.circle(2, 20, 2); oled.circle(32, 20, 2); EEPROM.put(0, v0); EEPROM.put(1, v1); EEPROM.put(2, v2); EEPROM.put(3, v3); arrowPos = 0; oled.update(); } // */ }Спасибо тебе добрый человек, я знал, что здесь есть профи, а не только те, кто ругает чужие библы)
вот так как то вроде работает, часы правда 3231 других нет.
#define CLK A1 #define DT A2 #define SW A3 #include <GyverOLED.h> #include <Wire.h> #include <iarduino_RTC.h> #include <EEPROM.h> GyverOLED<SSD1306_128x32, OLED_BUFFER> oled(0x3C); #include "GyverEncoder.h" Encoder enc1(CLK, DT, SW, TYPE2); int v0 = 0; int v1 = 0; int v2 = 0; int v3 = 0; int8_t arrowPos = 0; //iarduino_RTC watch(RTC_DS1307); iarduino_RTC watch(RTC_DS3231); uint32_t timer; void setup() { oled.init(); Serial.begin(9600); enc1.setTickMode(AUTO); v0 = EEPROM.read(0); v1 = EEPROM.read(1); v2 = EEPROM.read(2); v3 = EEPROM.read(3); } void printGUI() { switch (arrowPos) { case 0: oled.circle(2, 10, 2); break; case 1: oled.circle(32, 10, 2); break; case 2: oled.circle(2, 20, 2); break; case 3: oled.circle(32, 20, 2); break; } } void loop() { enc1.tick(); if (millis() - timer >= 250) { oled.clear(); oled.setCursor (0, 0); oled.print(watch.gettime("H:i:s")); oled.setCursor (10, 1); oled.print(v0); oled.setCursor (25, 1); oled.print(":"); oled.setCursor (40, 1); oled.print(v1); oled.setCursor (10, 2); oled.print(v2); oled.setCursor (25, 2); oled.print(":"); oled.setCursor (40, 2); oled.print(v3); printGUI(); oled.update(); timer = millis(); } if (enc1.isRight()) // если был поворот { arrowPos++; if (arrowPos >= 4) arrowPos = 0; } if (enc1.isLeft()) { // если был поворот arrowPos--; if (arrowPos < 0) arrowPos = 3; } { if (enc1.isRightH()) { // если было удержание + поворот switch (arrowPos) { case 0: v0++; break; case 1: v1++; break; case 2: v2++; break; case 3: v3++; break; } } if (enc1.isLeftH()) { // если было удержание + поворот switch (arrowPos) { case 0: v0--; break; case 1: v1--; break; case 2: v2--; break; case 3: v3--; break; } } } v0 = constrain(v0, 0, 23); v1 = constrain(v1, 0, 59); v2 = constrain(v2, 0, 23); v3 = constrain(v3, 0, 59); /* if (enc1.isTurn()) // сохранять при любом повороте { EEPROM.put(0, v0); EEPROM.put(1, v1); EEPROM.put(2, v2); EEPROM.put(3, v3); } // */ // /* if (enc1.isHolded()) // сохранить при удержании кнопки { oled.circle(2, 10, 2); oled.circle(32, 10, 2); oled.circle(2, 20, 2); oled.circle(32, 20, 2); EEPROM.put(0, v0); EEPROM.put(1, v1); EEPROM.put(2, v2); EEPROM.put(3, v3); arrowPos = 0; oled.update(); } // */ }Fenicksnet. так в чем дело оказалось?
Спасибо тебе добрый человек, я знал, что здесь есть профи, а не только те, кто ругает чужие библы)
Пожалуйста. Я не профи ( чисто из спортивного интереса в целях самообразования) ,а если я им и стану, то же буду как они (ругать чужие библы и все в этом духе)...
По поводу Гайвера скажу только то , что его библиотеки более простые, есть внятное/понятное русское описание. Есть косяки по несовместимости даже его библиотек.
Fenicksnet. так в чем дело оказалось?
точно не знаю. есть только предположения.
1. по энкодеру, не была объявлена функция обработки enc1.tick(); // строка. 47
2. oled.update(); обновление дисплея, было только при повороте энкодера. если я правильно понял в буфер собиралось, но никуда не выводилось.
да оно и сейчас через пень работает. имхо
строка 20, там объявлена функция обработки энкодера
Спасибо тебе добрый человек, я знал, что здесь есть профи, а не только те, кто ругает чужие библы)
Пожалуйста. Я не профи ( чисто из спортивного интереса в целях самообразования) ,а если я им и стану, то же буду как они (ругать чужие библы и все в этом духе)...
По поводу Гайвера скажу только то , что его библиотеки более простые, есть внятное/понятное русское описание. Есть косяки по несовместимости даже его библиотек.
Fenicksnet. так в чем дело оказалось?
точно не знаю. есть только предположения.
1. по энкодеру, не была объявлена функция обработки enc1.tick(); // строка. 47
2. oled.update(); обновление дисплея, было только при повороте энкодера. если я правильно понял в буфер собиралось, но никуда не выводилось.
да оно и сейчас через пень работает. имхо
строка 20, там объявлена функция обработки энкодера
все, нашел не надо.
чет я не понимаю, пытаюсь добавить отключение дисплея , отключается , но почему то при любом Disp_off он отключается через 10 cекунд.
#define CLK A1 #define DT A2 #define SW A3 #include <GyverOLED.h> #include <Wire.h> #include <iarduino_RTC.h> #include <EEPROM.h> GyverOLED<SSD1306_128x32, OLED_BUFFER> oled(0x3C); #include "GyverEncoder.h" Encoder enc1(CLK, DT, SW, TYPE2); uint8_t v0 = 0; uint8_t v1 = 0; uint8_t v2 = 0; uint8_t v3 = 0; uint8_t arrowPos = 4; //iarduino_RTC watch(RTC_DS1307); iarduino_RTC watch(RTC_DS3231); uint32_t timer; // таймер обновления экрана uint16_t Disp_update = 200; // обновляем диплей каждые мс uint32_t timer_off; // таймер отключения дисплея uint32_t Disp_off = 0; // отключение дисплея через сек, 0 не оключаем. void setup() { oled.init(); Serial.begin(9600); enc1.setTickMode(AUTO); Disp_off = 10 * 1000; v0 = EEPROM.read(0); v1 = EEPROM.read(1); v2 = EEPROM.read(2); v3 = EEPROM.read(3); } void printGUI() { switch (arrowPos) { case 0: oled.circle(2, 10, 2); break; case 1: oled.circle(32, 10, 2); break; case 2: oled.circle(2, 20, 2); break; case 3: oled.circle(32, 20, 2); break; } } void loop() { if (enc1.isTurn()) { oled.setPower(true); // включаем дисплей timer_off = millis(); // сбрасываем таймер } /* //проверить и сохранять в память при любом повороте EEPROM.put(0, v0); EEPROM.put(1, v1); EEPROM.put(2, v2); EEPROM.put(3, v3); } // */ // /* if ( Disp_off != 0 && millis() - timer_off >= Disp_off) { // таймер отключения дисплея oled.setPower(false); // отключаем досплей arrowPos = 4; // убираем курсор } else { if (millis() - timer >= Disp_update) { // обновление дисплея oled.clear(); oled.setCursor (0, 0); oled.print(watch.gettime("H:i:s")); oled.setCursor (10, 1); oled.print(v0); oled.setCursor (25, 1); oled.print(":"); oled.setCursor (40, 1); oled.print(v1); oled.setCursor (10, 2); oled.print(v2); oled.setCursor (25, 2); oled.print(":"); oled.setCursor (40, 2); oled.print(v3); printGUI(); oled.update(); timer = millis(); } } if (enc1.isRight()) // если был поворот { arrowPos++; if (arrowPos > 4) arrowPos = 0; } if (enc1.isLeft()) { // если был поворот arrowPos--; if (arrowPos < 0) arrowPos = 4; } { if (enc1.isRightH()) { // если было удержание + поворот switch (arrowPos) { case 0: v0++; break; case 1: v1++; break; case 2: v2++; break; case 3: v3++; break; case 4: break; } } if (enc1.isLeftH()) { // если было удержание + поворот switch (arrowPos) { case 0: v0--; break; case 1: v1--; break; case 2: v2--; break; case 3: v3--; break; case 4: break; } } } v0 = constrain(v0, 0, 23); v1 = constrain(v1, 0, 59); v2 = constrain(v2, 0, 23); v3 = constrain(v3, 0, 59); // /* if (enc1.isHolded()) // сохранить при удержании кнопки, { oled.circle(2, 10, 2); oled.circle(32, 10, 2); oled.circle(2, 20, 2); oled.circle(32, 20, 2); EEPROM.put(0, v0); EEPROM.put(1, v1); EEPROM.put(2, v2); EEPROM.put(3, v3); arrowPos = 4; oled.update(); } // */ }Закоментить 30-ю строчку.
Закоментить 30-ю строчку.
вот я ....., точно, только не закоментить, а вот так наверное записать
Disp_off =Disp_off* 1000;Спасибо.