OLED traba funciones de encoder

Buen dia con todos,esperando se encuentren bien. Mi problema es el siguiente.
Quiero hacer un proyecto de un menu con encoder rotativo para aplicarlo a un huerto automatizado. Pero mi problema es que cuando quiero mandar los datos del encoder a la oled claramente se puede reflejarlos, sin embargo nose a que se deb pero hace que se trabe o no responda el encoder de la mejor manera (Ojo: solo al poner los datos para imprimir en el OLED, ya que solo por serial anda perfectamente inclusive con los datos de tiempo y fecha con la funcion NTP y los datos del encoder a la vez). La tarjeta que uso es una WEMOS D1 mini y una OLED 128X64 con comunicacion I2C.
A continuacion pongo a disposicion el codigo que uso.

/////////////////////////////////////////////////////////////////
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


#include "Button2.h" //  https://github.com/LennartHennigs/Button2
#include "ESPRotary.h"
#include "Ticker.h"
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#define ROTARY_PIN1  12
#define ROTARY_PIN2 13
#define BUTTON_PIN  14

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET     -1

#define CLICKS_PER_STEP   4   // this number depends on your rotary encoder 

#define SERIAL_SPEED    115200

#define SPEEDUP_STEPS   5
/////////////////////////////////////////////////////////////////
//Claves de Usuario
const char *ssid = "DARIO CHUQUITARCO";
const char *password = "Dariojavier02";

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "ec.pool.ntp.org", -18000, 60000);
// NTPClient(UDP& udp, const char* poolServerName, long timeOffset, unsigned long updateInterval);
char dayWeek [7][12] = {"DOMINGO", "LUNES", "MARTES", "MIERCOLES", "JUEVES", "VIERNES", "SABADO"};

ESPRotary r;
Ticker t;
Button2 b;

/////////////////////////////////////////////////////////////////
enum STATES
{
  MEASURE_REGULATION, //measuring and temperature regulation
  SETUP,     // setup
  HUMIDITY,
  HIGHEST,
  LOWER,
};
STATES state;
int hl = 55;
int hh = 60;
double encoder = 37.5;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


void setup() {
  WiFi.begin(ssid, password);
  Serial.begin(SERIAL_SPEED);
  delay(50);
  Serial.println("\n\nSimple Counter");
  timeClient.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.setTextColor(SSD1306_WHITE);
  display.clearDisplay();
  display.setCursor(0, 0);
  display.setTextSize(2);
  display.println(" MI HUERTO");
  display.println("   LETTUCE");
  display.println("   BY SAM");
  display.write(2);
  display.display();
  delay(3000);

  r.begin(ROTARY_PIN1, ROTARY_PIN2, CLICKS_PER_STEP);
  r.setChangedHandler(rotate);
  r.setLeftRotationHandler(showDirection);
  r.setRightRotationHandler(showDirection);
  r.setSpeedupStartedHandler(speedupStarted);
  r.setSpeedupEndedHandler(speedupEnded);


  b.begin(BUTTON_PIN);
  b.setTapHandler(click);

  r.retriggerEvent(false);
  r.enableSpeedup(true);
  r.setSpeedupIncrement(SPEEDUP_STEPS);
  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }
  t.attach_ms(1, handleLoop);
  timeClient.begin();

}
int pos;
void handleLoop() {
  r.loop();
}

void loop() {

  b.loop();
  r.loop();

  if (state == MEASURE_REGULATION) {
    Serial.println(hl);
    Serial.println(dayWeek[timeClient.getDay()]);
    Serial.println(timeClient.getFormattedTime());
    display.clearDisplay();
    //Configuracion del tiempo
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(4, 1);
    display.setTextSize(1.8);
    display.println(dayWeek[timeClient.getDay()]);
    display.setCursor(20, 10);
    display.setTextSize(2.2);
    display.println(timeClient.getFormattedTime());
    display.println(hl);
    display.display();

  }

  else if (state == SETUP) {
    Serial.println(encoder);

    /*display.clearDisplay();
      display.setCursor(20, 10);
      display.setTextSize(2.2);
      display.print(encoder);
      display.display();*/

  }

  timeClient.update();

}

/////////////////////////////////////////////////////////////////

// on change
void rotate(ESPRotary& r) {
  //Serial.println(r.getPosition());
  pos = r.getPosition();
}


// on left or right rotation
void showDirection(ESPRotary& r) {
  //Serial.println(r.directionToString(r.getDirection()));
  if  (state == MEASURE_REGULATION) {
    if (r.directionToString(r.getDirection()) == "right") {
      //Serial.println("Hola");
      hl += 1;
    }
    else {
      //Serial.println("No");
      hl -= 1;
    }
    hl = min(hh, max(10,   hl));
  }
  if  (state == SETUP) {
    if (r.directionToString(r.getDirection()) == "right") {
      //Serial.println("Hola1");
      encoder += 0.1;
    }
    else {
      //Serial.println("No1");
      encoder -= 0.1;
    }
    encoder = min(60.0, max(20.0, encoder));

  }
}

// single click
void click(Button2& btn) {
  //Serial.println("Click!");
  switch (state)
  {
    case MEASURE_REGULATION:

      if (btn.wasPressedFor())
      {
        state = SETUP;
        //Serial.println("MENU 1");
      }
      break;
    case SETUP:

      if (btn.wasPressedFor())
      {
        //set = encoder;
        state = HUMIDITY;
        //Serial.println("MENU 2");
      }
      break;
    case HUMIDITY:

      if (btn.wasPressedFor())
      {
        //sout = encod;
        state = HIGHEST;
        //Serial.println("MENU 3");
      }
      break;
    case HIGHEST:

      if (btn.wasPressedFor())
      {
        //cof = hh;
        state = LOWER;
        //Serial.println("MENU 4");

      }
      break;
    case LOWER:

      if (btn.wasPressedFor())
      {
        //cof1 = hl;
        state = MEASURE_REGULATION;
        //Serial.println("MENU 0");
      }
      break;
  }
}

// long click

void speedupStarted(ESPRotary& r) {
  //Serial.println("Speedup started");
}

void speedupEnded(ESPRotary& r) {
  //Serial.println("Speedup ended");
}

Esperando una pronta solucion o un arreglo que se pueda dar, les anticipo mis agradecimientos :slight_smile:

Cuando corres estos ejemplos en GitHub - LennartHennigs/ESPRotary: Arduino/ESP library to simplify reading rotary encoder data. funcionan bien?

Buenos dias @Surbyte, si te refieres a solo los ejemplos sin OLED si, corren superbien.

Implementa tu rotary enconder con un ejemplo que use interrupciones.
Esta fallando porque el OLED es lento o tu uso del OLED no es eficiente.

Use el code de la libreria del ESP8266Interrupt e igual se traba o no da los datos que es del encoder con la oled.

/////////////////////////////////////////////////////////////////

#if !defined(ESP8266)
#error This sketch needs an ESP8266
#else

/////////////////////////////////////////////////////////////////

#include "ESPRotary.h"
#include "Ticker.h" // https://github.com/esp8266/Arduino/tree/master/libraries/Ticker

/////////////////////////////////////////////////////////////////

#define ROTARY_PIN1 12
#define ROTARY_PIN2 13

#define CLICKS_PER_STEP 4

#define SERIAL_SPEED    115200

/////////////////////////////////////////////////////////////////
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET     -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

ESPRotary r;
Ticker t;

/////////////////////////////////////////////////////////////////

void setup() {
  Serial.begin(SERIAL_SPEED);
  delay(50);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.setTextColor(SSD1306_WHITE);
  display.clearDisplay();
  r.begin(ROTARY_PIN1, ROTARY_PIN2, CLICKS_PER_STEP);
  r.setChangedHandler(rotate);
  r.setLeftRotationHandler(showDirection);
  r.setRightRotationHandler(showDirection);

  t.attach_ms(1, handleLoop);
}

/////////////////////////////////////////////////////////////////

void rotate(ESPRotary& r) {
  Serial.println(r.getPosition());
  
}

/////////////////////////////////////////////////////////////////

// on left or right rotation
void showDirection(ESPRotary& r) {
  Serial.println(r.directionToString(r.getDirection()));
}

/////////////////////////////////////////////////////////////////

void handleLoop() {
  r.loop();
}

/////////////////////////////////////////////////////////////////

void loop() {
  /* delay(1000);
    Serial.print(".");*/
  display.clearDisplay();
  display.setCursor(0, 0);
  display.setTextSize(2);
  display.println(r.getPosition());
  display.write(2);
  display.display();
}

/////////////////////////////////////////////////////////////////
#endif
/////////////////////////////////////////////////////////////////

Este es tu loop.
No veo que descanse de presentar información.
usa algo asi por ejemplo

void loop() {
 unsigned long start;  // futuro uso con millis()
 static int posicion, posicionAnt = 0;

  posicion = r.getPosition();
  if ( posicion != posicionAnt) {
      display.clearDisplay();   // <== EVITA borrar pantalla  en cada loop
      display.setCursor(0, 0);
      display.setTextSize(2);  // <== EVITA cambiar el texto en cada loop
     display.println(posicion);
     display.write(2);
     display.display();
     posicionAnt =  posicion;
   }
}

Genial, esta casi objetivo los datos, habra alguna forma mas de aumentarle o estimularle mas
velocidad de muestreo de datos?. Gracias por tu ayuda... :slight_smile:

Si claro usando la version 2 que en lugar de esperar cambios uses tambien un muestro de tiempos

void loop() {
 static unsigned long start;  // futuro uso con millis()
 static int posicion, posicionAnt = 0;

  posicion = r.getPosition();
  if ( posicion != posicionAnt || millis() - start > 1000UL) {
      display.clearDisplay();   // <== EVITA borrar pantalla  en cada loop
      display.setCursor(0, 0);
      display.setTextSize(2);  // <== EVITA cambiar el texto en cada loop
     display.println(posicion);
     display.write(2);
     display.display();
     posicionAnt =  posicion;
     start = milllis();
   }
}

Ahora con cada cambio del encoder o cada 1000 mseg muestra cambios. Si lo quieres mas rápido cambia 1000UL por 500UL por ejemplo.

Mira estaba haciendo esto,

```unsigned long start; // futuro uso con millis()````

Como tu dejaste en el primer codigo y esta parte que la dejaste para la version dos. Nose si podrias tu decirme si puede tener fallas a futuro


  b.loop();
  r.loop();

  if (state == MEASURE_REGULATION) {
    Serial.println(hl);
    Serial.println(dayWeek[timeClient.getDay()]);
    Serial.println(timeClient.getFormattedTime());
    //    display.clearDisplay();
    //    //Configuracion del tiempo
    //    display.setTextSize(2);
    //    display.setTextColor(WHITE);
    //    display.setCursor(4, 1);
    //    display.setTextSize(1.8);
    //    display.println(dayWeek[timeClient.getDay()]);
    //    display.setCursor(20, 10);
    //    display.setTextSize(2.2);
    //    display.println(timeClient.getFormattedTime());
    //    display.println(hl);
    //    display.display();

    unsigned long start = millis(); // futuro uso con millis()
    static int posicion, posicionAnt = 0;
    if (start - previousMillis >= interval) {
      // save the last time you blinked the LED
      previousMillis = start;

      posicion = hl;
      if ( posicion != posicionAnt) {
        display.clearDisplay();   // <== EVITA borrar pantalla  en cada loop
        display.setCursor(0, 0);
        display.setTextSize(2);  // <== EVITA cambiar el texto en cada loop
        display.println(posicion);
        display.write(2);
        display.display();
        posicionAnt =  posicion;
      }
    }

  }

  else if (state == SETUP) {
    Serial.println(encoder);

    /*display.clearDisplay();
      display.setCursor(20, 10);
      display.setTextSize(2.2);
      display.print(encoder);
      display.display();*/
    unsigned long start = millis(); // futuro uso con millis()
    static float posicion, posicionAnt = 0;
    if (start - previousMillis >= interval) {
      // save the last time you blinked the LED
      previousMillis = start;

      posicion = encoder;
      if ( posicion != posicionAnt) {
        display.clearDisplay();   // <== EVITA borrar pantalla  en cada loop
        display.setCursor(0, 0);
        display.setTextSize(2);  // <== EVITA cambiar el texto en cada loop
        display.println(posicion);
        display.write(2);
        display.display();
        posicionAnt =  posicion;
      }

    }
  }

    timeClient.update();

  }

Ahora tengo otro problema, disculpa las molestias. Cada que cambie a otra opcion quiero ver que se refleje el ultimo dato que se guardo, sin embargo solo se ve cuando se hace un cambio en el encoder. Habra alguna forma de poder insertarlo, he intentado agregando un or u and en la condicional de las posiciones pero no obtengo resultados. Añado el codigo que estoy haciendo.


`/////////////////////////////////////////////////////////////////
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


#include "Button2.h" //  https://github.com/LennartHennigs/Button2
#include "ESPRotary.h"
#include "Ticker.h"
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#define ROTARY_PIN1  12
#define ROTARY_PIN2 13
#define BUTTON_PIN  14

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET     -1

#define CLICKS_PER_STEP   4   // this number depends on your rotary encoder 

#define SERIAL_SPEED    115200

#define SPEEDUP_STEPS   5
/////////////////////////////////////////////////////////////////
//Claves de Usuario
const char *ssid = "DARIO CHUQUITARCO";
const char *password = "Dariojavier02";

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "ec.pool.ntp.org", -18000, 60000);
// NTPClient(UDP& udp, const char* poolServerName, long timeOffset, unsigned long updateInterval);
char dayWeek [7][12] = {"DOMINGO", "LUNES", "MARTES", "MIERCOLES", "JUEVES", "VIERNES", "SABADO"};

ESPRotary r;
Ticker t;
Button2 b;

/////////////////////////////////////////////////////////////////
enum STATES
{
  MEASURE_REGULATION, //measuring and temperature regulation
  SETUP,     // setup
  HUMIDITY,
  HIGHEST,
  LOWER,
};
STATES state;
int hl = 55;
int hh = 60;
double encoder = 37.5;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


void setup() {
  WiFi.begin(ssid, password);
  Serial.begin(SERIAL_SPEED);
  delay(50);
  Serial.println("\n\nSimple Counter");
  timeClient.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.setTextColor(SSD1306_WHITE);
  display.clearDisplay();
  display.setCursor(0, 0);
  display.setTextSize(2);
  display.println(" MI HUERTO");
  display.println("   LETTUCE");
  display.println("   BY SAM");
  display.write(2);
  display.display();
  delay(3000);

  r.begin(ROTARY_PIN1, ROTARY_PIN2, CLICKS_PER_STEP);
  r.setChangedHandler(rotate);
  r.setLeftRotationHandler(showDirection);
  r.setRightRotationHandler(showDirection);
  r.setSpeedupStartedHandler(speedupStarted);
  r.setSpeedupEndedHandler(speedupEnded);


  b.begin(BUTTON_PIN);
  b.setTapHandler(click);

  r.retriggerEvent(false);
  r.enableSpeedup(true);
  r.setSpeedupIncrement(SPEEDUP_STEPS);
  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }
  t.attach_ms(1, handleLoop);
  timeClient.begin();

}
int pos;
void handleLoop() {
  r.loop();
}
const long interval = 50;
unsigned long previousMillis = 0;

void loop() {

  b.loop();
  r.loop();

  if (state == MEASURE_REGULATION) {
    Serial.println(hl);
    Serial.println(dayWeek[timeClient.getDay()]);
    Serial.println(timeClient.getFormattedTime());
    //    display.clearDisplay();
    //    //Configuracion del tiempo
    //    display.setTextSize(2);
    //    display.setTextColor(WHITE);
    //    display.setCursor(4, 1);
    //    display.setTextSize(1.8);
    //    display.println(dayWeek[timeClient.getDay()]);
    //    display.setCursor(20, 10);
    //    display.setTextSize(2.2);
    //    display.println(timeClient.getFormattedTime());
    //    display.println(hl);
    //    display.display();

    unsigned long start = millis(); // futuro uso con millis()
    static int posicion, posicionAnt = 0;
    if (start - previousMillis >= interval) {
      // save the last time you blinked the LED
      previousMillis = start;

      posicion = hl;
      if ( posicion != posicionAnt && ) {
        display.clearDisplay();   // <== EVITA borrar pantalla  en cada loop
        display.setCursor(0, 0);
        display.setTextSize(2);  // <== EVITA cambiar el texto en cada loop
        display.println(posicion);
        display.write(2);
        display.display();
        posicionAnt =  posicion;
      }
    }

  }

  else if (state == SETUP) {
    Serial.println(encoder);

    /*display.clearDisplay();
      display.setCursor(20, 10);
      display.setTextSize(2.2);
      display.print(encoder);
      display.display();*/
    unsigned long start = millis(); // futuro uso con millis()
    static float posicion, posicionAnt = 0;
    if (start - previousMillis >= interval) {
      // save the last time you blinked the LED
      previousMillis = start;

      posicion = encoder;
      if ( posicion != posicionAnt) {
        display.clearDisplay();   // <== EVITA borrar pantalla  en cada loop
        display.setCursor(0, 0);
        display.setTextSize(2);  // <== EVITA cambiar el texto en cada loop
        display.println(posicion);
        display.write(2);
        display.display();
        posicionAnt =  posicion;
      }

    }
  }

    timeClient.update();

  }

  /////////////////////////////////////////////////////////////////

  // on change
  void rotate(ESPRotary & r) {
    //Serial.println(r.getPosition());
    pos = r.getPosition();
  }


  // on left or right rotation
  void showDirection(ESPRotary & r) {
    //Serial.println(r.directionToString(r.getDirection()));
    if  (state == MEASURE_REGULATION) {
      if (r.directionToString(r.getDirection()) == "right") {
        //Serial.println("Hola");
        hl += 1;
      }
      else {
        //Serial.println("No");
        hl -= 1;
      }
      hl = min(hh, max(10,   hl));
    }
    if  (state == SETUP) {
      if (r.directionToString(r.getDirection()) == "right") {
        //Serial.println("Hola1");
        encoder += 0.1;
      }
      else {
        //Serial.println("No1");
        encoder -= 0.1;
      }
      encoder = min(60.0, max(20.0, encoder));

    }
  }

  // single click
  void click(Button2 & btn) {
    //Serial.println("Click!");
    switch (state)
    {
      case MEASURE_REGULATION:

        if (btn.wasPressedFor())
        {
          state = SETUP;
          //Serial.println("MENU 1");
        }
        break;
      case SETUP:

        if (btn.wasPressedFor())
        {
          //set = encoder;
          state = HUMIDITY;
          //Serial.println("MENU 2");
        }
        break;
      case HUMIDITY:

        if (btn.wasPressedFor())
        {
          //sout = encod;
          state = HIGHEST;
          //Serial.println("MENU 3");
        }
        break;
      case HIGHEST:

        if (btn.wasPressedFor())
        {
          //cof = hh;
          state = LOWER;
          //Serial.println("MENU 4");

        }
        break;
      case LOWER:

        if (btn.wasPressedFor())
        {
          //cof1 = hl;
          state = MEASURE_REGULATION;
          //Serial.println("MENU 0");
        }
        break;
    }
  }

  // long click

  void speedupStarted(ESPRotary & r) {
    //Serial.println("Speedup started");
  }

  void speedupEnded(ESPRotary & r) {
    //Serial.println("Speedup ended");
  }

  void input_check()
  {


  }``

Te sugerí esto

void loop() {
 static unsigned long start;  // futuro uso con millis()
 static int posicion, posicionAnt = 0;

  posicion = r.getPosition();
  if ( posicion != posicionAnt || millis() - start > 1000UL) {

no a medias.
y no olvides al final del if actualizar

    posicionAnt =  posicion;
     start = milllis();

[Off-topic]

¿De qué estás hablando Willlis? :crazy_face:

Ya lo hice, posteo el codigo nuevamente, lo malo esque no se si estese bien echo la parte del loop pero se requiere que se mueva el encoder para imprimir el valor en la OLED cada vez que cambio a otra opcion de mi menu. Habra alguna forma de cambiar eso y que se proyecte ese cambio para cada opcion

/////////////////////////////////////////////////////////////////
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#include "Button2.h" //  https://github.com/LennartHennigs/Button2
#include "ESPRotary.h"
#include "Ticker.h"
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#define ROTARY_PIN1  12
#define ROTARY_PIN2 13
#define BUTTON_PIN  14

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET     -1

#define CLICKS_PER_STEP   4   // this number depends on your rotary encoder 

#define SERIAL_SPEED    115200

#define SPEEDUP_STEPS   5
/////////////////////////////////////////////////////////////////
//Claves de Usuario
const char *ssid = "DARIO CHUQUITARCO";
const char *password = "Dariojavier02";

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "ec.pool.ntp.org", -18000, 60000);
// NTPClient(UDP& udp, const char* poolServerName, long timeOffset, unsigned long updateInterval);
char dayWeek [7][12] = {"DOMINGO", "LUNES", "MARTES", "MIERCOLES", "JUEVES", "VIERNES", "SABADO"};

ESPRotary r;
Ticker t;
Button2 b;

/////////////////////////////////////////////////////////////////
enum STATES
{
  MEASURE_REGULATION, //measuring and temperature regulation
  SETUP,     // setup
  HUMIDITY,
  HIGHEST,
  LOWER,
};
STATES state;
int hl = 55;
int hh = 60;
double encoder = 37.5;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


void setup() {
  WiFi.begin(ssid, password);
  Serial.begin(SERIAL_SPEED);
  delay(50);
  Serial.println("\n\nSimple Counter");
  timeClient.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.setTextColor(SSD1306_WHITE);
  display.clearDisplay();
  display.setCursor(0, 0);
  display.setTextSize(2);
  display.println(" MI HUERTO");
  display.println("   LETTUCE");
  display.println("   BY SAM");
  display.write(2);
  display.display();
  delay(3000);

  r.begin(ROTARY_PIN1, ROTARY_PIN2, CLICKS_PER_STEP);
  r.setChangedHandler(rotate);
  r.setLeftRotationHandler(showDirection);
  r.setRightRotationHandler(showDirection);
  r.setSpeedupStartedHandler(speedupStarted);
  r.setSpeedupEndedHandler(speedupEnded);


  b.begin(BUTTON_PIN);
  b.setTapHandler(click);

  r.retriggerEvent(false);
  r.enableSpeedup(true);
  r.setSpeedupIncrement(SPEEDUP_STEPS);
  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }
  t.attach_ms(1, handleLoop);
  timeClient.begin();

}
int pos;
void handleLoop() {
  r.loop();
}
const long interval = 50; //Dejar en 50
unsigned long previousMillis = 0;

void loop() {

  b.loop();
  r.loop();

  if (state == MEASURE_REGULATION) {
    Serial.println(hl);
    Serial.println(dayWeek[timeClient.getDay()]);
    Serial.println(timeClient.getFormattedTime());
    //    display.clearDisplay();
    //    //Configuracion del tiempo
    //    display.setTextSize(2);
    //    display.setTextColor(WHITE);
    //    display.setCursor(4, 1);
    //    display.setTextSize(1.8);
    //    display.println(dayWeek[timeClient.getDay()]);
    //    display.setCursor(20, 10);
    //    display.setTextSize(2.2);
    //    display.println(timeClient.getFormattedTime());
    //    display.println(hl);
    //    display.display();

    unsigned long start = millis(); // futuro uso con millis()
    static int posicion, posicionAnt = 0;
    //        if (start - previousMillis >= interval) {
    //          // save the last time you blinked the LED
    //          previousMillis = start;
    //
    //          posicion = hl;
    //          if ( posicion != posicionAnt) {
    //            display.clearDisplay();   // <== EVITA borrar pantalla  en cada loop
    //            display.setCursor(0, 0);
    //            display.setTextSize(2);  // <== EVITA cambiar el texto en cada loop
    //            display.println(posicion);
    //            display.write(2);
    //            display.display();
    //            posicionAnt =  posicion;
    //          }
    //        }

    posicion = hl;
    if ( posicion != posicionAnt || millis() - start > 50UL) {
      display.clearDisplay();   // <== EVITA borrar pantalla  en cada loop
      display.setCursor(0, 0);
      display.setTextSize(2);  // <== EVITA cambiar el texto en cada loop
      display.println(posicion);
      display.write(2);
      display.display();
      posicionAnt =  posicion;
      start = millis();
    }

  }

  if (state == SETUP) {
    Serial.println(encoder);

    /*display.clearDisplay();
      display.setCursor(20, 10);
      display.setTextSize(2.2);
      display.print(encoder);
      display.display();*/
    unsigned long start = millis(); // futuro uso con millis()
    static float posicion, posicionAnt = 0;
    //    if (start - previousMillis >= interval) {
    //      // save the last time you blinked the LED
    //      previousMillis = start;
    //
    //      posicion = encoder;
    //      if ( posicion != posicionAnt) {
    //        display.clearDisplay();   // <== EVITA borrar pantalla  en cada loop
    //        display.setCursor(0, 0);
    //        display.setTextSize(2);  // <== EVITA cambiar el texto en cada loop
    //        display.println(posicion);
    //        display.write(2);
    //        display.display();
    //        posicionAnt =  posicion;
    //      }
    //
    //    }
    posicion = encoder;
    if ( posicion != posicionAnt || millis() - start > 50UL) {
      display.clearDisplay();   // <== EVITA borrar pantalla  en cada loop
      display.setCursor(0, 0);
      display.setTextSize(2);  // <== EVITA cambiar el texto en cada loop
      display.println(posicion);
      display.write(2);
      display.display();
      posicionAnt =  posicion;
      start = millis();
    }
  }

  timeClient.update();

}

/////////////////////////////////////////////////////////////////

// on change
void rotate(ESPRotary & r) {
  //Serial.println(r.getPosition());
  pos = r.getPosition();
}


// on left or right rotation
void showDirection(ESPRotary & r) {
  //Serial.println(r.directionToString(r.getDirection()));
  if  (state == MEASURE_REGULATION) {
    if (r.directionToString(r.getDirection()) == "right") {
      //Serial.println("Hola");
      hl += 1;
    }
    else {
      //Serial.println("No");
      hl -= 1;
    }
    hl = min(hh, max(10,   hl));
  }
  if  (state == SETUP) {
    if (r.directionToString(r.getDirection()) == "right") {
      //Serial.println("Hola1");
      encoder += 0.1;
    }
    else {
      //Serial.println("No1");
      encoder -= 0.1;
    }
    encoder = min(60.0, max(20.0, encoder));

  }
}

// single click
void click(Button2 & btn) {
  //Serial.println("Click!");
  switch (state)
  {
    case MEASURE_REGULATION:

      if (btn.wasPressedFor())
      {
        state = SETUP;
        //Serial.println("MENU 1");
      }
      break;
    case SETUP:

      if (btn.wasPressedFor())
      {
        //set = encoder;
        state = HUMIDITY;
        //Serial.println("MENU 2");
      }
      break;
    case HUMIDITY:

      if (btn.wasPressedFor())
      {
        //sout = encod;
        state = HIGHEST;
        //Serial.println("MENU 3");
      }
      break;
    case HIGHEST:

      if (btn.wasPressedFor())
      {
        //cof = hh;
        state = LOWER;
        //Serial.println("MENU 4");

      }
      break;
    case LOWER:

      if (btn.wasPressedFor())
      {
        //cof1 = hl;
        state = MEASURE_REGULATION;
        //Serial.println("MENU 0");
      }
      break;
  }
}

// long click

void speedupStarted(ESPRotary & r) {
  //Serial.println("Speedup started");
}

void speedupEnded(ESPRotary & r) {
  //Serial.println("Speedup ended");
}

En serio me vas a cuestionar un error en millis() ?

Ahora al OP
no puedes usar esto en cada porción de código

unsigned long start = millis(); // futuro uso con millis()

y ademas yo te puse

static unsigned long start = millis(); 

A ver, ya que lo usas dos veces cree dos variables start, start1 y start2.


#include "Button2.h" //  https://github.com/LennartHennigs/Button2
#include "ESPRotary.h"
#include "Ticker.h"
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#define ROTARY_PIN1  12
#define ROTARY_PIN2 13
#define BUTTON_PIN  14

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET     -1

#define CLICKS_PER_STEP   4   // this number depends on your rotary encoder 

#define SERIAL_SPEED    115200

#define SPEEDUP_STEPS   5
/////////////////////////////////////////////////////////////////
//Claves de Usuario
const char *ssid = "DARIO CHUQUITARCO";
const char *password = "Dariojavier02";

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "ec.pool.ntp.org", -18000, 60000);
// NTPClient(UDP& udp, const char* poolServerName, long timeOffset, unsigned long updateInterval);
char dayWeek [7][12] = {"DOMINGO", "LUNES", "MARTES", "MIERCOLES", "JUEVES", "VIERNES", "SABADO"};

ESPRotary r;
Ticker t;
Button2 b;

/////////////////////////////////////////////////////////////////
enum STATES
{
  MEASURE_REGULATION, //measuring and temperature regulation
  SETUP,     // setup
  HUMIDITY,
  HIGHEST,
  LOWER,
};
STATES state;
int hl = 55;
int hh = 60;
double encoder = 37.5;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


void setup() {
  WiFi.begin(ssid, password);
  Serial.begin(SERIAL_SPEED);
  delay(50);
  Serial.println("\n\nSimple Counter");
  timeClient.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.setTextColor(SSD1306_WHITE);
  display.clearDisplay();
  display.setCursor(0, 0);
  display.setTextSize(2);
  display.println(" MI HUERTO");
  display.println("   LETTUCE");
  display.println("   BY SAM");
  display.write(2);
  display.display();
  delay(3000);

  r.begin(ROTARY_PIN1, ROTARY_PIN2, CLICKS_PER_STEP);
  r.setChangedHandler(rotate);
  r.setLeftRotationHandler(showDirection);
  r.setRightRotationHandler(showDirection);
  r.setSpeedupStartedHandler(speedupStarted);
  r.setSpeedupEndedHandler(speedupEnded);


  b.begin(BUTTON_PIN);
  b.setTapHandler(click);

  r.retriggerEvent(false);
  r.enableSpeedup(true);
  r.setSpeedupIncrement(SPEEDUP_STEPS);
  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }
  t.attach_ms(1, handleLoop);
  timeClient.begin();

}
int pos;
void handleLoop() {
  r.loop();
}
const long interval = 50; //Dejar en 50
unsigned long previousMillis = 0;

void loop() {
  static unsigned long start1 = millis();
  static unsigned long start2 = millis();
  static int posicion, posicionAnt = 0;

  b.loop();
  r.loop();

  if (state == MEASURE_REGULATION) {
    Serial.println(hl);
    Serial.println(dayWeek[timeClient.getDay()]);
    Serial.println(timeClient.getFormattedTime());

    posicion = hl;
    if ( posicion != posicionAnt || millis() - start1 > 50UL) {
      display.clearDisplay();   // <== EVITA borrar pantalla  en cada loop
      display.setCursor(0, 0);
      display.setTextSize(2);  // <== EVITA cambiar el texto en cada loop
      display.println(posicion);
      display.write(2);
      display.display();
      posicionAnt =  posicion;
      start1 = millis();
    }

  }

  if (state == SETUP) {
    Serial.println(encoder);


    posicion = encoder;
    if ( posicion != posicionAnt || millis() - start2 > 50UL) {
      display.clearDisplay();   // <== EVITA borrar pantalla  en cada loop
      display.setCursor(0, 0);
      display.setTextSize(2);  // <== EVITA cambiar el texto en cada loop
      display.println(posicion);
      display.write(2);
      display.display();
      posicionAnt =  posicion;
      start2 = millis();
    }
  }

  timeClient.update();

}

/////////////////////////////////////////////////////////////////

// on change
void rotate(ESPRotary & r) {
  //Serial.println(r.getPosition());
  pos = r.getPosition();
}


// on left or right rotation
void showDirection(ESPRotary & r) {
  //Serial.println(r.directionToString(r.getDirection()));
  if  (state == MEASURE_REGULATION) {
    if (r.directionToString(r.getDirection()) == "right") {
      //Serial.println("Hola");
      hl += 1;
    }
    else {
      //Serial.println("No");
      hl -= 1;
    }
    hl = min(hh, max(10,   hl));
  }
  if  (state == SETUP) {
    if (r.directionToString(r.getDirection()) == "right") {
      //Serial.println("Hola1");
      encoder += 0.1;
    }
    else {
      //Serial.println("No1");
      encoder -= 0.1;
    }
    encoder = min(60.0, max(20.0, encoder));

  }
}

// single click
void click(Button2 & btn) {
  //Serial.println("Click!");
  switch (state)
  {
    case MEASURE_REGULATION:

      if (btn.wasPressedFor())
      {
        state = SETUP;
        //Serial.println("MENU 1");
      }
      break;
    case SETUP:

      if (btn.wasPressedFor())
      {
        //set = encoder;
        state = HUMIDITY;
        //Serial.println("MENU 2");
      }
      break;
    case HUMIDITY:

      if (btn.wasPressedFor())
      {
        //sout = encod;
        state = HIGHEST;
        //Serial.println("MENU 3");
      }
      break;
    case HIGHEST:

      if (btn.wasPressedFor())
      {
        //cof = hh;
        state = LOWER;
        //Serial.println("MENU 4");

      }
      break;
    case LOWER:

      if (btn.wasPressedFor())
      {
        //cof1 = hl;
        state = MEASURE_REGULATION;
        //Serial.println("MENU 0");
      }
      break;
  }
}

// long click

void speedupStarted(ESPRotary & r) {
  //Serial.println("Speedup started");
}

void speedupEnded(ESPRotary & r) {
  //Serial.println("Speedup ended");
}

Chiste!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.