Не могу вставить вывод часов в меню

dmitrypp

✩✩✩✩✩✩✩
1 Ноя 2021
9
0
Привет, помогите разобраться, при попытке вывода часов на олед дисплей в меню всё зависает, комментирую строку 31 всё работает. Спасибо.
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);
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();
}
 

dmitrypp

✩✩✩✩✩✩✩
1 Ноя 2021
9
0
@Normalek, инициировал, не помогло, eeprom убрал в setup

комментирую строку 86,92 часы работают, меню нет
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
@dmitrypp, пробуй так должно сработать
C++:
 if (enc1.isTurn()) {
    printGUI();
    /*EEPROM.put(0, v0);
    EEPROM.put(1, v1);
    EEPROM.put(2, v2);
    EEPROM.put(3, v3);*/
  }
если сработает скажу в чем ошибка
а меню у тебя на кнопку энкодеа вызываться должно?
 
Изменено:

dmitrypp

✩✩✩✩✩✩✩
1 Ноя 2021
9
0
@Normalek,не сработало, еще если вырезаю строку 86 и вставляю в строку 28, то всё работает, но часы обновляются только при повороте энкодера, сами не обновляются

мне предположили, что "гайверовская либа Олед блочит шину I2C" может это быть, как это проверить?
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
@dmitrypp, ну правильно, вы обновляет дисплей при повороте энкодора еще перенеси
oled.update(); под oled.print(v3); а глючит скорой всего "гайверовская GyverEncoder.h" так как по по библиотеке наткнулся на такой код
C++:
boolean Encoder::isTurn() {
    if (flags.enc_tick_mode) Encoder::tick();
    if (flags.isTurn_f) {
        flags.isTurn_f = false;
        return true;
    } else return false;
}
boolean Encoder::isRight() {
    if (flags.enc_tick_mode) Encoder::tick();
    if (encState == 2) {
        encState = 0;
        return true;
    } else return false;
}

///-----

if (encState != 0) {
                    flags.isTurn_f = true;
                    if (!SW_state && thisMls - fast_timer < _fast_timeout) {
                        if (encState == 1) flags.isFastL_f = true;
                        else if (encState == 2) flags.isFastR_f = true;
                        fast_timer = thisMls;
                    } else fast_timer = thisMls;
тем самым вызывая в переди isRight() или isLeft() и там еще есть, мы сбрасываем encState на ноль, тем самым isTurn() всегда выдает false, это вкратце, а как у тебя обновления стоит в printGUI() { тебе кажется что зависло.
Вот можешь даже проверить
C++:
#define CLK A1
#define DT A2
#define SW A3

#include "GyverEncoder.h"
Encoder enc1(CLK, DT, SW, TYPE2);

void setup() {
  Serial.begin(9600);
  enc1.setTickMode(AUTO);
}

void loop() {
  if (enc1.isRight()) Serial.print("право <> ");
  if (enc1.isLeft()) Serial.print("лево <> ");
  if (enc1.isRightH()) Serial.print("кнопка п <> ");
  if (enc1.isLeftH()) Serial.print("кнопка л <> ");
  if (enc1.isTurn()) Serial.println("движения");
  else Serial.println("нечего");
  delay(100);
  if (enc1.isTurn()) Serial.print("движения <> ");
  else Serial.print("нечего <> ");
  if (enc1.isRight()) Serial.print("право <> ");
  if (enc1.isLeft()) Serial.print("лево <> ");
  if (enc1.isRightH()) Serial.println("кнопка п");
  if (enc1.isLeftH()) Serial.println("кнопка л");
}
 
Изменено:

dmitrypp

✩✩✩✩✩✩✩
1 Ноя 2021
9
0
@Normalek,перенес, не помогло, часы начинают работать, а меню вырубается, 2 дня уже бьюсь с этим.
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
@dmitrypp, ну так правильно если ты перенес (86 и вставляю в строку 28) и потом же чистишь экран как оно должно появится? oled.clear(); поставь перед if (enc1.isTurn()) и записывай еепром на клик а не движения, продлишь намного жизнь памети
 

dmitrypp

✩✩✩✩✩✩✩
1 Ноя 2021
9
0
@Normalek, переделал на кнопки всё отлично работает, но очень хотелось энкодер

https://disk.yandex.ru/i/ijLVGHDl-YAR8w

C++:
//#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();
}
 
Изменено:

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
@dmitrypp, @dmitrypp,извиняюсь сегодня не как не получается написать нормальный скеч, но по быстрому расставил твой
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);
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);
  watch.begin();
  v0 = EEPROM.read(0);
  v1 = EEPROM.read(1);
  v2 = EEPROM.read(2);
  v3 = EEPROM.read(3);
}

void loop() {
  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;
    printGUI();
  }
  if (enc1.isLeft()) {
    arrowPos--;
    if (arrowPos < 0) arrowPos = 3;
    printGUI();
  }
  oled.update();
  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.isPress()) {
    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;
  }
}
должен работать
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
ну а так
C++:
void loop() {
  oled.clear();
  printGUI();
  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 (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.isPress()) {
    EEPROM.put(0, v0);
    EEPROM.put(1, v1);
    EEPROM.put(2, v2);
    EEPROM.put(3, v3);
  }
}
 

dmitrypp

✩✩✩✩✩✩✩
1 Ноя 2021
9
0
@Normalek, часы идут, меню не работает, и всё это моргает, курсор printGUI не моргает