Problemas con millis no ejecuta la secuencia y detiene todo código

Buenas, estoy desarrollando un proyecto que trata sobre la medición de corriente AC, voltaje AC y potencia, estos valores se muestran en una pantala OLED y adicional tiene que hacer una lógica de control para activar y desactivar secuencialmente las salidas de un módulo de 8 reles, para esto utilice la función MILLIS(); el problema es que al igualar una variable llamada (encendidoMillis) a la (currentMillis) el código no funciona, pienso que el problema esta en la aparte de la lógica de control y el uso de millis, ya que al eliminar esta sección del código, llamada // SECUENCIA PARA ACTIVACION DE SALIDAS // , el muestreo de señales y la visualización en la pantalla OLED funcionan bien, e igual, con el sketch completo, pero colocando como comentario ( // encendidoMillis = currentMillis) tambien me corre el código, pero por supuesto no me hace bien la secuencia de encendido y apagado de los reles.
Agradezco cualquier aporte que puedan hacer para resolver la falla, a continuación está el código

//MEDICION DE CORRIENTE AC USANDO EL SENSOR SCT013-000
//MEDICION DE VOLTAJE AC USANDO EL SENSOR ZMPT101B
//I1 y I2 REAL , V1 y V2 REAL, T1 y T2 REAL
//CONTROL DE SALIDAS SEGUN RANGO DE CORRIENTE
//USO DE LIBRERIA EMONLIB PARA CALCULO DE CORRIENTE IRMS
//VISUALIZACION POR DISPLAY OLED 128X64
//AUTOR: LUIS HERNANDEZ - Iot and Automation - www.iotandautomation.com
//FECHA: 27/04/21
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////

// Libreria para calculo de corriente
#include "EmonLib.h"

//Librerias para pantallas 
#include <Adafruit_SSD1306.h>
#include <splash.h>
#include <Adafruit_GFX.h>
#include <Adafruit_GrayOLED.h>
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <gfxfont.h>
#include <Wire.h>


// Creando una instancia EnergyMonitor
EnergyMonitor energyMonitor1;
EnergyMonitor energyMonitor2;

// Voltaje de nuestra red eléctrica
float voltajeRed = 120.0;


// Variables para calculo de voltaje

int adc_max=570;        //Reemplazar por valor adc_max entregado por el sketch: volt_ac_cal
int adc_min=450;        //Reemplazar por valor adc_min entregado por el sketch: volt_ac_cal
float volt_multi=120;   //Reemplazar por el "voltaje ac rms" entregado por un multimetro
float volt_multi_p;
float volt_multi_n;



//Control de salidas

int APAGADO = 1;
int ENCENDIDO = 0;

int SALIDA1 = 2; // declaramos la variable SALIDA1 y le asignamos el pin 2
int SALIDA2 = 3; // declaramos la variable SALIDA2 y le asignamos el pin 3
int SALIDA3 = 4; // declaramos la variable SALIDA3 y le asignamos el pin 4
int SALIDA4 = 5; // declaramos la variable SALIDA4 y le asignamos el pin 5
int SALIDA5 = 6; // declaramos la variable SALIDA5 y le asignamos el pin 6
int SALIDA6 = 7; // declaramos la variable SALIDA6 y le asignamos el pin 7
int SALIDA7 = 8; // declaramos la variable SALIDA7 y le asignamos el pin 8
int SALIDA8 = 9; // declaramos la variable SALIDA8 y le asignamos el pin 9

// Definiendo datos apra pantalla Oled
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 12
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


// Variables para secuencia de activacion de salidas

//Global Variables
const byte BUTTON=10; // our button pin
const byte BUTTON2=11; // our button pin
 
unsigned long encendidoMillis; // when button was released
unsigned long apagadoMillis; // when led was turned on
unsigned long Encendido_SALIDA1 = 2000; // wait to turn on LED
unsigned long Encendido_SALIDA2 = 4000; // wait to turn on LED
unsigned long Encendido_SALIDA3 = 6000; // wait to turn on LED
unsigned long Encendido_SALIDA4 = 8000; // wait to turn on LED
unsigned long Encendido_SALIDA5 = 10000; // wait to turn on LED
unsigned long Encendido_SALIDA6 = 12000; // wait to turn on LED
unsigned long Encendido_SALIDA7 = 14000; // wait to turn on LED
unsigned long Encendido_SALIDA8 = 16000; // wait to turn on LED

unsigned long Apagado_SALIDA1 = 2000; // turn off LED after this time
unsigned long Apagado_SALIDA2 = 4000; // turn off LED after this time
unsigned long Apagado_SALIDA3 = 6000; // turn off LED after this time
unsigned long Apagado_SALIDA4 = 8000; // turn off LED after this time
unsigned long Apagado_SALIDA5 = 10000; // turn off LED after this time
unsigned long Apagado_SALIDA6 = 12000; // turn off LED after this time
unsigned long Apagado_SALIDA7 = 14000; // turn off LED after this time
unsigned long Apagado_SALIDA8 = 16000; // turn off LED after this time

bool SecuenciaEncendido = false; // flag for when button is let go
bool SecuenciaApagado = false; // flag for when button is let go




void setup()
{
  Serial.begin(115200);

//Configuracion de entrada de botones
 pinMode(BUTTON, INPUT_PULLUP);
 pinMode(BUTTON2, INPUT_PULLUP);

  // Iniciamos la clase indicando
  // Número de pin: donde tenemos conectado el SCT-013
  // Valor de calibración: valor obtenido de la calibración teórica
  energyMonitor1.current(0, 75.1);
  energyMonitor2.current(1, 75.1);

//Configuracion de los pines
  pinMode(SALIDA1, OUTPUT);
  pinMode(SALIDA2, OUTPUT);
  pinMode(SALIDA3, OUTPUT);
  pinMode(SALIDA4, OUTPUT);
  pinMode(SALIDA5, OUTPUT);
  pinMode(SALIDA6, OUTPUT);
  pinMode(SALIDA7, OUTPUT);
  pinMode(SALIDA8, OUTPUT);
  

// Inicializando las salidas
digitalWrite(SALIDA1, APAGADO);
digitalWrite(SALIDA2, APAGADO);
digitalWrite(SALIDA3, APAGADO);
digitalWrite(SALIDA4, APAGADO);
digitalWrite(SALIDA5, APAGADO);
digitalWrite(SALIDA6, APAGADO);
digitalWrite(SALIDA7, APAGADO);
digitalWrite(SALIDA8, APAGADO);

// Inicializando la pantalla Oled
  Wire.begin();
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);  //0x3C
  

//  Inicializacion para calculo de voltaje
  volt_multi_p = volt_multi * 1.4142;   //Voltaje pico= Voltaje RMS * 1.4142 (Corriente Monofasica)
  volt_multi_n = volt_multi_p * -1;

 // get the time at the start of this loop()
 //unsigned long currentMillis = millis(); 
}

void loop()
{
 

  
  // Obtenemos el valor de la corriente eficaz
  // Pasamos el número de muestras que queremos tomar
  double Irms1 = energyMonitor1.calcIrms(1484);
  double Irms2 = energyMonitor2.calcIrms(1484);

  // Calculamos la potencia aparente
  double potencia1 = Irms1 * voltajeRed;
  double potencia2 = Irms2 * voltajeRed;

  // Obtenemos los valores de calculo de voltaje
  float volt_rmsV1=get_voltageV1(); //Voltage eficaz Linea 1 (V-RMS)
  float volt_rmsV2=get_voltageV2(); //Voltage eficaz Linea 2 (V-RMS)

  // Mostramos la información por el monitor serie
  Serial.print("Potencia1 = ");
  Serial.print(potencia1);
  Serial.print("    Irms1 = ");
  Serial.println(Irms1);
  Serial.print("Potencia2 = ");
  Serial.print(potencia2);
  Serial.print("    Irms2 = ");
  Serial.println(Irms2);


 // Mostrar valores en pantalla Oled
  oled.clearDisplay();
  oled.setTextColor(WHITE);
  oled.setTextSize(0);
  oled.setCursor(7,2); // (width=128, height=64)
  oled.print("IoT and Automation");
  oled.setTextSize(0);
  oled.setCursor(0, 16); // (width=128, height=64)
  oled.print("I1= ");
  oled.print(Irms1,2);
  oled.setTextSize(0);
  oled.setCursor(66, 16); // (width=128, height=64)
  oled.print("V1= ");
  oled.print(volt_rmsV1,1);
  oled.setTextSize(0);
  oled.setCursor(0, 25); // (width=128, height=64)
  oled.print("P1= ");
  oled.print(potencia1,1);

  
  oled.setTextSize(0);
  oled.setCursor(0, 31); // (width=128, height=64)
  oled.print("---------------------");
  
  oled.setTextSize(0);
  oled.setCursor(0, 36); // (width=128, height=64)
  oled.print("I2= ");
  oled.print(Irms2,2);
  oled.setTextSize(0);
  oled.setCursor(66, 36); // (width=128, height=64)
  oled.print("V2= ");
  oled.print(volt_rmsV2,1);
  oled.setTextSize(0);
  oled.setCursor(0, 45); // (width=128, height=64)
  oled.print("P2= ");
  oled.print(potencia2,1);
 

  oled.setTextSize(0);
  oled.setCursor(0, 51); // (width=128, height=64)
  oled.print("---------------------");

  oled.setTextSize(0);
  oled.setCursor(0, 57); // (width=128, height=64)
  oled.print("T1= 0.00");
  //oled.print(temp1,2);
  oled.setTextSize(0);
  oled.setCursor(66, 57); // (width=128, height=64)
  oled.print("T2= 0.00");
  //oled.print(temp1,2);

  oled.display(); 
  

    // **** SECUENCIA PARA ACTIVACION DE SALIDAS  *****////


  

 if((Irms1 < 0.6) && (Irms2 < 0.6)){
  

  // get the time at the start of this loop()
     unsigned long currentMillis = millis();
  // update the time when button was pushed
  //   int encendidoMillis = currentMillis;
  //   unsigned long encendidoMillis = currentMillis;
  //   encendidoMillis = currentMillis;
  //   SecuenciaEncendido = true;

  
   



     //encendidoMillis = currentMillis;
   if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA1) {
     // okay, enough time has passed since the button was let go.
     digitalWrite(SALIDA1, ENCENDIDO);
     
     }

  
   if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA2) {
     // okay, enough time has passed since the button was let go.
     digitalWrite(SALIDA2, ENCENDIDO);
     
     } 

 if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA3) {
     // okay, enough time has passed since the button was let go.
     digitalWrite(SALIDA3, ENCENDIDO);
     
     }
     
   if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA4) {
     // okay, enough time has passed since the button was let go.
     digitalWrite(SALIDA4, ENCENDIDO);
     }
      
   if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA5) {
     // okay, enough time has passed since the button was let go.
     digitalWrite(SALIDA5, ENCENDIDO);
     }

   if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA6) {
     // okay, enough time has passed since the button was let go.
     digitalWrite(SALIDA6, ENCENDIDO);
     }

   if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA7) {
     // okay, enough time has passed since the button was let go.
     digitalWrite(SALIDA7, ENCENDIDO);
     }

   if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA8) {
     // okay, enough time has passed since the button was let go.
     digitalWrite(SALIDA8, ENCENDIDO);
     
    //encendidoMillis = currentMillis;
   }

  }
  
  

else {

  // get the time at the start of this loop()
     unsigned long currentMillis = millis();
  // update the time when button was pushed
  //unsigned long apagadoMillis = currentMillis;
  //  apagadoMillis = currentMillis;


   if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA1) {
     digitalWrite(SALIDA8, APAGADO);
     }
    
   if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA2) {
     digitalWrite(SALIDA7, APAGADO);
     }

   if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA3) {
     digitalWrite(SALIDA6, APAGADO);
     }

   if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA4) {
     digitalWrite(SALIDA5, APAGADO);     
     }

   if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA5) {
     digitalWrite(SALIDA4, APAGADO);
     }
    
   if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA6) {
     digitalWrite(SALIDA3, APAGADO);
     }

   if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA7) {
     digitalWrite(SALIDA2, APAGADO);
     }

   if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA8) {
     digitalWrite(SALIDA1, APAGADO); 
 
     //apagadoMillis = currentMillis;
     //SecuenciaApagado = false;
   }
 
}






//***************************************//
///////////////////////////////////////////



}


float get_voltageV1(void)
{

//// **********  Variables Locales  ***********////
  
  float adc_sample;
  float volt_inst=0;
  float Sumatoria=0;
  float volt;
  long tiempo_init=millis();
  int N=0;

//// ****************************************** ////  

//// **********  Calculo de Voltaje en Linea 1  ***********////
  
  while( (millis() - tiempo_init) < 500)//Duración 0.5 segundos(Aprox. 30 ciclos de 60Hz)
  { 
    
    adc_sample = analogRead(A2);    //voltaje del sensor
    volt_inst = map(adc_sample,adc_min,adc_max,volt_multi_n,volt_multi_p);
    Sumatoria = Sumatoria+sq(volt_inst);    //Sumatoria de Cuadrados
    N = N+1;
    delay(1);
  }
  
  
  volt=sqrt((Sumatoria)/N); //ecuación del RMS
  return(volt);

//// **************************************************** ////  

}

float get_voltageV2(void)
{

//// **********  Variables Locales  ***********////
  
  float adc_sample;
  float volt_inst=0;
  float Sumatoria=0;
  float volt;
  long tiempo_init=millis();
  int N=0;

//// ****************************************** ////  

//// **********  Calculo de Voltaje en Linea 2  ***********////
    
  while( (millis() - tiempo_init) < 500)//Duración 0.5 segundos(Aprox. 30 ciclos de 60Hz)
  { 
    
    adc_sample = analogRead(A3);    //voltaje del sensor
    volt_inst = map(adc_sample,adc_min,adc_max,volt_multi_n,volt_multi_p);
    Sumatoria = Sumatoria+sq(volt_inst);    //Sumatoria de Cuadrados
    N = N+1;
    delay(1);
  }
  
  
  volt=sqrt((Sumatoria)/N); //ecuación del RMS
  return(volt);

//// **************************************************** ////  

}

Una primera observación:

En la funcíón get_voltageV declaras la variable tiempo_init como un long. Esto significa que será un entero largo con signo, con lo puede
causarte problemas con millis. Cambia el tipo a unsigned long.

Haces lo mismo en la función getVoltage2.

El problema con millis es que asignas el tiempo en encendidoMillis en cada pasada del if
por lo tanto la condición de la secuencia no llega nunca a cumplirse. Igualmente ocurre
cuando haces el apagado. Y luego veo por la cantidad de variables que hay que has intentado solventar el problema y no pudiste.

Te dejo una pequeña aproximación (al no disponer de todas las librerias no he podido comprobar que no da error de compilación).

 // Leemos el valor del reloj.
 unsigned long currentMillis = millis();
 if ( (Irms1<06.6) && (Irms2<0.6) {
   // Comprobamos que no estamos en una secuencia de encendido, si no lo estamos, la activamos, le
   // decimos que la de apagado no se ejecuta y anotamos cuando se ha producido.
   // Si ya habia pasado por este if y la secuencia estaba activa no hace nada.
   if ( secuenciaEncendido==false ) {
      secuenciaEncendido=true;
      secuenciaApagado=false;
      encendidoMillis = currentMillis();
   }
 }
 else {
   // Al igual que hacemos con la de encendido, hacemos con la de apagado.
   if ( secuenciaApagado==false ) {
     secuenciaApagado=true;
     secuenciaEncendido=false;
     apagadoMillis = currentMillis();   
   }
 }

 
if (secuenciaEncendido) {
  if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA1) digitalWrite(SALIDA1, ENCENDIDO);
  if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA2) digitalWrite(SALIDA2, ENCENDIDO);
  if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA3) digitalWrite(SALIDA3, ENCENDIDO);
  if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA4) digitalWrite(SALIDA4, ENCENDIDO);
  if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA5) digitalWrite(SALIDA5, ENCENDIDO);
  if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA6) digitalWrite(SALIDA6, ENCENDIDO);
  if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA7) digitalWrite(SALIDA7, ENCENDIDO);
  if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA8) digitalWrite(SALIDA8, ENCENDIDO);
}

if (secuenciaApagado) {
  if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA1) digitalWrite(SALIDA8, APAGADO);
  if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA2) digitalWrite(SALIDA7, APAGADO);
  if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA3) digitalWrite(SALIDA6, APAGADO);
  if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA4) digitalWrite(SALIDA5, APAGADO);     
  if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA5) digitalWrite(SALIDA4, APAGADO);
  if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA6) digitalWrite(SALIDA3, APAGADO);
  if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA7) digitalWrite(SALIDA2, APAGADO);
  if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA8) digitalWrite(SALIDA1, APAGADO); 
}

Una pequeña explicación: cuando la condición se cumple hemos de realizar una secuencia de encendido, para ello usamos la variable secuenciaEncendido. Si la secuencia no estaba
activa, la activamos, guardamos millis en la variable encendidoMillis y apagamos la
secuencia de apagado (por si estabamos ejutándola). Si la condición no es cierta hacemos
lo mismo con la secuencia de apagado de la misma manera.

El código de las secuencias solo debe ejecutarse si la secuencia correspondiente estan
activas.

Hola @victorjam muchas gracias por tu respuesta, ya realice las modificaciones que me indicaste, le asigne UNSIGNED LONG a GetVoltage1 y GetVoltage2, y coloque el código de la secuencia como me lo enviaste, pero al momento de compilar, me da un error en el IF (secuenciaEncendido), me dice 'secuenciaEncendido' was not declared in this scope .

Manias de informático, tu has llamado a la variable SecuenciaEncendido y yo secuenciaEncendido. La S del principio.
Cuando tengas un mensaje "variable was not declared in this scope" es que tienes una variable que no has declarado, en este caso secuenciaEncendido.

@victorjam muchas gracias, si de verdad son detalles que se pasan por alto lo de las variables con Mayusculas y Minusculas, ya hice la modificación, y ahora me da el siguiente error en la línea de codigo donde igualo ( apagadoMillis = currentMillis) , me da el error

'currentMillis' cannot be used as a function

si le comento esa linea que me da el error (//apagadoMillis = currentMillis(); ) , tambien (//encendidoMillis = currentMillis(); ) el monitoreo si lo hace por puerto serial, pero no me esta visualizando las variables por la pantalla OLED; y la secuencia del modulo de rele tampoco la esta haciendo

Otro fallo tonto mio. El compilador te está diciendo que estas usando una variable como si fuera una llamada a una función, le he puesto los parentesis (), quitaselos!

@victorjam ok, ya le quite el (); , ya compilo y no me da error, péro al cargarlo en el arduino sigue igual con la falla, es decir, no me corre la secuencia de encendido y apagado del modulo del rele, y la pantalla OLED se queda estatica, pero lo que si esta corriendo es el muestreo de las variables porque las veo a traves del puerto serial

aca el codigo completo

//MEDICION DE CORRIENTE AC USANDO EL SENSOR SCT013-000
//MEDICION DE VOLTAJE AC USANDO EL SENSOR ZMPT101B
//I1 y I2 REAL , V1 y V2 REAL, T1 y T2 REAL
//CONTROL DE SALIDAS SEGUN RANGO DE CORRIENTE
//USO DE LIBRERIA EMONLIB PARA CALCULO DE CORRIENTE IRMS
//VISUALIZACION POR DISPLAY OLED 128X64
//AUTOR: LUIS HERNANDEZ - Iot and Automation - www.iotandautomation.com
//FECHA: 27/01/21
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////

// Libreria para calculo de corriente
#include "EmonLib.h"

//Librerias para pantallas 
#include <Adafruit_SSD1306.h>
#include <splash.h>
#include <Adafruit_GFX.h>
#include <Adafruit_GrayOLED.h>
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <gfxfont.h>
#include <Wire.h>


// Creando una instancia EnergyMonitor
EnergyMonitor energyMonitor1;
EnergyMonitor energyMonitor2;

// Voltaje de nuestra red eléctrica
float voltajeRed = 120.0;


// Variables para calculo de voltaje

int adc_max=570;        //Reemplazar por valor adc_max entregado por el sketch: volt_ac_cal
int adc_min=450;        //Reemplazar por valor adc_min entregado por el sketch: volt_ac_cal
float volt_multi=120;   //Reemplazar por el "voltaje ac rms" entregado por un multimetro
float volt_multi_p;
float volt_multi_n;



//Control de salidas

int APAGADO = 1;
int ENCENDIDO = 0;

int SALIDA1 = 2; // declaramos la variable SALIDA1 y le asignamos el pin 2
int SALIDA2 = 3; // declaramos la variable SALIDA2 y le asignamos el pin 3
int SALIDA3 = 4; // declaramos la variable SALIDA3 y le asignamos el pin 4
int SALIDA4 = 5; // declaramos la variable SALIDA4 y le asignamos el pin 5
int SALIDA5 = 6; // declaramos la variable SALIDA5 y le asignamos el pin 6
int SALIDA6 = 7; // declaramos la variable SALIDA6 y le asignamos el pin 7
int SALIDA7 = 8; // declaramos la variable SALIDA7 y le asignamos el pin 8
int SALIDA8 = 9; // declaramos la variable SALIDA8 y le asignamos el pin 9

// Definiendo datos apra pantalla Oled
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 12
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


// Variables para secuencia de activacion de salidas

//Global Variables
const byte BUTTON=10; // our button pin
const byte BUTTON2=11; // our button pin
 
unsigned long encendidoMillis; // when button was released
unsigned long apagadoMillis; // when led was turned on
unsigned long Encendido_SALIDA1 = 2000; // wait to turn on LED
unsigned long Encendido_SALIDA2 = 4000; // wait to turn on LED
unsigned long Encendido_SALIDA3 = 6000; // wait to turn on LED
unsigned long Encendido_SALIDA4 = 8000; // wait to turn on LED
unsigned long Encendido_SALIDA5 = 10000; // wait to turn on LED
unsigned long Encendido_SALIDA6 = 12000; // wait to turn on LED
unsigned long Encendido_SALIDA7 = 14000; // wait to turn on LED
unsigned long Encendido_SALIDA8 = 16000; // wait to turn on LED

unsigned long Apagado_SALIDA1 = 2000; // turn off LED after this time
unsigned long Apagado_SALIDA2 = 4000; // turn off LED after this time
unsigned long Apagado_SALIDA3 = 6000; // turn off LED after this time
unsigned long Apagado_SALIDA4 = 8000; // turn off LED after this time
unsigned long Apagado_SALIDA5 = 10000; // turn off LED after this time
unsigned long Apagado_SALIDA6 = 12000; // turn off LED after this time
unsigned long Apagado_SALIDA7 = 14000; // turn off LED after this time
unsigned long Apagado_SALIDA8 = 16000; // turn off LED after this time

bool SecuenciaEncendido = false; // flag for when button is let go
bool SecuenciaApagado = false; // flag for when button is let go




void setup()
{
  Serial.begin(115200);

//Configuracion de entrada de botones
 pinMode(BUTTON, INPUT_PULLUP);
 pinMode(BUTTON2, INPUT_PULLUP);

  // Iniciamos la clase indicando
  // Número de pin: donde tenemos conectado el SCT-013
  // Valor de calibración: valor obtenido de la calibración teórica
  energyMonitor1.current(0, 75.1);
  energyMonitor2.current(1, 75.1);

//Configuracion de los pines
  pinMode(SALIDA1, OUTPUT);
  pinMode(SALIDA2, OUTPUT);
  pinMode(SALIDA3, OUTPUT);
  pinMode(SALIDA4, OUTPUT);
  pinMode(SALIDA5, OUTPUT);
  pinMode(SALIDA6, OUTPUT);
  pinMode(SALIDA7, OUTPUT);
  pinMode(SALIDA8, OUTPUT);
  

// Inicializando las salidas
digitalWrite(SALIDA1, APAGADO);
digitalWrite(SALIDA2, APAGADO);
digitalWrite(SALIDA3, APAGADO);
digitalWrite(SALIDA4, APAGADO);
digitalWrite(SALIDA5, APAGADO);
digitalWrite(SALIDA6, APAGADO);
digitalWrite(SALIDA7, APAGADO);
digitalWrite(SALIDA8, APAGADO);

// Inicializando la pantalla Oled
  Wire.begin();
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);  //0x3C
  

//  Inicializacion para calculo de voltaje
  volt_multi_p = volt_multi * 1.4142;   //Voltaje pico= Voltaje RMS * 1.4142 (Corriente Monofasica)
  volt_multi_n = volt_multi_p * -1;

 // get the time at the start of this loop()
 //unsigned long currentMillis = millis(); 
}

void loop()
{
 

  
  // Obtenemos el valor de la corriente eficaz
  // Pasamos el número de muestras que queremos tomar
  double Irms1 = energyMonitor1.calcIrms(1484);
  double Irms2 = energyMonitor2.calcIrms(1484);

  // Calculamos la potencia aparente
  double potencia1 = Irms1 * voltajeRed;
  double potencia2 = Irms2 * voltajeRed;

  // Obtenemos los valores de calculo de voltaje
  float volt_rmsV1=get_voltageV1(); //Voltage eficaz Linea 1 (V-RMS)
  float volt_rmsV2=get_voltageV2(); //Voltage eficaz Linea 2 (V-RMS)

  // Mostramos la información por el monitor serie
  Serial.print("Potencia1 = ");
  Serial.print(potencia1);
  Serial.print("    Irms1 = ");
  Serial.println(Irms1);
  Serial.print("Potencia2 = ");
  Serial.print(potencia2);
  Serial.print("    Irms2 = ");
  Serial.println(Irms2);
  Serial.print("    Vac1 = ");
  Serial.println(volt_rmsV1);
  Serial.print("    Vac2 = ");
  Serial.println(volt_rmsV2);


 // Mostrar valores en pantalla Oled
  oled.clearDisplay();
  oled.setTextColor(WHITE);
  oled.setTextSize(0);
  oled.setCursor(7,2); // (width=128, height=64)
  oled.print("IoT and Automation");
  oled.setTextSize(0);
  oled.setCursor(0, 16); // (width=128, height=64)
  oled.print("I1= ");
  oled.print(Irms1,2);
  oled.setTextSize(0);
  oled.setCursor(66, 16); // (width=128, height=64)
  oled.print("V1= ");
  oled.print(volt_rmsV1,1);
  oled.setTextSize(0);
  oled.setCursor(0, 25); // (width=128, height=64)
  oled.print("P1= ");
  oled.print(potencia1,1);

  
  oled.setTextSize(0);
  oled.setCursor(0, 31); // (width=128, height=64)
  oled.print("---------------------");
  
  oled.setTextSize(0);
  oled.setCursor(0, 36); // (width=128, height=64)
  oled.print("I2= ");
  oled.print(Irms2,2);
  oled.setTextSize(0);
  oled.setCursor(66, 36); // (width=128, height=64)
  oled.print("V2= ");
  oled.print(volt_rmsV2,1);
  oled.setTextSize(0);
  oled.setCursor(0, 45); // (width=128, height=64)
  oled.print("P2= ");
  oled.print(potencia2,1);
 

  oled.setTextSize(0);
  oled.setCursor(0, 51); // (width=128, height=64)
  oled.print("---------------------");

  oled.setTextSize(0);
  oled.setCursor(0, 57); // (width=128, height=64)
  oled.print("T1= 0.00");
  //oled.print(temp1,2);
  oled.setTextSize(0);
  oled.setCursor(66, 57); // (width=128, height=64)
  oled.print("T2= 0.00");
  //oled.print(temp1,2);

  oled.display(); 
  

    // **** SECUENCIA PARA ACTIVACION DE SALIDAS  *****////


  

  // Leemos el valor del reloj.
 unsigned long currentMillis = millis();


 if ((Irms1<0.6) && (Irms2<0.6)) {
   // Comprobamos que no estamos en una secuencia de encendido, si no lo estamos, la activamos, le
   // decimos que la de apagado no se ejecuta y anotamos cuando se ha producido.
   // Si ya habia pasado por este if y la secuencia estaba activa no hace nada.
   SecuenciaEncendido=true;
   if ( SecuenciaEncendido==false ) {
      SecuenciaEncendido=true;
      SecuenciaApagado=false;
      encendidoMillis = currentMillis;
   }
 }
 else {
   // Al igual que hacemos con la de encendido, hacemos con la de apagado.
   if ( SecuenciaApagado==false ) {
     SecuenciaApagado=true;
     SecuenciaEncendido=false;
     apagadoMillis = currentMillis;   
   }
 }
 
//}
 
if (SecuenciaEncendido) {

  if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA1) digitalWrite(SALIDA1, ENCENDIDO);
  if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA2) digitalWrite(SALIDA2, ENCENDIDO);
  if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA3) digitalWrite(SALIDA3, ENCENDIDO);
  if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA4) digitalWrite(SALIDA4, ENCENDIDO);
  if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA5) digitalWrite(SALIDA5, ENCENDIDO);
  if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA6) digitalWrite(SALIDA6, ENCENDIDO);
  if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA7) digitalWrite(SALIDA7, ENCENDIDO);
  if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA8) digitalWrite(SALIDA8, ENCENDIDO);
}

if (SecuenciaApagado) {
  if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA1) digitalWrite(SALIDA8, APAGADO);
  if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA2) digitalWrite(SALIDA7, APAGADO);
  if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA3) digitalWrite(SALIDA6, APAGADO);
  if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA4) digitalWrite(SALIDA5, APAGADO);    
  if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA5) digitalWrite(SALIDA4, APAGADO);
  if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA6) digitalWrite(SALIDA3, APAGADO);
  if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA7) digitalWrite(SALIDA2, APAGADO);
  if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA8) digitalWrite(SALIDA1, APAGADO);
}






//***************************************//
///////////////////////////////////////////



}



float get_voltageV1(void)
{

//// **********  Variables Locales  ***********////
  
  float adc_sample;
  float volt_inst=0;
  float Sumatoria=0;
  float volt;
  unsigned long tiempo_init=millis();
  int N=0;

//// ****************************************** ////  

//// **********  Calculo de Voltaje en Linea 1  ***********////
  
  while( (millis() - tiempo_init) < 500)//Duración 0.5 segundos(Aprox. 30 ciclos de 60Hz)
  { 
    
    adc_sample = analogRead(A2);    //voltaje del sensor
    volt_inst = map(adc_sample,adc_min,adc_max,volt_multi_n,volt_multi_p);
    Sumatoria = Sumatoria+sq(volt_inst);    //Sumatoria de Cuadrados
    N = N+1;
    delay(1);
  }
  
  
  volt=sqrt((Sumatoria)/N); //ecuación del RMS
  return(volt);

//// **************************************************** ////  

}

float get_voltageV2(void)
{

//// **********  Variables Locales  ***********////
  
  float adc_sample;
  float volt_inst=0;
  float Sumatoria=0;
  float volt;
  unsigned long tiempo_init=millis();
  int N=0;

//// ****************************************** ////  

//// **********  Calculo de Voltaje en Linea 2  ***********////
    
  while( (millis() - tiempo_init) < 500)//Duración 0.5 segundos(Aprox. 30 ciclos de 60Hz)
  { 
    
    adc_sample = analogRead(A3);    //voltaje del sensor
    volt_inst = map(adc_sample,adc_min,adc_max,volt_multi_n,volt_multi_p);
    Sumatoria = Sumatoria+sq(volt_inst);    //Sumatoria de Cuadrados
    N = N+1;
    delay(1);
  }
  
  
  volt=sqrt((Sumatoria)/N); //ecuación del RMS
  return(volt);

//// **************************************************** ////  

}

He modificado el programa para poder simularlo en proteus. He comentado las líneas correspondientes a la pantalla OLED dado que no tengo las librerias y no tengo la posibilidad de simularlo.

Solo he visto un problema en el codigo que te pase y era una mala asignación:

#include "EmonLib.h"

/*
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <splash.h>
#include <Adafruit_GFX.h>
#include <Adafruit_GrayOLED.h>
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <gfxfont.h>
*/


// Creando una instancia EnergyMonitor
EnergyMonitor energyMonitor1;
EnergyMonitor energyMonitor2;

// Voltaje de nuestra red eléctrica
float voltajeRed = 120.0;


// Variables para calculo de voltaje

int adc_max = 570;      //Reemplazar por valor adc_max entregado por el sketch: volt_ac_cal
int adc_min = 450;      //Reemplazar por valor adc_min entregado por el sketch: volt_ac_cal
float volt_multi = 120; //Reemplazar por el "voltaje ac rms" entregado por un multimetro
float volt_multi_p;
float volt_multi_n;



//Control de salidas

int APAGADO = 1;
int ENCENDIDO = 0;

int SALIDA1 = 2; // declaramos la variable SALIDA1 y le asignamos el pin 2
int SALIDA2 = 3; // declaramos la variable SALIDA2 y le asignamos el pin 3
int SALIDA3 = 4; // declaramos la variable SALIDA3 y le asignamos el pin 4
int SALIDA4 = 5; // declaramos la variable SALIDA4 y le asignamos el pin 5
int SALIDA5 = 6; // declaramos la variable SALIDA5 y le asignamos el pin 6
int SALIDA6 = 7; // declaramos la variable SALIDA6 y le asignamos el pin 7
int SALIDA7 = 8; // declaramos la variable SALIDA7 y le asignamos el pin 8
int SALIDA8 = 9; // declaramos la variable SALIDA8 y le asignamos el pin 9

// Definiendo datos apra pantalla Oled
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 12
// Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


// Variables para secuencia de activacion de salidas

//Global Variables
const byte BUTTON = 10; // our button pin
const byte BUTTON2 = 11; // our button pin

unsigned long encendidoMillis; // when button was released
unsigned long apagadoMillis; // when led was turned on
unsigned long Encendido_SALIDA1 = 2000; // wait to turn on LED
unsigned long Encendido_SALIDA2 = 4000; // wait to turn on LED
unsigned long Encendido_SALIDA3 = 6000; // wait to turn on LED
unsigned long Encendido_SALIDA4 = 8000; // wait to turn on LED
unsigned long Encendido_SALIDA5 = 10000; // wait to turn on LED
unsigned long Encendido_SALIDA6 = 12000; // wait to turn on LED
unsigned long Encendido_SALIDA7 = 14000; // wait to turn on LED
unsigned long Encendido_SALIDA8 = 16000; // wait to turn on LED

unsigned long Apagado_SALIDA1 = 2000; // turn off LED after this time
unsigned long Apagado_SALIDA2 = 4000; // turn off LED after this time
unsigned long Apagado_SALIDA3 = 6000; // turn off LED after this time
unsigned long Apagado_SALIDA4 = 8000; // turn off LED after this time
unsigned long Apagado_SALIDA5 = 10000; // turn off LED after this time
unsigned long Apagado_SALIDA6 = 12000; // turn off LED after this time
unsigned long Apagado_SALIDA7 = 14000; // turn off LED after this time
unsigned long Apagado_SALIDA8 = 16000; // turn off LED after this time

bool SecuenciaEncendido = false; // flag for when button is let go
bool SecuenciaApagado = false; // flag for when button is let go

double Irms1=1.0, Irms2=1.0;


void setup()
{
  Serial.begin(57600);

  //Configuracion de entrada de botones
  pinMode(BUTTON, INPUT_PULLUP);
  pinMode(BUTTON2, INPUT_PULLUP);

  // Iniciamos la clase indicando
  // Número de pin: donde tenemos conectado el SCT-013
  // Valor de calibración: valor obtenido de la calibración teórica
  energyMonitor1.current(A0, 75.1);
  energyMonitor2.current(A1, 75.1);

  //Configuracion de los pines
  pinMode(SALIDA1, OUTPUT);
  pinMode(SALIDA2, OUTPUT);
  pinMode(SALIDA3, OUTPUT);
  pinMode(SALIDA4, OUTPUT);
  pinMode(SALIDA5, OUTPUT);
  pinMode(SALIDA6, OUTPUT);
  pinMode(SALIDA7, OUTPUT);
  pinMode(SALIDA8, OUTPUT);

  // Inicializando las salidas
  digitalWrite(SALIDA1, APAGADO);
  digitalWrite(SALIDA2, APAGADO);
  digitalWrite(SALIDA3, APAGADO);
  digitalWrite(SALIDA4, APAGADO);
  digitalWrite(SALIDA5, APAGADO);
  digitalWrite(SALIDA6, APAGADO);
  digitalWrite(SALIDA7, APAGADO);
  digitalWrite(SALIDA8, APAGADO);

  // Inicializando la pantalla Oled
  //Wire.begin();
  //oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);  //0x3C

  volt_multi_p = volt_multi * 1.4142; 
  volt_multi_n = volt_multi_p * -1;
}

  
void loop()
{
  Irms1 = energyMonitor1.calcIrms(1484);
  Irms2 = energyMonitor2.calcIrms(1484);
  // Calculamos la potencia aparente
  double potencia1 = Irms1 * voltajeRed;
  double potencia2 = Irms2 * voltajeRed;

  // Obtenemos los valores de calculo de voltaje
  float volt_rmsV1 = get_voltageV1(); //Voltage eficaz Linea 1 (V-RMS)
  float volt_rmsV2 = get_voltageV2(); //Voltage eficaz Linea 2 (V-RMS)

  // Mostramos la información por el monitor serie
  Serial.print("Potencia1 = ");
  Serial.print(potencia1);
  Serial.print("    Irms1 = ");
  Serial.println(Irms1);
  Serial.print("Potencia2 = ");
  Serial.print(potencia2);
  Serial.print("    Irms2 = ");
  Serial.println(Irms2);
  Serial.print("    Vac1 = ");
  Serial.println(volt_rmsV1);
  Serial.print("    Vac2 = ");
  Serial.println(volt_rmsV2);


  // Mostrar valores en pantalla Oled
  /*
  oled.clearDisplay();
  oled.setTextColor(WHITE);
  oled.setTextSize(0);
  oled.setCursor(7, 2); // (width=128, height=64)
  oled.print("IoT and Automation");
  oled.setTextSize(0);
  oled.setCursor(0, 16); // (width=128, height=64)
  oled.print("I1= ");
  oled.print(Irms1, 2);
  oled.setTextSize(0);
  oled.setCursor(66, 16); // (width=128, height=64)
  oled.print("V1= ");
  oled.print(volt_rmsV1, 1);
  oled.setTextSize(0);
  oled.setCursor(0, 25); // (width=128, height=64)
  oled.print("P1= ");
  oled.print(potencia1, 1);


  oled.setTextSize(0);
  oled.setCursor(0, 31); // (width=128, height=64)
  oled.print("---------------------");

  oled.setTextSize(0);
  oled.setCursor(0, 36); // (width=128, height=64)
  oled.print("I2= ");
  oled.print(Irms2, 2);
  oled.setTextSize(0);
  oled.setCursor(66, 36); // (width=128, height=64)
  oled.print("V2= ");
  oled.print(volt_rmsV2, 1);
  oled.setTextSize(0);
  oled.setCursor(0, 45); // (width=128, height=64)
  oled.print("P2= ");
  oled.print(potencia2, 1);


  oled.setTextSize(0);
  oled.setCursor(0, 51); // (width=128, height=64)
  oled.print("---------------------");

  oled.setTextSize(0);
  oled.setCursor(0, 57); // (width=128, height=64)
  oled.print("T1= 0.00");
  //oled.print(temp1,2);
  oled.setTextSize(0);
  oled.setCursor(66, 57); // (width=128, height=64)
  oled.print("T2= 0.00");
  //oled.print(temp1,2);

  oled.display();
  */

  unsigned long currentMillis = millis();

  if ((Irms1 < 0.6) && (Irms2 < 0.6)) {
    // Comprobamos que no estamos en una secuencia de encendido, si no lo estamos, la activamos, le
    // decimos que la de apagado no se ejecuta y anotamos cuando se ha producido.
    // Si ya habia pasado por este if y la secuencia estaba activa no hace nada.
    if ( SecuenciaEncendido == false ) {
      Serial.print("Iniciando secuencia Encendido");
      SecuenciaEncendido = true;
      SecuenciaApagado = false;
      encendidoMillis = currentMillis;
    }
  }
  else {
    // Al igual que hacemos con la de encendido, hacemos con la de apagado.
    if ( SecuenciaApagado == false ) {
      Serial.print("Iniciando secuencia Apagado");
      SecuenciaApagado = true;
      SecuenciaEncendido = false;
      apagadoMillis = currentMillis;
    }
  }

  //}

  if (SecuenciaEncendido) {

    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA1) digitalWrite(SALIDA1, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA2) digitalWrite(SALIDA2, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA3) digitalWrite(SALIDA3, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA4) digitalWrite(SALIDA4, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA5) digitalWrite(SALIDA5, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA6) digitalWrite(SALIDA6, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA7) digitalWrite(SALIDA7, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA8) digitalWrite(SALIDA8, ENCENDIDO);
  }
  if (SecuenciaApagado) {
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA1) digitalWrite(SALIDA8, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA2) digitalWrite(SALIDA7, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA3) digitalWrite(SALIDA6, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA4) digitalWrite(SALIDA5, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA5) digitalWrite(SALIDA4, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA6) digitalWrite(SALIDA3, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA7) digitalWrite(SALIDA2, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA8) digitalWrite(SALIDA1, APAGADO);
  }

}



float get_voltageV1(void)
{
  float adc_sample;
  float volt_inst = 0;
  float Sumatoria = 0;
  float volt;
  unsigned long tiempo_init = millis();
  int N = 0;

  while ( (millis() - tiempo_init) < 500) //Duración 0.5 segundos(Aprox. 30 ciclos de 60Hz)
  {

    adc_sample = analogRead(A2);    //voltaje del sensor
    volt_inst = map(adc_sample, adc_min, adc_max, volt_multi_n, volt_multi_p);
    Sumatoria = Sumatoria + sq(volt_inst);  //Sumatoria de Cuadrados
    N = N + 1;
    delay(1);
  }
  volt = sqrt((Sumatoria) / N); //ecuación del RMS
  return (volt);
}

float get_voltageV2(void)
{
  float adc_sample;
  float volt_inst = 0;
  float Sumatoria = 0;
  float volt;
  unsigned long tiempo_init = millis();
  int N = 0;
  while ( (millis() - tiempo_init) < 500) //Duración 0.5 segundos(Aprox. 30 ciclos de 60Hz)
  {

    adc_sample = analogRead(A3);    //voltaje del sensor
    volt_inst = map(adc_sample, adc_min, adc_max, volt_multi_n, volt_multi_p);
    Sumatoria = Sumatoria + sq(volt_inst);  //Sumatoria de Cuadrados
    N = N + 1;
    delay(1);
  }
}

El programa se supone que hace lo que tiene que hacer. Cuiando las variables Irms1 y Irms2 valen menos de 0.6 los leds se encienden poco a poco, y cuando la condición no se cumple, bajan.

No parece que la rutina de visualización del OLED pueda causar ningún problema pero no lo puedo asegurar al 100%.

En la simulación con proteus he usado potenciometros para simular tanto corriente como tensión. Por lo que las medidas no eran muy acordes a lo que se supone es la realidad, pero aun
así conseguia bajar la corriente a los puntos deseados y los leds se encendian.

Hola @victorjam , muchisimas gracias por tu ayuda, ya probé el código y así tal y como me lo enviaste la parte de monitoreo y control funciona bien ,ya hice las pruebas en el montaje real y funciona bien, pero sabes que al descomentar el código para la visualización de la pantalla OLED se para el funcionamiento, al parecer eso es lo que está dando conflicto. He descomentado lo de la pantalla parte por parte y he ido probando poco a poco, primero las librerías y funciona bien el prototipo pero sin visualización, inicialización del wire y oled y funciona bien el prototio sin visualización, y cuando descomento la parte que este en el VOID LOOP que es para comenzar a enviar la data a la pantalla OLED es que se para todo.

Por un lado se me ocurre que tienes un problema de RAM

Mi experiencia me dice que las pantallas gráficas consumen mucha memoria RAM, por lo que conviene tener mucho ojo con ellas.

Comprueba que cuando compiles el resultado no sea un mensaje de error diciendo que has ocupado toda la memoria RAM. El resultado debe ser como esto:

El Sketch usa 6334 bytes (19%) del espacio de almacenamiento de programa. El máximo es 32256 bytes.
Las variables Globales usan 544 bytes (26%) de la memoria dinámica, dejando 1504 bytes para las variables locales. El máximo es 2048 bytes.

El código que te pase se come ya el 26% de la memoria sin usar la pantalla OLED, si esta se come el resto puede haber problemas...

Cuando uso pantallas gráficas recurro a los atmega.

Otro problema puede ser que la libreria haga uso del timer0, por lo tanto se carga millis, micros, delay... aunque no sé hasta que punto pude llegar a ser asi.

@victorjam estos son los datos de consumo del sketch al compilarlo

Todavia queda bastantes recursos disponibles.

Que me recomiendas que haga?

Pruebo con otra platalla? de pronto una lcd 2x16 a ver que tal se comporta ? el problema es que los datos que necesito mostrar para la visualizacion no me van a entrar alli. O usar un arduino mas potente ? tengo el mega, y hasta un arduino due.

De verdad que ya no se que hacer, probe colocar todo en funciones diferentes e igual me da el fallo (no se si fue que no lo supe hacer), tambien utilice una libreria que se llama PROTOTHREAD que es para crear hilos y hacer como una simulacion para correr en paralelo las diferentes partes del sketch en arduino y evitar conflictos, y tambien me da problemas, cuando corro los diferentes protothreads, igualmente se para la ejecucion y da el mismo fallo, pero si corro uno si trabaja bien.

:sleepy: :woozy_face: :sob:

Yo probaria con el lcd16x2, aunque la información no quepa, por lo menos puedes descartar que el problema sea la pantalla.

  1. Tienes algunos errores menor de programación al usar variables no adecuadas según mi criterio en get_voltageV1 y luego en V2:
  float adc_sample; // <= debe ser unsigned int
  float volt_inst=0; // <= debe ser unsigned int
  float sumatoria=0; // <= debería ser unsigned long sq(volt_int) es otro entero mas grande
  float volt;

Nota: las variables defínelas con minúsculas al menos al comenzar. Luego intercala mayúsculas. Es un tema de notación como ya dijo @victorjam
En todos los casos usas float para asignar enteros sin signos, lo que es poco eficiente.
Te conviene usar unsigned int.

Se repite con get_voltageV2.

  1. Ahora yendo al problema específico. El OLED que se pone estático.
    En casos de hilos anteriores hemos descubierto que el OLED no es tan rápido y algo que se debe tener presente es que el abuso de instrucciones consumen tiempo innecesario. Ejemplo
    En tu rutina OLED llamas en cada impresión a
oled.setTextSize(0);

Yo he dejado la primera y comenté todas las demás y la llamo en tu void como muestroOLED();

void muestroOLED() {
	// Mostrar valores en pantalla Oled
  
	oled.clearDisplay();
	oled.setTextColor(WHITE);
	oled.setTextSize(0);
	oled.setCursor(7,2); 		// (width=128, height=64)
	oled.print("IoT and Automation");

	//oled.setTextSize(0);
	oled.setCursor(0, 16); 	// (width=128, height=64)
	oled.print("I1= ");
	oled.print(Irms1,2);

	//oled.setTextSize(0);
	oled.setCursor(66, 16); 	// (width=128, height=64)
	oled.print("V1= ");
	oled.print(volt_rmsV1,1);

	//oled.setTextSize(0);
	oled.setCursor(0, 25); 	// (width=128, height=64)
	oled.print("P1= ");
	oled.print(potencia1,1);

	//oled.setTextSize(0);
	oled.setCursor(0, 31); 	// (width=128, height=64)
	oled.print("---------------------");

	//oled.setTextSize(0);
	oled.setCursor(0, 36);	// (width=128, height=64)
	oled.print("I2= ");
	oled.print(Irms2,2);

	//oled.setTextSize(0);
	oled.setCursor(66, 36); 	// (width=128, height=64)
	oled.print("V2= ");
	oled.print(volt_rmsV2,1);

	//oled.setTextSize(0);
	oled.setCursor(0, 45); 	// (width=128, height=64)
	oled.print("P2= ");
	oled.print(potencia2,1);

	//oled.setTextSize(0);
	oled.setCursor(0, 51); 	// (width=128, height=64)
	oled.print("---------------------");

	//oled.setTextSize(0);
	oled.setCursor(0, 57); 	// (width=128, height=64)
	oled.print("T1= 0.00");
	//oled.print(temp1,2);
	//oled.setTextSize(0);
	oled.setCursor(66, 57); 	// (width=128, height=64)
	oled.print("T2= 0.00");
	//oled.print(temp1,2);
	oled.display(); 
}

No es nada del otro mundo pero verás que colabora en mejor la respueta.
Otra cosa.

El código modificado luce asi. Lo único que dejé fue unsigned long currentmillis() que aclaro no me gusta que sea local. Siempre me han dado problema algunas variables locales.

//MEDICION DE CORRIENTE AC USANDO EL SENSOR SCT013-000
//MEDICION DE VOLTAJE AC USANDO EL SENSOR ZMPT101B
//I1 y I2 REAL , V1 y V2 REAL, T1 y T2 REAL
//CONTROL DE SALIDAS SEGUN RANGO DE CORRIENTE
//USO DE LIBRERIA EMONLIB PARA CALCULO DE CORRIENTE IRMS
//VISUALIZACION POR DISPLAY OLED 128X64
//AUTOR: LUIS HERNANDEZ - Iot and Automation - www.iotandautomation.com
//FECHA: 27/01/21
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////

// Libreria para calculo de corriente
#include "EmonLib.h"

//Librerias para pantallas 
#include <Adafruit_SSD1306.h>
#include <splash.h>
#include <Adafruit_GFX.h>
#include <Adafruit_GrayOLED.h>
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <gfxfont.h>
#include <Wire.h>


// Creando una instancia EnergyMonitor
EnergyMonitor energyMonitor1;
EnergyMonitor energyMonitor2;

// Voltaje de nuestra red eléctrica
float voltajeRed = 120.0;


// Variables para calculo de voltaje

int adc_max			= 570;        //Reemplazar por valor adc_max entregado por el sketch: volt_ac_cal
int adc_min			= 450;        //Reemplazar por valor adc_min entregado por el sketch: volt_ac_cal
float volt_multi	= 120;   //Reemplazar por el "voltaje ac rms" entregado por un multimetro
float volt_multi_p;
float volt_multi_n;



//Control de salidas

int APAGADO = 1;
int ENCENDIDO = 0;

int SALIDA1 = 2; // declaramos la variable SALIDA1 y le asignamos el pin 2
int SALIDA2 = 3; // declaramos la variable SALIDA2 y le asignamos el pin 3
int SALIDA3 = 4; // declaramos la variable SALIDA3 y le asignamos el pin 4
int SALIDA4 = 5; // declaramos la variable SALIDA4 y le asignamos el pin 5
int SALIDA5 = 6; // declaramos la variable SALIDA5 y le asignamos el pin 6
int SALIDA6 = 7; // declaramos la variable SALIDA6 y le asignamos el pin 7
int SALIDA7 = 8; // declaramos la variable SALIDA7 y le asignamos el pin 8
int SALIDA8 = 9; // declaramos la variable SALIDA8 y le asignamos el pin 9

// Definiendo datos apra pantalla Oled
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 12
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


// Variables para secuencia de activacion de salidas

//Global Variables
const byte BUTTON=10; // our button pin
const byte BUTTON2=11; // our button pin
 
unsigned long encendidoMillis; // when button was released
unsigned long apagadoMillis; // when led was turned on
unsigned long Encendido_SALIDA1 =  2000; // wait to turn on LED
unsigned long Encendido_SALIDA2 =  4000; // wait to turn on LED
unsigned long Encendido_SALIDA3 =  6000; // wait to turn on LED
unsigned long Encendido_SALIDA4 =  8000; // wait to turn on LED
unsigned long Encendido_SALIDA5 = 10000; // wait to turn on LED
unsigned long Encendido_SALIDA6 = 12000; // wait to turn on LED
unsigned long Encendido_SALIDA7 = 14000; // wait to turn on LED
unsigned long Encendido_SALIDA8 = 16000; // wait to turn on LED

unsigned long Apagado_SALIDA1 	= 2000; // turn off LED after this time
unsigned long Apagado_SALIDA2 	= 4000; // turn off LED after this time
unsigned long Apagado_SALIDA3 	= 6000; // turn off LED after this time
unsigned long Apagado_SALIDA4 	= 8000; // turn off LED after this time
unsigned long Apagado_SALIDA5 	= 10000; // turn off LED after this time
unsigned long Apagado_SALIDA6 	= 12000; // turn off LED after this time
unsigned long Apagado_SALIDA7 	= 14000; // turn off LED after this time
unsigned long Apagado_SALIDA8 	= 16000; // turn off LED after this time

bool SecuenciaEncendido = false; // flag for when button is let go
bool SecuenciaApagado = false; // flag for when button is let go
double Irms1, Irms2;
double potencia1, potencia2;
float volt_rmsV1, volt_rmsV2;



void setup()
{
  Serial.begin(115200);

//Configuracion de entrada de botones
 pinMode(BUTTON, INPUT_PULLUP);
 pinMode(BUTTON2, INPUT_PULLUP);

  // Iniciamos la clase indicando
  // Número de pin: donde tenemos conectado el SCT-013
  // Valor de calibración: valor obtenido de la calibración teórica
  energyMonitor1.current(0, 75.1);
  energyMonitor2.current(1, 75.1);

//Configuracion de los pines
  pinMode(SALIDA1, OUTPUT);
  pinMode(SALIDA2, OUTPUT);
  pinMode(SALIDA3, OUTPUT);
  pinMode(SALIDA4, OUTPUT);
  pinMode(SALIDA5, OUTPUT);
  pinMode(SALIDA6, OUTPUT);
  pinMode(SALIDA7, OUTPUT);
  pinMode(SALIDA8, OUTPUT);
  

// Inicializando las salidas
digitalWrite(SALIDA1, APAGADO);
digitalWrite(SALIDA2, APAGADO);
digitalWrite(SALIDA3, APAGADO);
digitalWrite(SALIDA4, APAGADO);
digitalWrite(SALIDA5, APAGADO);
digitalWrite(SALIDA6, APAGADO);
digitalWrite(SALIDA7, APAGADO);
digitalWrite(SALIDA8, APAGADO);

// Inicializando la pantalla Oled
  Wire.begin();
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);  //0x3C
  

//  Inicializacion para calculo de voltaje
  volt_multi_p = volt_multi * 1.4142;   //Voltaje pico= Voltaje RMS * 1.4142 (Corriente Monofasica)
  volt_multi_n = volt_multi_p * -1;

 // get the time at the start of this loop()
 //unsigned long currentMillis = millis(); 
}

void loop() {
  
	// Obtenemos el valor de la corriente eficaz
	// Pasamos el número de muestras que queremos tomar
	Irms1 = energyMonitor1.calcIrms(1484);
	Irms2 = energyMonitor2.calcIrms(1484);

	// Calculamos la potencia aparente
	potencia1 = Irms1 * voltajeRed;
	potencia2 = Irms2 * voltajeRed;

	// Obtenemos los valores de calculo de voltaje
	volt_rmsV1 = get_voltageV(A2); //Voltage eficaz Linea 1 (V-RMS)
	volt_rmsV2 = get_voltageV(A3); //Voltage eficaz Linea 2 (V-RMS)
	
	muestroSerial();
	muestroOLED();

	// **** SECUENCIA PARA ACTIVACION DE SALIDAS  *****////

	// Leemos el valor del reloj.
	unsigned long currentMillis = millis();


	if ((Irms1<0.6) && (Irms2<0.6)) {
		// Comprobamos que no estamos en una secuencia de encendido, si no lo estamos, la activamos, le
		// decimos que la de apagado no se ejecuta y anotamos cuando se ha producido.
		// Si ya habia pasado por este if y la secuencia estaba activa no hace nada.
		SecuenciaEncendido = true;
		if ( SecuenciaEncendido == false ) {
			SecuenciaEncendido 	= true;
			SecuenciaApagado 	= false;
			encendidoMillis 	= currentMillis;
		}
	}
	else {
		// Al igual que hacemos con la de encendido, hacemos con la de apagado.
		if ( SecuenciaApagado == false ) {
			 SecuenciaApagado 	= true;
			 SecuenciaEncendido = false;
			 apagadoMillis = currentMillis;   
		}
	}
 
 
	if (SecuenciaEncendido) {
		if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA1) digitalWrite(SALIDA1, ENCENDIDO);
		if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA2) digitalWrite(SALIDA2, ENCENDIDO);
		if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA3) digitalWrite(SALIDA3, ENCENDIDO);
		if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA4) digitalWrite(SALIDA4, ENCENDIDO);
		if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA5) digitalWrite(SALIDA5, ENCENDIDO);
		if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA6) digitalWrite(SALIDA6, ENCENDIDO);
		if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA7) digitalWrite(SALIDA7, ENCENDIDO);
		if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA8) digitalWrite(SALIDA8, ENCENDIDO);
	}

	if (SecuenciaApagado) {
		if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA1) digitalWrite(SALIDA8, APAGADO);
		if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA2) digitalWrite(SALIDA7, APAGADO);
		if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA3) digitalWrite(SALIDA6, APAGADO);
		if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA4) digitalWrite(SALIDA5, APAGADO);    
		if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA5) digitalWrite(SALIDA4, APAGADO);
		if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA6) digitalWrite(SALIDA3, APAGADO);
		if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA7) digitalWrite(SALIDA2, APAGADO);
		if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA8) digitalWrite(SALIDA1, APAGADO);
	}
}

void muestroSerial() {
	// Mostramos la información por el monitor serie
	Serial.print("Potencia1 = ");
	Serial.print(potencia1);
	Serial.print("    Irms1 = ");
	Serial.println(Irms1);
	Serial.print("Potencia2 = ");
	Serial.print(potencia2);
	Serial.print("    Irms2 = ");
	Serial.println(Irms2);
	Serial.print("    Vac1 = ");
	Serial.println(volt_rmsV1);
	Serial.print("    Vac2 = ");
	Serial.println(volt_rmsV2);
}


void muestroOLED() {
	// Mostrar valores en pantalla Oled
  
	oled.clearDisplay();
	oled.setTextColor(WHITE);
	oled.setTextSize(0);
	oled.setCursor(7,2); 		// (width=128, height=64)
	oled.print("IoT and Automation");

	//oled.setTextSize(0);
	oled.setCursor(0, 16); 	// (width=128, height=64)
	oled.print("I1= ");
	oled.print(Irms1,2);

	//oled.setTextSize(0);
	oled.setCursor(66, 16); 	// (width=128, height=64)
	oled.print("V1= ");
	oled.print(volt_rmsV1,1);

	//oled.setTextSize(0);
	oled.setCursor(0, 25); 	// (width=128, height=64)
	oled.print("P1= ");
	oled.print(potencia1,1);

	//oled.setTextSize(0);
	oled.setCursor(0, 31); 	// (width=128, height=64)
	oled.print("---------------------");

	//oled.setTextSize(0);
	oled.setCursor(0, 36);	// (width=128, height=64)
	oled.print("I2= ");
	oled.print(Irms2,2);

	//oled.setTextSize(0);
	oled.setCursor(66, 36); 	// (width=128, height=64)
	oled.print("V2= ");
	oled.print(volt_rmsV2,1);

	//oled.setTextSize(0);
	oled.setCursor(0, 45); 	// (width=128, height=64)
	oled.print("P2= ");
	oled.print(potencia2,1);

	//oled.setTextSize(0);
	oled.setCursor(0, 51); 	// (width=128, height=64)
	oled.print("---------------------");

	//oled.setTextSize(0);
	oled.setCursor(0, 57); 	// (width=128, height=64)
	oled.print("T1= 0.00");
	//oled.print(temp1,2);
	//oled.setTextSize(0);
	oled.setCursor(66, 57); 	// (width=128, height=64)
	oled.print("T2= 0.00");
	//oled.print(temp1,2);
	oled.display(); 
}

float get_voltageV(byte Adc){
	unsinged int adc_sample;
	unsinged int volt_inst  = 0;
	unsinged long sumatoria = 0;
	float volt;
	unsigned long tiempo_init = millis();
	int N = 0;

	//// **********  Calculo de Voltaje en Linea 1  ***********////
	while( (millis() - tiempo_init) < 500) {	//Duración 0.5 segundos(Aprox. 30 ciclos de 60Hz)
		adc_sample = analogRead(Adc);    		//voltaje del sensor
		volt_inst = map(adc_sample,adc_min,adc_max,volt_multi_n,volt_multi_p);
		sumatoria += sq(volt_inst);    			//Sumatoria de Cuadrados
		N++;
		delay(1);
	}

	volt = sqrt((sumatoria)/N); //ecuación del RMS
	return volt;
	//// **************************************************** ////  
}

tal vez tenga alguna falla y es posible que no resuelva tu problema.

  1. Otro punto para observar. la función map
    Estas variables son float
volt_multi_p = volt_multi * 1.4142;   //Voltaje pico= Voltaje RMS * 1.4142 (Corriente Monofasica)
volt_multi_n = volt_multi_p * -1;

y aca mezclas un resulado float que es imposible porque map devuelve long o unsigned long (no recuerdo) con variables enteras y con floats.

volt_inst = map(adc_sample, adc_min, adc_max, volt_multi_n, volt_multi_p);

Mi consejo es que definas una función mapf (map float) que trabaje adecuadamente con los valores involucrados.

NOTA FINAL: he corregido varias veces el post, porque vi errores mios y cosas que pasé por alto. Espero se comprenda.

Hola @Surbyte , muchas gracias por tu respuesta, hice algunas pruebas pero todavia sigo con la falla, a continuacion te comento las pruebas que realice y las fallas que se me estan presentando;

PRUEBA 1: copie tu codigo original que me pasaste en la respuesta anterior, y solamente me muestreo 1 sola vez, y los valores de muestreo son muy altos, ademas solo me encendio al tiro (sin hacer la secuencia de 1 por 1) las primeras 3 salidas, la pantalla OLED sigue sin mostrar nada.

PRUEBA 2: utilice el cadigo anterior a tu respuesta, el que realice junto a @victorjam y hice algunas modificaciones, como colocar las variables de corriente y voltaje globales, ademas modifique como funcion la visualizacion serial y la visualizacion OLED, y la falla de la pantalla continua, y ademas no hace la secuencia para activar las salidas

Este es el codigo de la PRUEBA 2

//MEDICION DE CORRIENTE AC USANDO EL SENSOR SCT013-000
//MEDICION DE VOLTAJE AC USANDO EL SENSOR ZMPT101B
//I1 y I2 REAL , V1 y V2 REAL, T1 y T2 REAL
//CONTROL DE SALIDAS SEGUN RANGO DE CORRIENTE
//USO DE LIBRERIA EMONLIB PARA CALCULO DE CORRIENTE IRMS
//VISUALIZACION POR DISPLAY OLED 128X64
//AUTOR: LUIS HERNANDEZ - Iot and Automation - www.iotandautomation.com
//FECHA: 27/01/21
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////


// Libreria para calculo de corriente
#include "EmonLib.h"


//Librerias para pantallas
#include <Adafruit_SSD1306.h>
#include <splash.h>
#include <Adafruit_GFX.h>
#include <Adafruit_GrayOLED.h>
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <gfxfont.h>
#include <Wire.h>


// Creando una instancia EnergyMonitor
EnergyMonitor energyMonitor1;
EnergyMonitor energyMonitor2;

// Voltaje de nuestra red eléctrica
float voltajeRed = 120.0;


// Variables para calculo de voltaje

int adc_max = 570;      //Reemplazar por valor adc_max entregado por el sketch: volt_ac_cal
int adc_min = 450;      //Reemplazar por valor adc_min entregado por el sketch: volt_ac_cal
float volt_multi = 120; //Reemplazar por el "voltaje ac rms" entregado por un multimetro
float volt_multi_p;
float volt_multi_n;



//Control de salidas

int APAGADO = 1;
int ENCENDIDO = 0;

int SALIDA1 = 2; // declaramos la variable SALIDA1 y le asignamos el pin 2
int SALIDA2 = 3; // declaramos la variable SALIDA2 y le asignamos el pin 3
int SALIDA3 = 4; // declaramos la variable SALIDA3 y le asignamos el pin 4
int SALIDA4 = 5; // declaramos la variable SALIDA4 y le asignamos el pin 5
int SALIDA5 = 6; // declaramos la variable SALIDA5 y le asignamos el pin 6
int SALIDA6 = 7; // declaramos la variable SALIDA6 y le asignamos el pin 7
int SALIDA7 = 8; // declaramos la variable SALIDA7 y le asignamos el pin 8
int SALIDA8 = 9; // declaramos la variable SALIDA8 y le asignamos el pin 9

// Definiendo datos para pantalla Oled
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 12
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


// Variables para secuencia de activacion de salidas

//Global Variables
const byte BUTTON = 10; // our button pin
const byte BUTTON2 = 11; // our button pin

unsigned long encendidoMillis; // when button was released
unsigned long apagadoMillis; // when led was turned on
unsigned long Encendido_SALIDA1 = 2000; // wait to turn on LED
unsigned long Encendido_SALIDA2 = 4000; // wait to turn on LED
unsigned long Encendido_SALIDA3 = 6000; // wait to turn on LED
unsigned long Encendido_SALIDA4 = 8000; // wait to turn on LED
unsigned long Encendido_SALIDA5 = 10000; // wait to turn on LED
unsigned long Encendido_SALIDA6 = 12000; // wait to turn on LED
unsigned long Encendido_SALIDA7 = 14000; // wait to turn on LED
unsigned long Encendido_SALIDA8 = 16000; // wait to turn on LED

unsigned long Apagado_SALIDA1 = 2000; // turn off LED after this time
unsigned long Apagado_SALIDA2 = 4000; // turn off LED after this time
unsigned long Apagado_SALIDA3 = 6000; // turn off LED after this time
unsigned long Apagado_SALIDA4 = 8000; // turn off LED after this time
unsigned long Apagado_SALIDA5 = 10000; // turn off LED after this time
unsigned long Apagado_SALIDA6 = 12000; // turn off LED after this time
unsigned long Apagado_SALIDA7 = 14000; // turn off LED after this time
unsigned long Apagado_SALIDA8 = 16000; // turn off LED after this time

bool SecuenciaEncendido = false; // flag for when button is let go
bool SecuenciaApagado = false; // flag for when button is let go

double Irms1=1.0, Irms2=1.0;

double potencia1, potencia2;
float volt_rmsV1, volt_rmsV2;

void setup()
{

   // Inicializando la Comunicacion Serial 
  Serial.begin(57600);

   // Inicializando la pantalla Oled
  Wire.begin();
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);  //0x3C

  //Configuracion de entrada de botones
  pinMode(BUTTON, INPUT_PULLUP);
  pinMode(BUTTON2, INPUT_PULLUP);

  // Iniciamos la clase indicando
  // Número de pin: donde tenemos conectado el SCT-013
  // Valor de calibración: valor obtenido de la calibración teórica
  energyMonitor1.current(A0, 75.1);
  energyMonitor2.current(A1, 75.1);

  //Configuracion de los pines
  pinMode(SALIDA1, OUTPUT);
  pinMode(SALIDA2, OUTPUT);
  pinMode(SALIDA3, OUTPUT);
  pinMode(SALIDA4, OUTPUT);
  pinMode(SALIDA5, OUTPUT);
  pinMode(SALIDA6, OUTPUT);
  pinMode(SALIDA7, OUTPUT);
  pinMode(SALIDA8, OUTPUT);

  // Inicializando las salidas
  digitalWrite(SALIDA1, APAGADO);
  digitalWrite(SALIDA2, APAGADO);
  digitalWrite(SALIDA3, APAGADO);
  digitalWrite(SALIDA4, APAGADO);
  digitalWrite(SALIDA5, APAGADO);
  digitalWrite(SALIDA6, APAGADO);
  digitalWrite(SALIDA7, APAGADO);
  digitalWrite(SALIDA8, APAGADO);



  volt_multi_p = volt_multi * 1.4142; 
  volt_multi_n = volt_multi_p * -1;
}

  
void loop()
{
  Irms1 = energyMonitor1.calcIrms(1484);
  Irms2 = energyMonitor2.calcIrms(1484);
  // Calculamos la potencia aparente
//  double potencia1 = Irms1 * voltajeRed;
//  double potencia2 = Irms2 * voltajeRed;

 potencia1 = Irms1 * voltajeRed;
 potencia2 = Irms2 * voltajeRed;

  // Obtenemos los valores de calculo de voltaje
//  float volt_rmsV1 = get_voltageV1(); //Voltage eficaz Linea 1 (V-RMS)
//  float volt_rmsV2 = get_voltageV2(); //Voltage eficaz Linea 2 (V-RMS)

volt_rmsV1 = get_voltageV1(); //Voltage eficaz Linea 1 (V-RMS)
volt_rmsV2 = get_voltageV2(); //Voltage eficaz Linea 2 (V-RMS)


muestroSerial();
muestroOLED();

/*

  // Mostramos la información por el monitor serie
  Serial.print("Potencia1 = ");
  Serial.print(potencia1);
  Serial.print("    Irms1 = ");
  Serial.println(Irms1);
  Serial.print("Potencia2 = ");
  Serial.print(potencia2);
  Serial.print("    Irms2 = ");
  Serial.println(Irms2);
  Serial.print("    Vac1 = ");
  Serial.println(volt_rmsV1);
  Serial.print("    Vac2 = ");
  Serial.println(volt_rmsV2);
*/

/*
    oled.clearDisplay();
  oled.setTextColor(WHITE);
  oled.setTextSize(0);
  oled.setCursor(7, 2); // (width=128, height=64)
  oled.print("IoT and Automation");
  oled.setTextSize(0);
  oled.setCursor(0, 16); // (width=128, height=64)
  oled.print("I1= ");
  oled.print(Irms1, 2);
  oled.setTextSize(0);
  oled.setCursor(66, 16); // (width=128, height=64)
  oled.print("V1= ");
  oled.print(volt_rmsV1, 1);
  oled.setTextSize(0);
  oled.setCursor(0, 25); // (width=128, height=64)
  oled.print("P1= ");
  oled.print(potencia1, 1);


  oled.setTextSize(0);
  oled.setCursor(0, 31); // (width=128, height=64)
  oled.print("---------------------");

  oled.setTextSize(0);
  oled.setCursor(0, 36); // (width=128, height=64)
  oled.print("I2= ");
  oled.print(Irms2, 2);
  oled.setTextSize(0);
  oled.setCursor(66, 36); // (width=128, height=64)
  oled.print("V2= ");
  oled.print(volt_rmsV2, 1);
  oled.setTextSize(0);
  oled.setCursor(0, 45); // (width=128, height=64)
  oled.print("P2= ");
  oled.print(potencia2, 1);


  oled.setTextSize(0);
  oled.setCursor(0, 51); // (width=128, height=64)
  oled.print("---------------------");

  oled.setTextSize(0);
  oled.setCursor(0, 57); // (width=128, height=64)
  oled.print("T1= 0.00");
  //oled.print(temp1,2);
  oled.setTextSize(0);
  oled.setCursor(66, 57); // (width=128, height=64)
  oled.print("T2= 0.00");
  //oled.print(temp1,2);

  oled.display();

*/
  
  unsigned long currentMillis = millis();

  if ((Irms1 < 0.6) && (Irms2 < 0.6)) {
    // Comprobamos que no estamos en una secuencia de encendido, si no lo estamos, la activamos, le
    // decimos que la de apagado no se ejecuta y anotamos cuando se ha producido.
    // Si ya habia pasado por este if y la secuencia estaba activa no hace nada.
    if ( SecuenciaEncendido == false ) {
      Serial.println("Iniciando secuencia Encendido");
      SecuenciaEncendido = true;
      SecuenciaApagado = false;
      encendidoMillis = currentMillis;
    }
  }
  else {
    // Al igual que hacemos con la de encendido, hacemos con la de apagado.
    if ( SecuenciaApagado == false ) {
      Serial.println("Iniciando secuencia Apagado");
      SecuenciaApagado = true;
      SecuenciaEncendido = false;
      apagadoMillis = currentMillis;
    }
  }

  //}

  if (SecuenciaEncendido) {

    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA1) digitalWrite(SALIDA1, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA2) digitalWrite(SALIDA2, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA3) digitalWrite(SALIDA3, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA4) digitalWrite(SALIDA4, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA5) digitalWrite(SALIDA5, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA6) digitalWrite(SALIDA6, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA7) digitalWrite(SALIDA7, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA8) digitalWrite(SALIDA8, ENCENDIDO);
  }
  if (SecuenciaApagado) {
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA1) digitalWrite(SALIDA8, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA2) digitalWrite(SALIDA7, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA3) digitalWrite(SALIDA6, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA4) digitalWrite(SALIDA5, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA5) digitalWrite(SALIDA4, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA6) digitalWrite(SALIDA3, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA7) digitalWrite(SALIDA2, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA8) digitalWrite(SALIDA1, APAGADO);
  }


}



float get_voltageV1(void)
{
  float adc_sample;
  float volt_inst = 0;
  float Sumatoria = 0;
  float volt;
  unsigned long tiempo_init = millis();
  int N = 0;

  while ( (millis() - tiempo_init) < 500) //Duración 0.5 segundos(Aprox. 30 ciclos de 60Hz)
  {

    adc_sample = analogRead(A2);    //voltaje del sensor
    volt_inst = map(adc_sample, adc_min, adc_max, volt_multi_n, volt_multi_p);
    Sumatoria = Sumatoria + sq(volt_inst);  //Sumatoria de Cuadrados
    N = N + 1;
    delay(1);
  }
  volt = sqrt((Sumatoria) / N); //ecuación del RMS
  return (volt);
}

float get_voltageV2(void)
{
  float adc_sample;
  float volt_inst = 0;
  float Sumatoria = 0;
  float volt;
  unsigned long tiempo_init = millis();
  int N = 0;
  while ( (millis() - tiempo_init) < 500) //Duración 0.5 segundos(Aprox. 30 ciclos de 60Hz)
  {

    adc_sample = analogRead(A3);    //voltaje del sensor
    volt_inst = map(adc_sample, adc_min, adc_max, volt_multi_n, volt_multi_p);
    Sumatoria = Sumatoria + sq(volt_inst);  //Sumatoria de Cuadrados
    N = N + 1;
    delay(1);
  }
}

void muestroSerial() {
  // Mostramos la información por el monitor serie
  Serial.print("Potencia1 = ");
  Serial.print(potencia1);
  Serial.print("    Irms1 = ");
  Serial.println(Irms1);
  Serial.print("Potencia2 = ");
  Serial.print(potencia2);
  Serial.print("    Irms2 = ");
  Serial.println(Irms2);
  Serial.print("    Vac1 = ");
  Serial.println(volt_rmsV1);
  Serial.print("    Vac2 = ");
  Serial.println(volt_rmsV2);
}

void muestroOLED() {
  // Mostrar valores en pantalla Oled
  
  oled.clearDisplay();
  oled.setTextColor(WHITE);
  oled.setTextSize(0);
  oled.setCursor(7,2);    // (width=128, height=64)
  oled.print("IoT and Automation");

  //oled.setTextSize(0);
  oled.setCursor(0, 16);  // (width=128, height=64)
  oled.print("I1= ");
  oled.print(Irms1,2);

  //oled.setTextSize(0);
  oled.setCursor(66, 16);   // (width=128, height=64)
  oled.print("V1= ");
  oled.print(volt_rmsV1,1);

  //oled.setTextSize(0);
  oled.setCursor(0, 25);  // (width=128, height=64)
  oled.print("P1= ");
  oled.print(potencia1,1);

  //oled.setTextSize(0);
  oled.setCursor(0, 31);  // (width=128, height=64)
  oled.print("---------------------");

  //oled.setTextSize(0);
  oled.setCursor(0, 36);  // (width=128, height=64)
  oled.print("I2= ");
  oled.print(Irms2,2);

  //oled.setTextSize(0);
  oled.setCursor(66, 36);   // (width=128, height=64)
  oled.print("V2= ");
  oled.print(volt_rmsV2,1);

  //oled.setTextSize(0);
  oled.setCursor(0, 45);  // (width=128, height=64)
  oled.print("P2= ");
  oled.print(potencia2,1);

  //oled.setTextSize(0);
  oled.setCursor(0, 51);  // (width=128, height=64)
  oled.print("---------------------");

  //oled.setTextSize(0);
  oled.setCursor(0, 57);  // (width=128, height=64)
  oled.print("T1= 0.00");
  //oled.print(temp1,2);
  //oled.setTextSize(0);
  oled.setCursor(66, 57);   // (width=128, height=64)
  oled.print("T2= 0.00");
  //oled.print(temp1,2);
  oled.display(); 
}

PRUEBA 3: comente en el VOID LOOP el llamado a la funcion muestroOLED(); ( //muestroOLED(); ) , y el prototipo me trabaja como lo hace anteriormente, hace el muestreo de todas la variables de forma continua, y trabajan bien la secuencia de activacion y desactivacion de las salidas.

En conclusion, la pantalla OLED hace que el sistema deje de trabajar, ahora la gran pregunta, ¿ Porque hara eso ?

Echándole un vistazo más detenidamente al código. Aparentemente la función que falla es display().

He estado haciendo simulaciones (no tengo pantalla SSD1306 a mano), he ajustado el código un poco y me he propuesto buscar el puntero loco.

Por un lado me encontré que en níngun momento has utilizado una fuente para mostrar el texto, así que seleccioné una pensando que el problema residía ahi, aunque con el mismo resultado: código bloqueado.

Luego convertí todas las constantes en macros, para ahorrar memoria RAM. Tampoco ha dado resultado.

Así que ha modo de prueba he comentado la línea donde llamamos a la función display y el código aparentemente empieza a funcionar...

Te dejo el código que he usado por si quieres probar:

//MEDICION DE CORRIENTE AC USANDO EL SENSOR SCT013-000
//MEDICION DE VOLTAJE AC USANDO EL SENSOR ZMPT101B
//I1 y I2 REAL , V1 y V2 REAL, T1 y T2 REAL
//CONTROL DE SALIDAS SEGUN RANGO DE CORRIENTE
//USO DE LIBRERIA EMONLIB PARA CALCULO DE CORRIENTE IRMS
//VISUALIZACION POR DISPLAY OLED 128X64
//AUTOR: LUIS HERNANDEZ - Iot and Automation - www.iotandautomation.com
//FECHA: 27/01/21
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////


// Libreria para calculo de corriente
#include "EmonLib.h"


//Librerias para pantallas
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <gfxfont.h>
//#include <splash.h>
//#include <Adafruit_GFX.h>
//#include <Adafruit_GrayOLED.h>
//#include <Adafruit_SPITFT.h>
//#include <Adafruit_SPITFT_Macros.h>
#include <Fonts/FreeSans9pt7b.h>




// Creando una instancia EnergyMonitor
EnergyMonitor energyMonitor1;
EnergyMonitor energyMonitor2;

// Voltaje de nuestra red eléctrica
float voltajeRed = 120.0;


// Variables para calculo de voltaje
int   adc_max = 570;      //Reemplazar por valor adc_max entregado por el sketch: volt_ac_cal
int   adc_min = 450;      //Reemplazar por valor adc_min entregado por el sketch: volt_ac_cal
float volt_multi = 120; //Reemplazar por el "voltaje ac rms" entregado por un multimetro
float volt_multi_p;
float volt_multi_n;



//Control de salidas
#define APAGADO   1
#define ENCENDIDO 0

#define SALIDA1  2
#define SALIDA2  3
#define SALIDA3  4
#define SALIDA4  5
#define SALIDA5  6
#define SALIDA6  7
#define SALIDA7  8
#define SALIDA8  9

// Definiendo datos para pantalla Oled
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 12
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Variables para secuencia de activacion de salidas

//Global Variables
#define BUTTON  10
#define BUTTON2 11

unsigned long encendidoMillis; // when button was released
unsigned long apagadoMillis; // when led was turned on

#define Encendido_SALIDA1 2000
#define Encendido_SALIDA2 4000
#define Encendido_SALIDA3 6000
#define Encendido_SALIDA4 8000
#define Encendido_SALIDA5 10000
#define Encendido_SALIDA6 12000
#define Encendido_SALIDA7 14000
#define Encendido_SALIDA8 16000

#define Apagado_SALIDA1 2000
#define Apagado_SALIDA2 4000
#define Apagado_SALIDA3 6000
#define Apagado_SALIDA4 8000
#define Apagado_SALIDA5 10000
#define Apagado_SALIDA6 12000
#define Apagado_SALIDA7 14000
#define Apagado_SALIDA8 16000

bool SecuenciaEncendido = false; // flag for when button is let go
bool SecuenciaApagado = false; // flag for when button is let go

double Irms1 = 1.0, Irms2 = 1.0;
double potencia1, potencia2;
float volt_rmsV1, volt_rmsV2;

void setup() {

  // Inicializando la Comunicacion Serial
  Serial.begin(57600);

  // Inicializando la pantalla Oled
  Wire.begin();
  //oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);  //0x3C
  oled.begin(SSD1306_EXTERNALVCC, 0x3C);
  oled.setFont(&FreeSans9pt7b);

  //Configuracion de entrada de botones
  pinMode(BUTTON, INPUT_PULLUP);
  pinMode(BUTTON2, INPUT_PULLUP);

  // Iniciamos la clase indicando
  // Número de pin: donde tenemos conectado el SCT-013
  // Valor de calibración: valor obtenido de la calibración teórica
  energyMonitor1.current(A0, 75.1);
  energyMonitor2.current(A1, 75.1);

  //Configuracion de los pines
  pinMode(SALIDA1, OUTPUT);
  pinMode(SALIDA2, OUTPUT);
  pinMode(SALIDA3, OUTPUT);
  pinMode(SALIDA4, OUTPUT);
  pinMode(SALIDA5, OUTPUT);
  pinMode(SALIDA6, OUTPUT);
  pinMode(SALIDA7, OUTPUT);
  pinMode(SALIDA8, OUTPUT);

  // Inicializando las salidas
  digitalWrite(SALIDA1, APAGADO);
  digitalWrite(SALIDA2, APAGADO);
  digitalWrite(SALIDA3, APAGADO);
  digitalWrite(SALIDA4, APAGADO);
  digitalWrite(SALIDA5, APAGADO);
  digitalWrite(SALIDA6, APAGADO);
  digitalWrite(SALIDA7, APAGADO);
  digitalWrite(SALIDA8, APAGADO);

  volt_multi_p = volt_multi * 1.4142;
  volt_multi_n = volt_multi_p * -1;
}


void loop()
{
  Irms1 = energyMonitor1.calcIrms(1484);
  Irms2 = energyMonitor2.calcIrms(1484);
  // Calculamos la potencia aparente
  //  double potencia1 = Irms1 * voltajeRed;
  //  double potencia2 = Irms2 * voltajeRed;

  potencia1 = Irms1 * voltajeRed;
  potencia2 = Irms2 * voltajeRed;

  // Obtenemos los valores de calculo de voltaje
  //  float volt_rmsV1 = get_voltageV1(); //Voltage eficaz Linea 1 (V-RMS)
  //  float volt_rmsV2 = get_voltageV2(); //Voltage eficaz Linea 2 (V-RMS)

  volt_rmsV1 = get_voltageV1(); //Voltage eficaz Linea 1 (V-RMS)
  volt_rmsV2 = get_voltageV2(); //Voltage eficaz Linea 2 (V-RMS)


  muestroSerial();
  muestroOLED();


  unsigned long currentMillis = millis();

  if ((Irms1 < 0.6) && (Irms2 < 0.6)) {
    // Comprobamos que no estamos en una secuencia de encendido, si no lo estamos, la activamos, le
    // decimos que la de apagado no se ejecuta y anotamos cuando se ha producido.
    // Si ya habia pasado por este if y la secuencia estaba activa no hace nada.
    if ( SecuenciaEncendido == false ) {
      Serial.println("Iniciando secuencia Encendido");
      SecuenciaEncendido = true;
      SecuenciaApagado = false;
      encendidoMillis = currentMillis;
    }
  }
  else {
    // Al igual que hacemos con la de encendido, hacemos con la de apagado.
    if ( SecuenciaApagado == false ) {
      Serial.println("Iniciando secuencia Apagado");
      SecuenciaApagado = true;
      SecuenciaEncendido = false;
      apagadoMillis = currentMillis;
    }
  }

  //}

  if (SecuenciaEncendido) {

    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA1) digitalWrite(SALIDA1, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA2) digitalWrite(SALIDA2, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA3) digitalWrite(SALIDA3, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA4) digitalWrite(SALIDA4, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA5) digitalWrite(SALIDA5, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA6) digitalWrite(SALIDA6, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA7) digitalWrite(SALIDA7, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA8) digitalWrite(SALIDA8, ENCENDIDO);
  }
  if (SecuenciaApagado) {
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA1) digitalWrite(SALIDA8, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA2) digitalWrite(SALIDA7, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA3) digitalWrite(SALIDA6, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA4) digitalWrite(SALIDA5, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA5) digitalWrite(SALIDA4, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA6) digitalWrite(SALIDA3, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA7) digitalWrite(SALIDA2, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA8) digitalWrite(SALIDA1, APAGADO);
  }


}



float get_voltageV1(void)
{
  float adc_sample;
  float volt_inst = 0;
  float Sumatoria = 0;
  float volt;
  unsigned long tiempo_init = millis();
  int N = 0;

  while ( (millis() - tiempo_init) < 500) //Duración 0.5 segundos(Aprox. 30 ciclos de 60Hz)
  {

    adc_sample = analogRead(A2);    //voltaje del sensor
    volt_inst = map(adc_sample, adc_min, adc_max, volt_multi_n, volt_multi_p);
    Sumatoria = Sumatoria + sq(volt_inst);  //Sumatoria de Cuadrados
    N = N + 1;
    delay(1);
  }
  volt = sqrt((Sumatoria) / N); //ecuación del RMS
  return (volt);
}

float get_voltageV2(void)
{
  float adc_sample;
  float volt_inst = 0;
  float Sumatoria = 0;
  float volt;
  unsigned long tiempo_init = millis();
  int N = 0;
  while ( (millis() - tiempo_init) < 500) //Duración 0.5 segundos(Aprox. 30 ciclos de 60Hz)
  {

    adc_sample = analogRead(A3);    //voltaje del sensor
    volt_inst = map(adc_sample, adc_min, adc_max, volt_multi_n, volt_multi_p);
    Sumatoria = Sumatoria + sq(volt_inst);  //Sumatoria de Cuadrados
    N = N + 1;
    delay(1);
  }
}

void muestroSerial() {
  // Mostramos la información por el monitor serie
  Serial.print("Potencia1 = ");
  Serial.print(potencia1);
  Serial.print("    Irms1 = ");
  Serial.println(Irms1);
  Serial.print("Potencia2 = ");
  Serial.print(potencia2);
  Serial.print("    Irms2 = ");
  Serial.println(Irms2);
  Serial.print("    Vac1 = ");
  Serial.println(volt_rmsV1);
  Serial.print("    Vac2 = ");
  Serial.println(volt_rmsV2);
}

void muestroOLED() {
  // Mostrar valores en pantalla Oled
  oled.clearDisplay();
  oled.setTextColor(WHITE);
  oled.setTextSize(8);
  oled.setCursor(7, 2);   // (width=128, height=64)
  oled.print("IoT and Automation");

  //oled.setTextSize(0);
  oled.setCursor(0, 16);  // (width=128, height=64)
  oled.print("I1= ");
  oled.print(Irms1, 2);

  //oled.setTextSize(0);
  oled.setCursor(66, 16);   // (width=128, height=64)
  oled.print("V1= ");
  oled.print(volt_rmsV1, 1);

  //oled.setTextSize(0);
  oled.setCursor(0, 25);  // (width=128, height=64)
  oled.print("P1= ");
  oled.print(potencia1, 1);

  //oled.setTextSize(0);
  oled.setCursor(0, 31);  // (width=128, height=64)
  oled.print("---------------------");

  //oled.setTextSize(0);
  oled.setCursor(0, 36);  // (width=128, height=64)
  oled.print("I2= ");
  oled.print(Irms2, 2);

  //oled.setTextSize(0);
  oled.setCursor(66, 36);   // (width=128, height=64)
  oled.print("V2= ");
  oled.print(volt_rmsV2, 1);

  //oled.setTextSize(0);
  oled.setCursor(0, 45);  // (width=128, height=64)
  oled.print("P2= ");
  oled.print(potencia2, 1);

  //oled.setTextSize(0);
  oled.setCursor(0, 51);  // (width=128, height=64)
  oled.print("---------------------");

  //oled.setTextSize(0);
  oled.setCursor(0, 57);  // (width=128, height=64)
  oled.print("T1= 0.00");
  //oled.print(temp1,2);
  //oled.setTextSize(0);
  oled.setCursor(66, 57);   // (width=128, height=64)
  oled.print("T2= 0.00");
  //oled.print(temp1,2);
  //oled.display(); 
}

En cuanto a la función display he mirado su código y como esperaba, lo único que hace es mover un búfer de memoria a la memoria de la pantalla para que esta pueda manejarla.

void Adafruit_SSD1306::display(void) {
  TRANSACTION_START
  static const uint8_t PROGMEM dlist1[] = {
      SSD1306_PAGEADDR,
      0,                      // Page start address
      0xFF,                   // Page end (not really, but works here)
      SSD1306_COLUMNADDR, 0}; // Column start address
  ssd1306_commandList(dlist1, sizeof(dlist1));
  ssd1306_command1(WIDTH - 1); // Column end address

#if defined(ESP8266)
  // ESP8266 needs a periodic yield() call to avoid watchdog reset.
  // With the limited size of SSD1306 displays, and the fast bitrate
  // being used (1 MHz or more), I think one yield() immediately before
  // a screen write and one immediately after should cover it.  But if
  // not, if this becomes a problem, yields() might be added in the
  // 32-byte transfer condition below.
  yield();
#endif
  uint16_t count = WIDTH * ((HEIGHT + 7) / 8);
  uint8_t *ptr = buffer;
  if (wire) { // I2C
    wire->beginTransmission(i2caddr);
    WIRE_WRITE((uint8_t)0x40);
    uint16_t bytesOut = 1;
    while (count--) {
      if (bytesOut >= WIRE_MAX) {
        wire->endTransmission();
        wire->beginTransmission(i2caddr);
        WIRE_WRITE((uint8_t)0x40);
        bytesOut = 1;
      }
      WIRE_WRITE(*ptr++);
      bytesOut++;
    }
    wire->endTransmission();
  } else { // SPI
    SSD1306_MODE_DATA
    while (count--)
      SPIwrite(*ptr++);
  }
  TRANSACTION_END
#if defined(ESP8266)
  yield();
#endif
}

Básicamente le indica donde escribir y le manda datos directamente via i2c. Así que dificilmente se puede encontrar
el fallo...

Intenta con el código que te deje, comentando y descomentando la linea de la llamada a display(), quizás funcione en un dispositivo físico y no tengo ninguno a mano.

Bueno yo he podido simular todo el esquema (o la mayor parte) y me encontré con algo curioso. Funciona OLED, funcciona Serial, pero el problema ocurre cuando EmonLib y el OLED estan activos.
Aún no di con la solución pero por ahi pasa.
Si pones todo y comentas Emonlib el OLED presenta todo en 0 obviamente.

Este es la simulación en Proteus 8.10 SP0
Oled Foro.zip (58.4 KB)


//MEDICION DE CORRIENTE AC USANDO EL SENSOR SCT013-000
//MEDICION DE VOLTAJE AC USANDO EL SENSOR ZMPT101B
//I1 y I2 REAL , V1 y V2 REAL, T1 y T2 REAL
//CONTROL DE SALIDAS SEGUN RANGO DE CORRIENTE
//USO DE LIBRERIA EMONLIB PARA CALCULO DE CORRIENTE IRMS
//VISUALIZACION POR DISPLAY OLED 128X64
//AUTOR: LUIS HERNANDEZ - Iot and Automation - www.iotandautomation.com
//FECHA: 27/01/21
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////

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

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// The pins for I2C are defined by the Wire-library. 
// On an arduino UNO:       A4(SDA), A5(SCL)
#define OLED_RESET          12  // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS    0x3D  // < See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Libreria para calculo de corriente
#include "EmonLib.h"
// Creando una instancia EnergyMonitor
EnergyMonitor energyMonitor1;
EnergyMonitor energyMonitor2;

// Voltaje de nuestra red eléctrica
float voltajeRed = 120.0;


// Variables para calculo de voltaje
int adc_max = 570;      //Reemplazar por valor adc_max entregado por el sketch: volt_ac_cal
int adc_min = 450;      //Reemplazar por valor adc_min entregado por el sketch: volt_ac_cal
float volt_multi = 120; //Reemplazar por el "voltaje ac rms" entregado por un multimetro
float volt_multi_p;
float volt_multi_n;

//Control de salidas
int APAGADO   = 1;
int ENCENDIDO = 0;

const byte SALIDA1 = 2; // declaramos la variable SALIDA1 y le asignamos el pin 2
const byte SALIDA2 = 3; // declaramos la variable SALIDA2 y le asignamos el pin 3
const byte SALIDA3 = 4; // declaramos la variable SALIDA3 y le asignamos el pin 4
const byte SALIDA4 = 5; // declaramos la variable SALIDA4 y le asignamos el pin 5
const byte SALIDA5 = 6; // declaramos la variable SALIDA5 y le asignamos el pin 6
const byte SALIDA6 = 7; // declaramos la variable SALIDA6 y le asignamos el pin 7
const byte SALIDA7 = 8; // declaramos la variable SALIDA7 y le asignamos el pin 8
const byte SALIDA8 = 9; // declaramos la variable SALIDA8 y le asignamos el pin 9

// Variables para secuencia de activacion de salidas

//Global Variables
const byte BUTTON               = 10; // our button pin
const byte BUTTON2              = 11; // our button pin

unsigned long encendidoMillis; // when button was released
unsigned long apagadoMillis; // when led was turned on
unsigned long Encendido_SALIDA1 = 2000; // wait to turn on LED
unsigned long Encendido_SALIDA2 = 4000; // wait to turn on LED
unsigned long Encendido_SALIDA3 = 6000; // wait to turn on LED
unsigned long Encendido_SALIDA4 = 8000; // wait to turn on LED
unsigned long Encendido_SALIDA5 = 10000; // wait to turn on LED
unsigned long Encendido_SALIDA6 = 12000; // wait to turn on LED
unsigned long Encendido_SALIDA7 = 14000; // wait to turn on LED
unsigned long Encendido_SALIDA8 = 16000; // wait to turn on LED

unsigned long Apagado_SALIDA1 = 2000; // turn off LED after this time
unsigned long Apagado_SALIDA2 = 4000; // turn off LED after this time
unsigned long Apagado_SALIDA3 = 6000; // turn off LED after this time
unsigned long Apagado_SALIDA4 = 8000; // turn off LED after this time
unsigned long Apagado_SALIDA5 = 10000; // turn off LED after this time
unsigned long Apagado_SALIDA6 = 12000; // turn off LED after this time
unsigned long Apagado_SALIDA7 = 14000; // turn off LED after this time
unsigned long Apagado_SALIDA8 = 16000; // turn off LED after this time

bool SecuenciaEncendido = false; // flag for when button is let go
bool SecuenciaApagado   = false; // flag for when button is let go

double Irms1 = 1.0, 
       Irms2=1.0;

double potencia1, potencia2;
float volt_rmsV1, volt_rmsV2;

void setup() {
  Serial.begin(9600);
  Serial.println("Iniciando OLED");

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

  // Show initial display buffer contents on the screen --
  // the library initializes this with an Adafruit splash screen.
  display.display();
  delay(2000); // Pause for 2 seconds

  // Clear the buffer
  display.clearDisplay();

  // Draw a single pixel in white
  display.drawPixel(10, 10, SSD1306_WHITE);

  // Show the display buffer on the screen. You MUST call display() after
  // drawing commands to make them visible on screen!
  display.display();
  delay(2000);
  // display.display() is NOT necessary after every single drawing command,
  // unless that's what you want...rather, you can batch up a bunch of
  // drawing operations and then update the screen all at once by calling
  // display.display(). These examples demonstrate both approaches...

  //Configuracion de entrada de botones
  pinMode(BUTTON, INPUT_PULLUP);
  pinMode(BUTTON2, INPUT_PULLUP);

  // Iniciamos la clase indicando
  // Número de pin: donde tenemos conectado el SCT-013
  // Valor de calibración: valor obtenido de la calibración teórica
  energyMonitor1.current(A0, 75.1);
  energyMonitor2.current(A1, 75.1);

  //Configuracion de los pines
  pinMode(SALIDA1, OUTPUT);
  pinMode(SALIDA2, OUTPUT);
  pinMode(SALIDA3, OUTPUT);
  pinMode(SALIDA4, OUTPUT);
  pinMode(SALIDA5, OUTPUT);
  pinMode(SALIDA6, OUTPUT);
  pinMode(SALIDA7, OUTPUT);
  pinMode(SALIDA8, OUTPUT);

  // Inicializando las salidas
  digitalWrite(SALIDA1, APAGADO);
  digitalWrite(SALIDA2, APAGADO);
  digitalWrite(SALIDA3, APAGADO);
  digitalWrite(SALIDA4, APAGADO);
  digitalWrite(SALIDA5, APAGADO);
  digitalWrite(SALIDA6, APAGADO);
  digitalWrite(SALIDA7, APAGADO);
  digitalWrite(SALIDA8, APAGADO);



  volt_multi_p = volt_multi * 1.4142; 
  volt_multi_n = volt_multi_p * -1;
  Serial.println("Termine de inicializar");
  delay(1000);
  
}

void loop() {
  Irms1 = energyMonitor1.calcIrms(1484);
  Irms2 = energyMonitor2.calcIrms(1484);
  // Calculamos la potencia aparente
  //  double potencia1 = Irms1 * voltajeRed;
  //  double potencia2 = Irms2 * voltajeRed;
  
  potencia1 = Irms1 * voltajeRed;
  potencia2 = Irms2 * voltajeRed;
  
  // Obtenemos los valores de calculo de voltaje
  //  float volt_rmsV1 = get_voltageV1(); //Voltage eficaz Linea 1 (V-RMS)
  //  float volt_rmsV2 = get_voltageV2(); //Voltage eficaz Linea 2 (V-RMS)
  
  volt_rmsV1 = get_voltageV1(); //Voltage eficaz Linea 1 (V-RMS)
  volt_rmsV2 = get_voltageV2(); //Voltage eficaz Linea 2 (V-RMS)

  
  muestroSerial();

  noInterrupts();
  muestroOLED();
  interrupts();
 
  unsigned long currentMillis = millis();

  if ((Irms1 < 0.6) && (Irms2 < 0.6)) {
    // Comprobamos que no estamos en una secuencia de encendido, si no lo estamos, la activamos, le
    // decimos que la de apagado no se ejecuta y anotamos cuando se ha producido.
    // Si ya habia pasado por este if y la secuencia estaba activa no hace nada.
    if ( SecuenciaEncendido == false ) {
      Serial.println("Iniciando secuencia Encendido");
      SecuenciaEncendido = true;
      SecuenciaApagado = false;
      encendidoMillis = currentMillis;
    }
  }
  else {
    // Al igual que hacemos con la de encendido, hacemos con la de apagado.
    if ( SecuenciaApagado == false ) {
      Serial.println("Iniciando secuencia Apagado");
      SecuenciaApagado = true;
      SecuenciaEncendido = false;
      apagadoMillis = currentMillis;
    }
  }

  //}

  if (SecuenciaEncendido) {

    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA1) digitalWrite(SALIDA1, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA2) digitalWrite(SALIDA2, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA3) digitalWrite(SALIDA3, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA4) digitalWrite(SALIDA4, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA5) digitalWrite(SALIDA5, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA6) digitalWrite(SALIDA6, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA7) digitalWrite(SALIDA7, ENCENDIDO);
    if ((unsigned long)(currentMillis - encendidoMillis) >= Encendido_SALIDA8) digitalWrite(SALIDA8, ENCENDIDO);
  }
  if (SecuenciaApagado) {
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA1) digitalWrite(SALIDA8, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA2) digitalWrite(SALIDA7, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA3) digitalWrite(SALIDA6, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA4) digitalWrite(SALIDA5, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA5) digitalWrite(SALIDA4, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA6) digitalWrite(SALIDA3, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA7) digitalWrite(SALIDA2, APAGADO);
    if ((unsigned long)(currentMillis - apagadoMillis) >= Apagado_SALIDA8) digitalWrite(SALIDA1, APAGADO);
  }
}



float get_voltageV1(void)
{
  float adc_sample;
  float volt_inst = 0;
  float Sumatoria = 0;
  float volt;
  unsigned long tiempo_init = millis();
  int N = 0;

  while ( (millis() - tiempo_init) < 500) //Duración 0.5 segundos(Aprox. 30 ciclos de 60Hz)
  {

    adc_sample = analogRead(A2);    //voltaje del sensor
    volt_inst = map(adc_sample, adc_min, adc_max, volt_multi_n, volt_multi_p);
    Sumatoria = Sumatoria + sq(volt_inst);  //Sumatoria de Cuadrados
    N = N + 1;
    delay(1);
  }
  volt = sqrt((Sumatoria) / N); //ecuación del RMS
  return (volt);
}

float get_voltageV2(void)
{
  float adc_sample;
  float volt_inst = 0;
  float Sumatoria = 0;
  float volt;
  unsigned long tiempo_init = millis();
  int N = 0;
  while ( (millis() - tiempo_init) < 500) //Duración 0.5 segundos(Aprox. 30 ciclos de 60Hz)
  {

    adc_sample = analogRead(A3);    //voltaje del sensor
    volt_inst = map(adc_sample, adc_min, adc_max, volt_multi_n, volt_multi_p);
    Sumatoria = Sumatoria + sq(volt_inst);  //Sumatoria de Cuadrados
    N = N + 1;
    delay(1);
  }
}

void muestroSerial() {
  // Mostramos la información por el monitor serie
  Serial.print("Potencia1 = ");
  Serial.print(potencia1);
  Serial.print("    Irms1 = ");
  Serial.println(Irms1);
  Serial.print("Potencia2 = ");
  Serial.print(potencia2);
  Serial.print("    Irms2 = ");
  Serial.println(Irms2);
  Serial.print("    Vac1 = ");
  Serial.println(volt_rmsV1);
  Serial.print("    Vac2 = ");
  Serial.println(volt_rmsV2);
}

void muestroOLED() {
  // Mostrar valores en pantalla Oled
  
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(0);
  display.setCursor(7,2);    // (width=128, height=64)
  display.print("IoT and Automation");

  //display.setTextSize(0);
  display.setCursor(0, 16);  // (width=128, height=64)
  display.print("I1= ");
  display.print(Irms1,2);

  //display.setTextSize(0);
  display.setCursor(66, 16);   // (width=128, height=64)
  display.print("V1= ");
  display.print(volt_rmsV1,1);

  //display.setTextSize(0);
  display.setCursor(0, 25);  // (width=128, height=64)
  display.print("P1= ");
  display.print(potencia1,1);

  //display.setTextSize(0);
  display.setCursor(0, 31);  // (width=128, height=64)
  display.print("---------------------");

  //display.setTextSize(0);
  display.setCursor(0, 36);  // (width=128, height=64)
  display.print("I2= ");
  display.print(Irms2,2);

  //display.setTextSize(0);
  display.setCursor(66, 36);   // (width=128, height=64)
  display.print("V2= ");
  display.print(volt_rmsV2,1);

  //display.setTextSize(0);
  display.setCursor(0, 45);  // (width=128, height=64)
  display.print("P2= ");
  display.print(potencia2,1);

  //display.setTextSize(0);
  display.setCursor(0, 51);  // (width=128, height=64)
  display.print("---------------------");

  //display.setTextSize(0);
  display.setCursor(0, 57);  // (width=128, height=64)
  display.print("T1= 0.00");
  //display.print(temp1,2);
  //display.setTextSize(0);
  display.setCursor(66, 57);   // (width=128, height=64)
  display.print("T2= 0.00");
  //display.print(temp1,2);
  display.display(); 
}

void testdrawchar(void) {
  display.clearDisplay();

  display.setTextSize(1);      // Normal 1:1 pixel scale
  display.setTextColor(SSD1306_WHITE); // Draw white text
  display.setCursor(0, 0);     // Start at top-left corner
  display.cp437(true);         // Use full 256 char 'Code Page 437' font

  // Not all the characters will fit on the display. This is normal.
  // Library will draw what it can and the rest will be clipped.
  for(int16_t i=0; i<256; i++) {
    if(i == '\n') display.write(' ');
    else          display.write(i);
  }

  display.display();
  delay(2000);
}

void testdrawstyles(void) {
  display.clearDisplay();

  display.setTextSize(1);             // Normal 1:1 pixel scale
  display.setTextColor(SSD1306_WHITE);        // Draw white text
  display.setCursor(0,0);             // Start at top-left corner
  display.println(F("Hello, world!"));

  display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text
  display.println(3.141592);

  display.setTextSize(2);             // Draw 2X-scale text
  display.setTextColor(SSD1306_WHITE);
  display.print(F("0x")); display.println(0xDEADBEEF, HEX);

  display.display();
  delay(2000);
}

void testscrolltext(void) {
  display.clearDisplay();

  display.setTextSize(2); // Draw 2X-scale text
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(10, 0);
  display.println(F("scroll"));
  display.display();      // Show initial text
  delay(100);

  // Scroll in various directions, pausing in-between:
  display.startscrollright(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrollleft(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrolldiagright(0x00, 0x07);
  delay(2000);
  display.startscrolldiagleft(0x00, 0x07);
  delay(2000);
  display.stopscroll();
  delay(1000);
}


#define XPOS   0 // Indexes into the 'icons' array in function below
#define YPOS   1
#define DELTAY 2

Este código se ve en el OLED si se comenta todo lo concerniente a Emonlib.
Sigo buscando la razón.

El cambio mas importante está en la simplificación de las librerías, hay varias de mas.
Usando el ejemplo sugerido por Adafruit se muestra en el OLED sin problemas. Luego lo modifiqué para agregar lo demás y cuando sumé Emonlib colapsó.

El problema se debe aparentemente al uso de AnalogRead en varios momentos diferentes pero como eso afecta al OLED no lo se.
De hecho lo que da es un error al inicializar el OLED y no en otro momento.

@Surbyte @victorjam si es bastante raro, en los proximos dias voy a hacer 2 pruebas, primero voy a usar un LCD 2x16 a ver si no genera conflicto en la visualizacion, y lo otro que voy a hacer, es que los sensores de corriente SCT-013-000 hay otra forma de utilizarlos sin usar la libreria Emonlib, que es usar el modulo ADS1115, y conectar este modulo a través del puerto I2C, tan pronto haga esas pruebas comento los resultados. Muchas gracias por el apoyo.

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