#include <Adafruit_SSD1306.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <WiFi.h>
#include <NTPClient.h>
#include <EEPROM.h>
#define d2 2
#define d15 15
#define d4 4
#define d5 5
bool ALARME = 0,ALARME1 = 0,ALARME2 = 0,ALARME3 = 0;
int selectalarme = 0;
bool buttonState = HIGH; // Estado atual do botão
bool lastButtonState = HIGH; // Estado anterior do botão
//leia de ohom
float resistor;
float volt=220;
float corr=5.00;
float pot;
float energy = 0.0; // Energia acumulada em kWh
unsigned long previousMillis = 0;
const long interval = 1000; // Intervalo de 1 segundo
int t5=0;
//funções do CLP
bool entrada1 = LOW;
bool antentrada1 = LOW;
int tempo=0;
int tpligar = 0,tpdesligar=0,retardo=0,tpligado=0,automatico=0;
int onoff = 0;
int SEL=0;
int S1=0,S2=0;
bool L1 = 0;
int CONT1=0;
int IN = 0,OUT = 0,FUN1 = 0, FUN2=0;
int maiorq=0, menorq=0;
int IN1=0;
int SEL_MENU_2=0;
int OPSAO2 = 0;
bool sobe = 0; //botao sobe
bool desce =0; //botao desce
int estado = 0;
int CONT=0;
int alhora = 0;
int almin = 0;
int offhora = 0;
int offmin = 0;
int alhora1,almin1,offhora1,offmin1;
int alhora2,almin2,offhora2,offmin2;
int alhora3,almin3,offhora3,offmin3;
int QUANT=0;
int indice=0; //aumenta menu inicial
int cap=2;//sensore capacitivo
// Pin definitions for buttons
#define UP_BUTTON_PIN 14
#define ENTER_BUTTON_PIN 12
#define DOWN_BUTTON_PIN 13
#define direita 25
#define esquerda 26
// Initialize the OLED display
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
int valorGPIO32; // Lê o valor da porta analógica GPIO32
int valorGPIO33; // Lê o valor da porta analógica GPIO33
int valorGPIO34; // Lê o valor da porta analógica GPIO34
int valorGPIO35; // Lê o valor da porta analógica GPIO35
int valorGPIO36; // Lê o valor da porta analógica GPIO36
int valorGPIO39; // Lê o valor da porta analógica GPIO36
#define OLED_WIDTH 128
#define OLED_HEIGHT 64
// Definições de bateria
#define BATTERY_X_POS 115
#define BATTERY_Y_POS 2
#define BATTERY_WIDTH 10
#define BATTERY_HEIGHT 5
int xPos = 0; // Posição horizontal da linha
int lastValue = 0; // Valor anterior da entrada analógica
int graphData[OLED_WIDTH]; // Dados do gráfico
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Define the time offset for Brazil (GMT -3:00)
const int timeOffset = -3 * 60 * 60;
// Define the NTP server for Brazil
const char* ntpServer = "a.ntp.br";
// Create a WiFiUDP object to communicate with the NTP server
WiFiUDP ntpUDP;
// Create an NTPClient to get the time
NTPClient timeClient(ntpUDP, ntpServer, timeOffset);
// Get the current time from the NTP client
unsigned long epochTime = timeClient.getEpochTime();
struct tm* timeinfo;
char timeString[9]; // HH:MM:SS
char dateString[11]; // DD/MM/YYYY
int hora = 0;
int minuto = 0;
int segundo = 0;
int dia = 0;
int mes = 0; //
int ano = 0; //
// Endereços da EEPROM onde os valores serão armazenados
int enderecoValor1 = 0;
int enderecoValor2 = sizeof(int);
int enderecoValor3 = 2 * sizeof(int);
int enderecoValor4 = 3 * sizeof(int);
int enderecoValor5 = 4 * sizeof(int);
int enderecoValor6 = 5 * sizeof(int);
int enderecoValor7 = 6 * sizeof(int);
int enderecoValor8 = 7 * sizeof(int);
int enderecoValor9 = 8 * sizeof(int);
int enderecoValor10 = 9 * sizeof(int);
int enderecoValor11 = 10 * sizeof(int);
int enderecoValor12 = 11 * sizeof(int);
int enderecoValor13 = 12 * sizeof(int);
int enderecoValor14 = 13 * sizeof(int);
int enderecoValor15 = 14 * sizeof(int);
int enderecoValor16 = 15 * sizeof(int);
//clp
int enderecoValor17 = 16 * sizeof(int);
int enderecoValor18 = 17 * sizeof(int);
int enderecoValor19 = 18 * sizeof(int);
int enderecoValor20 = 19 * sizeof(int);
int enderecoValor21 = 20 * sizeof(int);
int enderecoValor22 = 21 * sizeof(int);
int enderecoValor23 = 22 * sizeof(int);
int enderecoValor24 = 23 * sizeof(int);
int enderecoValor25 = 24 * sizeof(int);
int enderecoValor26 = 25 * sizeof(int);
int enderecoValor27 = 26 * sizeof(int);
int enderecoValor28 = 27 * sizeof(int);
// Menu options
const int NUM_OPTIONS = 15;
const char* menuOptions[NUM_OPTIONS] = {
"Tela inicial",
"ENTRADAS",
"SAIDAS",
"ALARMES",
"CONFIGURACAO",
"GRAFICO","CLP","INFO",
"LEI DE Ohm",
"10",
"11",
"12",
"13",
"14",
"Fim do menu"
};
int selectedOption = 0;
void setup() {
Serial.begin(115200);
EEPROM.begin(512); // Inicializa a EEPROM com 512 bytes de tamanho
// Initialize the buttons as inputs with internal pull-ups
pinMode(UP_BUTTON_PIN, INPUT_PULLUP);
pinMode(ENTER_BUTTON_PIN, INPUT_PULLUP);
pinMode(DOWN_BUTTON_PIN, INPUT_PULLUP);
pinMode(direita, INPUT_PULLUP);
pinMode(esquerda, INPUT_PULLUP);
pinMode(d2, OUTPUT);
pinMode(d15, OUTPUT);
pinMode(d4, OUTPUT);
pinMode(d5, OUTPUT);
digitalWrite(d2, LOW);
digitalWrite(d4, LOW);
digitalWrite(d5, LOW);
digitalWrite(d15, LOW);
WiFi.begin("Wokwi-GUEST", "");
while (WiFi.status() != WL_CONNECTED) {
delay(250);
}
timeClient.begin();
timeClient.update();
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// Initialize the OLED display
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Adjust parameters if necessary
display.display();
delay(2000); // Pause for 2 seconds
// Clear the display
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Menu");
display.display();
// Inicializa os dados do gráfico
for (int i = 0; i < OLED_WIDTH; i++) {
graphData[i] = OLED_HEIGHT / 2;
}
//DADOS DA EEPROM
EEPROM.get(enderecoValor1, alhora);
EEPROM.get(enderecoValor2, almin);
EEPROM.get(enderecoValor3, offhora);
EEPROM.get(enderecoValor4, offmin);
EEPROM.get(enderecoValor5, alhora1);
EEPROM.get(enderecoValor6, almin1);
EEPROM.get(enderecoValor7, offhora1);
EEPROM.get(enderecoValor8, offmin1);
EEPROM.get(enderecoValor9, alhora2);
EEPROM.get(enderecoValor10, almin2);
EEPROM.get(enderecoValor11, offhora2);
EEPROM.get(enderecoValor12, offmin2);
EEPROM.get(enderecoValor13, alhora3);
EEPROM.get(enderecoValor14, almin3);
EEPROM.get(enderecoValor15, offhora3);
EEPROM.get(enderecoValor16, offmin3);
EEPROM.get(enderecoValor17, IN);
EEPROM.get(enderecoValor18, FUN1);
EEPROM.get(enderecoValor19, FUN2);
EEPROM.get(enderecoValor20, OUT);
EEPROM.get(enderecoValor21, tpligar);
EEPROM.get(enderecoValor22, tpdesligar);
EEPROM.get(enderecoValor23, tpligado);
EEPROM.get(enderecoValor24, IN1);
EEPROM.get(enderecoValor25, maiorq);
EEPROM.get(enderecoValor26, menorq);
EEPROM.get(enderecoValor27, S1);
EEPROM.get(enderecoValor28, automatico);
///############ FIM DE DADOS DA EEPROM ############
}
void loop() {
cap = touchRead(27); /* Direciona a leitura ao pino Touch T0 */
valorGPIO32 = analogRead(32); // Lê o valor da porta analógica GPIO32
valorGPIO33 = analogRead(33); // Lê o valor da porta analógica GPIO33
valorGPIO34 = analogRead(34); // Lê o valor da porta analógica GPIO34
valorGPIO35 = analogRead(35); // Lê o valor da porta analógica GPIO35
valorGPIO36 = analogRead(36); // Lê o valor da porta analógica GPIO39
valorGPIO39 = analogRead(39); // Lê o valor da porta analógica GPIO39
if((hora == alhora)&&(minuto == almin)){ALARME = 1;}
if((hora == offhora)&&(minuto == offmin)){ALARME = 0;}
if((hora == alhora1)&&(minuto == almin1)){ALARME1 = 1;}
if((hora == offhora1)&&(minuto == offmin1)){ALARME1 = 0;}
if((hora == alhora2)&&(minuto == almin2)){ALARME2 = 1;}
if((hora == offhora2)&&(minuto == offmin2)){ALARME2 = 0;}
if((hora == alhora3)&&(minuto == almin3)){ALARME3 = 1;}
if((hora == offhora3)&&(minuto == offmin3)){ALARME3 = 0;}
//HORA DA INTERNET
epochTime = timeClient.getEpochTime();
tm* timeinfo;
timeinfo = localtime((const time_t*)&epochTime);
snprintf(timeString, sizeof(timeString), "%02d:%02d:%02d", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
snprintf(dateString, sizeof(dateString), "%02d/%02d/%04d", timeinfo->tm_mday, timeinfo->tm_mon + 1, timeinfo->tm_year + 1900);
hora = timeinfo->tm_hour ;
minuto = timeinfo->tm_min;
segundo= timeinfo->tm_sec;
dia = timeinfo->tm_mday;
mes = (timeinfo->tm_mon) + 1; // +1 porque tm_mon começa em zero
ano = (timeinfo->tm_year) + 1900; // +1900 porque tm_year é o número de anos desde 1900
//FIM HORA DA INTERNET
///############ INICIO DE BOTOES DA TELA INICIAL ############
if(digitalRead(direita) == LOW) {
CONT++;
delay(200); // Button debounce delay
}
if(digitalRead(esquerda) == LOW) {
CONT--;
delay(200); // Button debounce delay
}
if(CONT<0 || CONT>5) CONT = 0;
if(estado == 0){ //se estado em tela inicia
if(digitalRead(UP_BUTTON_PIN) == LOW) {
sobe = 1;
if (indice !=0)indice--;//faz subir o menu //aumenta menu inicial
selectedOption = (selectedOption + NUM_OPTIONS - 1) % NUM_OPTIONS;
updateDisplay();
delay(200); // Button debounce delay
}
else {sobe = 0;}
////////////inicio do indice //////////////////////////////////
if (selectedOption==0)indice=0;//zera o indice para recomeçar
if (selectedOption==(NUM_OPTIONS-1))indice=8;//iguala o indice para não se perder
if (indice<1 || NUM_OPTIONS >16){indice =0;}
//////////////////////////////////////////////////////////////
// Check if the down button is pressed
if (digitalRead(DOWN_BUTTON_PIN) == LOW) {
desce = 1;
if (selectedOption>5){indice++;}//faz descer o menu //aumenta menu inicial
selectedOption = (selectedOption + 1) % NUM_OPTIONS;
updateDisplay();
delay(200); // Button debounce delay
}else {desce = 0;}
}
buttonState = digitalRead(ENTER_BUTTON_PIN);
if (estado == 1) {
handleMenuSelection();
}
if (estado == 0) {updateDisplay();}
// Verifica se o botão foi pressionado
if (buttonState == LOW && lastButtonState == HIGH) {
// Gera um pulso
estado++;
}
if(estado>1) {estado=0; QUANT=0;}
lastButtonState = buttonState;
}
//#####################FIM DO LOOP #############################
void updateDisplay() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
for (int i = 0; i < NUM_OPTIONS; i++) {
if (i == selectedOption) {
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Highlight the selected option
} else {
display.setTextColor(SSD1306_WHITE);
}
//display.setCursor(0, i * 8);
display.setCursor(0, (i - indice)* 8);//aumenta menu inicial
display.println(menuOptions[i]);
}
display.display();
}//############ FIM DE BOTOES TELA INICIAL #################
void handleMenuSelection() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
switch (selectedOption) { ///INICIO DO CASE ///
case 0:{ //TELA INICIAL
display.println("Main menu selected");
display.clearDisplay();
display.setTextSize(1);//TAMANHO DA FONTE
bateria();//mostra entrada de bateria
display.setCursor(0, 0);
display.println(" Data e Hora (BR):");
display.setTextSize(2);//TAMANHO DA FONTE
display.setCursor(0, 42);
display.println(dateString);
display.setCursor(10, 16);
display.println(timeString);
break;}//fim da tela inicial
case 1:{// MENU ENTRADAS
display.println("ENTRADAS ANALOGICAS");
display.print("ENTRADA 32:");
display.println(valorGPIO32);
display.print("ENTRADA 33:");
display.println(valorGPIO33);
display.print("ENTRADA 34:");
display.println(valorGPIO34);
display.print("ENTRADA 35:");
display.println(valorGPIO35);
display.print("ENTRADA 36:");
display.println(valorGPIO36);
display.print("ENTRADA 39:");
display.println(valorGPIO39);
display.print("sensor capacitivo:");
display.println(cap);
// Handle inputs menu actions cap
break;}
// ########## FIM ENTRADAS #################################
case 2:{// MENU SAIDAS //
display.clearDisplay();
display.setTextSize(1);//TAMANHO DA FONTE
display.println(" SAIDAS");
break;}//############################################
case 3:{ //ALARMES E AJUSTE DE ALARMES
if(CONT==0){
if(digitalRead(UP_BUTTON_PIN) == LOW) {selectalarme--;delay(100);}
if(digitalRead(DOWN_BUTTON_PIN) == LOW) {selectalarme++;delay(100);}
if(selectalarme>4 || selectalarme<0){selectalarme=0;}
}
display.println(" ALARMES e ajustes");
display.setCursor(10, 10);
display.print("ON:");
if(CONT == 1 && selectalarme == 0) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(alhora);
display.setTextColor(SSD1306_WHITE);
display.print(":");
if(CONT == 2 && selectalarme == 0) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(almin);
display.setTextColor(SSD1306_WHITE);
display.print(" OFF:");
if(CONT == 3 && selectalarme == 0) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(offhora);
display.setTextColor(SSD1306_WHITE);
display.print(":");
if(CONT == 4 && selectalarme == 0) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(offmin);
display.setTextColor(SSD1306_WHITE);
//display.println(" ALARME 2");
display.setCursor(10, 20);
display.print("ON:");
if(CONT == 1 && selectalarme == 1) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(alhora1);
display.setTextColor(SSD1306_WHITE);
display.print(":");
if(CONT == 2 && selectalarme == 1) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(almin1);
display.setTextColor(SSD1306_WHITE);
display.print(" OFF:");
if(CONT == 3 && selectalarme == 1) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(offhora1);
display.setTextColor(SSD1306_WHITE);
display.print(":");
if(CONT == 4 && selectalarme == 1) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(offmin1);
display.setTextColor(SSD1306_WHITE);
//display.println(" ALARME 3");
display.setCursor(10, 30);
display.print("ON:");
if(CONT == 1 && selectalarme == 2) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(alhora2);
display.setTextColor(SSD1306_WHITE);
display.print(":");
if(CONT == 2 && selectalarme == 2) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(almin2);
display.setTextColor(SSD1306_WHITE);
display.print(" OFF:");
if(CONT == 3 && selectalarme == 2) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(offhora2);
display.setTextColor(SSD1306_WHITE);
display.print(":");
if(CONT == 4 && selectalarme == 2) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(offmin2);
display.setTextColor(SSD1306_WHITE);
//display.println(" ALARME 3");
display.setCursor(10, 40);
display.print("ON:");
if(CONT == 1 && selectalarme == 3) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(alhora3);
display.setTextColor(SSD1306_WHITE);
display.print(":");
if(CONT == 2 && selectalarme == 3) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(almin3);
display.setTextColor(SSD1306_WHITE);
display.print(" OFF:");
if(CONT == 3 && selectalarme == 3) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(offhora3);
display.setTextColor(SSD1306_WHITE);
display.print(":");
if(CONT == 4 && selectalarme == 3) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(offmin3);
display.setTextColor(SSD1306_WHITE);
if(selectalarme == 0){
display.setCursor(0, 10);
if(CONT == 0)display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(">");
display.setTextColor(SSD1306_WHITE);
if(CONT==1){ // display.setCursor(0, 20);
// display.print("AJ. HORA ALARME ON");
if(digitalRead(UP_BUTTON_PIN) == LOW) {alhora++;delay(100);}
if(digitalRead(DOWN_BUTTON_PIN) == LOW) {alhora--;delay(100);}
if(alhora>23 || alhora<0){alhora=0;}
}
if(CONT==2){ // display.setCursor(0, 20);
//display.print("AJ. MIN ALARME ON");
if(digitalRead(UP_BUTTON_PIN) == LOW) {almin++;delay(100);}
if(digitalRead(DOWN_BUTTON_PIN) == LOW) {almin--;delay(100);}
if(almin>59 || almin<0){almin=0;}
}
if(CONT==3){ // display.setCursor(0, 20);
// display.print("AJ. HORA ALARME OFF");
if(digitalRead(UP_BUTTON_PIN) == LOW) {offhora++;delay(100);}
if(digitalRead(DOWN_BUTTON_PIN) == LOW) {offhora--;delay(100);}
if(offhora>23 || offhora<0){offhora=0;}
}
if(CONT==4){ // display.setCursor(0, 20);
//display.print("AJ. MIN ALARME OFF");
if(digitalRead(UP_BUTTON_PIN) == LOW) {offmin++;delay(100);}
if(digitalRead(DOWN_BUTTON_PIN) == LOW) {offmin--;delay(100);}
if(offmin>59 || offmin<0){offmin=0;}
// ESP.restart(); //reinicia o esp32
}
if(CONT == 5){
EEPROM.put(enderecoValor1, alhora);
EEPROM.put(enderecoValor2, almin);
EEPROM.put(enderecoValor3, offhora);
EEPROM.put(enderecoValor4, offmin);
EEPROM.commit(); // Grava os dados na EEPROM
delay(250);
ESP.restart(); //reinicia o esp32
}
}//fim selecalarme 1
if(selectalarme == 1){
display.setCursor(0, 20);
if(CONT == 0)display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(">");
display.setTextColor(SSD1306_WHITE);
if(CONT==1){ // display.setCursor(0, 20);
// display.print("AJ. HORA ALARME ON");
if(digitalRead(UP_BUTTON_PIN) == LOW) {alhora1++;delay(100);}
if(digitalRead(DOWN_BUTTON_PIN) == LOW) {alhora1--;delay(100);}
if(alhora1>23 || alhora1<0){alhora1=0;}
}
if(CONT==2){ // display.setCursor(0, 20);
//display.print("AJ. MIN ALARME ON");
if(digitalRead(UP_BUTTON_PIN) == LOW) {almin1++;delay(100);}
if(digitalRead(DOWN_BUTTON_PIN) == LOW) {almin1--;delay(100);}
if(almin1>59 || almin1<0){almin1=0;}
}
if(CONT==3){ // display.setCursor(0, 20);
// display.print("AJ. HORA ALARME OFF");
if(digitalRead(UP_BUTTON_PIN) == LOW) {offhora1++;delay(100);}
if(digitalRead(DOWN_BUTTON_PIN) == LOW) {offhora1--;delay(100);}
if(offhora1>23 || offhora1<0){offhora1=0;}
}
if(CONT==4){ // display.setCursor(0, 20);
//display.print("AJ. MIN ALARME OFF");
if(digitalRead(UP_BUTTON_PIN) == LOW) {offmin1++;delay(100);}
if(digitalRead(DOWN_BUTTON_PIN) == LOW) {offmin1--;delay(100);}
if(offmin1>59 || offmin1<0){offmin1=0;}
// ESP.restart(); //reinicia o esp32
}
if(CONT == 5){
EEPROM.put(enderecoValor5, alhora1);
EEPROM.put(enderecoValor6, almin1);
EEPROM.put(enderecoValor7, offhora1);
EEPROM.put(enderecoValor8, offmin1);
EEPROM.commit(); // Grava os dados na EEPROM
delay(250);
ESP.restart(); //reinicia o esp32
}
}//fim selecalarme 2
if(selectalarme == 2){
display.setCursor(0, 30);
if(CONT == 0)display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(">");
display.setTextColor(SSD1306_WHITE);
if(CONT==1){ // display.setCursor(0, 20);
// display.print("AJ. HORA ALARME ON");
if(digitalRead(UP_BUTTON_PIN) == LOW) {alhora2++;delay(100);}
if(digitalRead(DOWN_BUTTON_PIN) == LOW) {alhora2--;delay(100);}
if(alhora2>23 || alhora2<0){alhora2=0;}
}
if(CONT==2){ // display.setCursor(0, 20);
//display.print("AJ. MIN ALARME ON");
if(digitalRead(UP_BUTTON_PIN) == LOW) {almin2++;delay(100);}
if(digitalRead(DOWN_BUTTON_PIN) == LOW) {almin2--;delay(100);}
if(almin2>59 || almin2<0){almin2=0;}
}
if(CONT==3){ // display.setCursor(0, 20);
// display.print("AJ. HORA ALARME OFF");
if(digitalRead(UP_BUTTON_PIN) == LOW) {offhora2++;delay(100);}
if(digitalRead(DOWN_BUTTON_PIN) == LOW) {offhora2--;delay(100);}
if(offhora2>23 || offhora2<0){offhora2=0;}
}
if(CONT==4){ // display.setCursor(0, 20);
//display.print("AJ. MIN ALARME OFF");
if(digitalRead(UP_BUTTON_PIN) == LOW) {offmin2++;delay(100);}
if(digitalRead(DOWN_BUTTON_PIN) == LOW) {offmin2--;delay(100);}
if(offmin2>59 || offmin2<0){offmin2=0;}
}
if(CONT == 5){
EEPROM.put(enderecoValor9, alhora2);
EEPROM.put(enderecoValor10, almin2);
EEPROM.put(enderecoValor11, offhora2);
EEPROM.put(enderecoValor12, offmin2);
EEPROM.commit(); // Grava os dados na EEPROM
delay(250);
ESP.restart(); //reinicia o esp32
}
}//fim selecalarme 3
if(selectalarme == 3){
display.setCursor(0, 40);
if(CONT == 0)display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(">");
display.setTextColor(SSD1306_WHITE);
if(CONT==1){ // display.setCursor(0, 20);
// display.print("AJ. HORA ALARME ON");
if(digitalRead(UP_BUTTON_PIN) == LOW) {alhora3++;delay(100);}
if(digitalRead(DOWN_BUTTON_PIN) == LOW) {alhora3--;delay(100);}
if(alhora3>23 || alhora3<0){alhora3=0;}
}
if(CONT==2){ // display.setCursor(0, 20);
//display.print("AJ. MIN ALARME ON");
if(digitalRead(UP_BUTTON_PIN) == LOW) {almin3++;delay(100);}
if(digitalRead(DOWN_BUTTON_PIN) == LOW) {almin3--;delay(100);}
if(almin3>59 || almin3<0){almin3=0;}
}
if(CONT==3){ // display.setCursor(0, 20);
// display.print("AJ. HORA ALARME OFF");
if(digitalRead(UP_BUTTON_PIN) == LOW) {offhora3++;delay(100);}
if(digitalRead(DOWN_BUTTON_PIN) == LOW) {offhora3--;delay(100);}
if(offhora3>23 || offhora3<0){offhora3=0;}
}
if(CONT==4){ // display.setCursor(0, 20);
//display.print("AJ. MIN ALARME OFF");
if(digitalRead(UP_BUTTON_PIN) == LOW) {offmin3++;delay(100);}
if(digitalRead(DOWN_BUTTON_PIN) == LOW) {offmin3--;delay(100);}
if(offmin3>59 || offmin3<0){offmin3=0;}
}
if(CONT == 5){
EEPROM.put(enderecoValor13, alhora3);
EEPROM.put(enderecoValor14, almin3);
EEPROM.put(enderecoValor15, offhora3);
EEPROM.put(enderecoValor16, offmin3);
EEPROM.commit(); // Grava os dados na EEPROM
delay(250);
ESP.restart(); //reinicia o esp32
}
}
display.setCursor(10, 50);
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print("SALVAR");
display.setTextColor(SSD1306_WHITE);
if(selectalarme == 4){
display.setCursor(0, 50);
if(CONT == 0)display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(">");
display.setTextColor(SSD1306_WHITE);
if(digitalRead(direita) == LOW){
EEPROM.put(enderecoValor1, alhora);
EEPROM.put(enderecoValor2, almin);
EEPROM.put(enderecoValor3, offhora);
EEPROM.put(enderecoValor4, offmin);
EEPROM.put(enderecoValor5, alhora1);
EEPROM.put(enderecoValor6, almin1);
EEPROM.put(enderecoValor7, offhora1);
EEPROM.put(enderecoValor8, offmin1);
EEPROM.put(enderecoValor9, alhora2);
EEPROM.put(enderecoValor10, almin2);
EEPROM.put(enderecoValor11, offhora2);
EEPROM.put(enderecoValor12, offmin2);
EEPROM.put(enderecoValor13, alhora3);
EEPROM.put(enderecoValor14, almin3);
EEPROM.put(enderecoValor15, offhora3);
EEPROM.put(enderecoValor16, offmin3);
EEPROM.commit(); // Grava os dados na EEPROM
delay(100);
display.setCursor(10, 50);
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print("DADOS SALVOS");
display.setTextColor(SSD1306_WHITE);
delay(250);
}
}//fim selecalarme 4
break;
}
///#################### FIM DE ALARMES E AJUSTES #################
case 4:{//CONFIGURAÇÃO
// Obtém a intensidade do sinal WiFi (RSSI)
int signalStrength = WiFi.RSSI();
display.clearDisplay(); // Limpa a tela
display.setCursor(1, 1);
display.println(" CONFIGURACAO");
display.setCursor(0, 10);
display.print("Intensidade: ");
display.print(signalStrength);
display.println(" dBm");
display.print("IP: ");
display.println(WiFi.localIP());
bateria();
display.display();
// Handle settings menu actions
break;}//FIM DE CONFIGURAÇÕES
case 5:{ //GRAFICO ENTRADA ANALOGICA
display.clearDisplay(); // Limpa a tela
display.setCursor(2, 2);
display.print(" Grafico ");
display.println(valorGPIO34);
display.drawRect(0,0,128,64, SSD1306_WHITE);//desenha quadrado
//( inicio > ,inicio v, tamanha horizontal, tamanho vertical,)
// display.drawRect(0, 20, 128, 20, SSD1306_WHITE);//desenha linha
// Mapeia o valor lido para o intervalo do display OLED
int displayValue = map(valorGPIO34, 4095, 0,0, OLED_HEIGHT);
// Move o gráfico para a esquerda
for (int i = 1; i < OLED_WIDTH; i++) {
graphData[i - 1] = graphData[i];
}
// Adiciona o novo valor ao gráfico
graphData[OLED_WIDTH - 1] = displayValue;
drawGraph(); // Desenha o gráfico
display.display();// Atualiza o display
break;}//FIM DE GRAFICOS
//#################################################################
case 6:{//MENU CLP controlador logico programavel
funsao();//chama a função de logica CLP
if(digitalRead(direita) == LOW) {
CONT1++;
}
if(digitalRead(esquerda) == LOW) {
CONT1--;
}
if(SEL==0 || SEL ==4){if(CONT1>4 || CONT1<0){CONT1=0;}}
else {if(CONT1>2|| CONT1<0){CONT1=0;}}
if(digitalRead(UP_BUTTON_PIN) == LOW){
if(CONT1 == 0){SEL--;}
if(SEL == 0){
if(CONT1 == 1){IN++;}
if(CONT1 == 2){FUN1++;}
if(CONT1 == 3){FUN2++;if(FUN2>1)FUN2=0;}
if(CONT1 == 4){OUT++;}
}
if(SEL==1 && CONT1==1){tpligar++;}
if(SEL==1 && CONT1==2){tpdesligar++;}
if(SEL==2 && CONT1==1){tpligado++;}
if(SEL==3 && CONT1==1){automatico++;}
if(SEL == 4){
if(CONT1==1){IN1++;}
if(CONT1==2){maiorq+=10;}
if(CONT1==3){menorq+=10;}
if(CONT1==4){S1++;}
}
delay(100);
}
if(digitalRead(DOWN_BUTTON_PIN) == LOW){
if(CONT1 == 0){SEL++;}
if(SEL ==0){
if(CONT1 == 1){IN--;}
if(CONT1 == 2){FUN1--;}
if(CONT1 == 3){FUN2--;}
if(CONT1 == 4){OUT--;}
}
if(SEL==1 && CONT1==1){tpligar--;}
if(SEL==1 && CONT1==2){tpdesligar--;}
if(SEL==2 && CONT1==1){tpligado--;}
if(SEL==3 && CONT1==1){automatico--;}
if(SEL == 4){
if(CONT1==1){IN1--;}
if(CONT1==2){maiorq--;}
if(CONT1==3){menorq--;}
if(CONT1==4){S1--;}
}
delay(100);
}
if(SEL>4 || SEL<0){SEL=0;}
if(IN>4 || IN<0){IN = 0;}
if(FUN1>6 || FUN1<0){FUN1 = 0;}
if(FUN2>6 || FUN2<0){FUN2 = 0;}
if (OUT>4|| OUT<0){OUT=0;}
if(IN1>3||IN<0){IN1=0;}
if(maiorq<0){maiorq=0;}
if(menorq<0){menorq=0;}
if (S1>4|| S1<0){S1=0;}
display.clearDisplay(); // Limpa a tela
display.setCursor(10, 2);
display.print(onoff);
display.print(" CLP ");
display.drawRect(0,0,128,64, SSD1306_WHITE);//desenha quadrado
display.drawRect(0,10,128,12, SSD1306_WHITE);//desenha quadrado
display.drawRect(0,52,128,12, SSD1306_WHITE);//desenha quadrado
display.drawRect(62,32,42,11, SSD1306_WHITE);//desenha quadrado no salva
display.print("Tempo:");
display.print(tempo);
if(FUN1==2){display.print("->");display.print(QUANT);}
display.setCursor(10, 12);
display.print("E:");
if(CONT1 == 1 && SEL == 0) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
switch (IN) {
case 0:
display.print("D14");
break;
case 1:
display.print("D13");
break;
case 2:
display.print("D27");
break;
case 3:
display.print("D26");
break;
case 4:
display.print("D26");
break;
default:
display.print("Invalid");
break;
}
display.setTextColor(SSD1306_WHITE);
display.print(":");
if(CONT1 == 2 && SEL == 0) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
switch (FUN1) {
case 0:{
display.print("DLYON");//TEMPO PARA LIGAR
break;}
case 1:
display.print("DLYOFF");//TEMPO PARA DESLIGAR
break;
case 2:
display.print("PLS");//PULSO
break;
case 3:
display.print("ONOFF");//LIGA DESLIGA
break;
case 4:
display.print("LOOP");//LOOP
break;
case 5:
display.print("AUTO");//SEM FUNÇÃO
break;
case 6:
display.print("PASS");//PASSAGEM LIVRE
break;
default:
display.print("Invalid");
break;
}
display.setTextColor(SSD1306_WHITE);
display.print(":");
if(CONT1 == 3 && SEL == 0) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(FUN2);
display.setTextColor(SSD1306_WHITE);
display.print(" S:");
if(CONT1 == 4 && SEL == 0) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
switch (OUT) {
case 0:
display.print("D15");
break;
case 1:
display.print("D2");
break;
case 2:
display.print("D4");
break;
case 3:
display.print("D5");
break;
default:
display.print("---");
break;
}
if(CONT1 == 0) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.setCursor(1, 2);
switch (SEL) {
case 0:{
display.setCursor(1, 12);
display.print(">");
break;
}
case 1:{
display.setCursor(1, 24);
display.print(">");
break;}
case 2:
{display.setCursor(1, 34);
display.print(">");
break;}
case 3:
{display.setCursor(1, 44);
display.print(">");
break;}
default:{
display.setCursor(1, 54);
display.print(">");
break;}
}
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 24);
display.print("DLYON:");
if(SEL==1 && CONT1==1)display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(tpligar);
display.setTextColor(SSD1306_WHITE);
display.setCursor(64, 24);
display.print("DLYOFF:");
if(SEL==1 && CONT1==2)display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(tpdesligar);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 34);
display.print("LOOP:");
if(SEL==2 && CONT1==1)display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(tpligado);
display.setTextColor(SSD1306_WHITE);
display.setCursor(64, 44);
display.print("AUTO:");
if(SEL==3 && CONT1==1)display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(automatico);
display.setTextColor(SSD1306_WHITE);
display.setCursor(64, 34);
display.print("SALVAR");
if(SEL==2 && CONT1==2){display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(" OK ");
EEPROM.put(enderecoValor17, IN);
EEPROM.put(enderecoValor18, FUN1);
EEPROM.put(enderecoValor19, FUN2);
EEPROM.put(enderecoValor20, OUT);
EEPROM.put(enderecoValor21, tpligar);
EEPROM.put(enderecoValor22, tpdesligar);
EEPROM.put(enderecoValor23, tpligado);
EEPROM.put(enderecoValor24, IN1);
EEPROM.put(enderecoValor25, maiorq);
EEPROM.put(enderecoValor26, menorq);
EEPROM.put(enderecoValor27, S1);
EEPROM.put(enderecoValor28, automatico);
EEPROM.commit(); // Grava os dados na EEPROM
delay(100);
CONT1=0;}
display.setTextColor(SSD1306_WHITE);
////######### FUNÇÃO ANALOGICA #############
display.setCursor(10, 44);
if(S2==1)display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
if(IN1==0){display.print(valorGPIO32);}
if(IN1==1){display.print(valorGPIO33);}
if(IN1==2){display.print(valorGPIO34);}
if(IN1==3){display.print(valorGPIO35);}
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 54);
if(CONT1 == 1 && SEL == 4) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
switch (IN1) {
case 0:
display.print("D32");
break;
case 1:
display.print("D33");
break;
case 2:
display.print("D34");
break;
case 3:
display.print("D35");
break;
default:
display.print("Invalid");
break;
}
display.setTextColor(SSD1306_WHITE);
display.print(":");
if(CONT1 == 2 && SEL == 4) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(maiorq);//TEMPO PARA LIGAR
display.print("><");
display.setTextColor(SSD1306_WHITE);
display.print(":");
if(CONT1 == 3 && SEL == 4) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.print(menorq);
display.setTextColor(SSD1306_WHITE);
display.print(" S:");
if(CONT1 == 4 && SEL == 4) display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
switch (S1) {
case 0:
display.print("D15");
break;
case 1:
display.print("D2");
break;
case 2:
display.print("D4");
break;
case 3:
display.print("D5");
break;
default:
display.print("---");
break;
}
break; }
///############################################################
case 7:{ // MENU INFORMAÇÕES
display.clearDisplay();
display.setTextSize(1);//TAMANHO DA FONTE
display.println(" INFO ");
if(SEL_MENU_2 == 0){
if(digitalRead(direita) == LOW) {
SEL_MENU_2++;
}}
if(SEL_MENU_2 == 1){
if(digitalRead(esquerda) == LOW) {
SEL_MENU_2--;
}}
if(SEL_MENU_2 == 0){
if(digitalRead(UP_BUTTON_PIN) == LOW) {delay(100);OPSAO2--;}
if(digitalRead(DOWN_BUTTON_PIN) == LOW) {delay(100);OPSAO2++;}
}
if(SEL_MENU_2>1 || SEL_MENU_2<0){SEL_MENU_2=0;}
if(OPSAO2>4 || OPSAO2<0){OPSAO2=0;}
if(OPSAO2==0){ display.setCursor(0, 10);
display.println(">");}
if(OPSAO2==1){ display.setCursor(0, 20);
display.println(">");}
if(OPSAO2==2){ display.setCursor(0, 30);
display.println(">");}
if(OPSAO2==3){ display.setCursor(0, 40);
display.println(">");}
if(OPSAO2==4){ display.setCursor(0, 50);
display.println(">");}
display.setCursor(6, 10);
display.println("RELOGIO NET");
display.setCursor(6, 20);
display.println("TEMP. INTERNA");
display.setCursor(6, 30);
display.println("SENSOR HALL INTERNO");
display.setCursor(6, 40);
display.println("SENSOR CAPACITIVO");
display.setCursor(6, 50);
display.println("TENSAO DE ENTRADA");
if(SEL_MENU_2==1 && OPSAO2==0){
display.clearDisplay();
display.setTextSize(1);//TAMANHO DA FONTE
bateria();//mostra entrada de bateria
display.setCursor(0, 0);
display.println(" Data e Hora (BR):");
display.setTextSize(2);//TAMANHO DA FONTE
display.setCursor(0, 32);
display.println(dateString);
display.setCursor(10, 16);
display.println(timeString);
display.setTextSize(1);//TAMANHO DA FONTE
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.setCursor(60, 50);
display.println("VOLTAR <");//int hall = hallRead();
}
if(SEL_MENU_2==1 && OPSAO2==1){
// Lê a temperatura interna do ESP32
//float temperatura = (esp32_adc_read_temp() - 32) / 1.8; // Converte de Fahrenheit para Celsius
display.clearDisplay();
display.setTextSize(1);//TAMANHO DA FONTE
bateria();//mostra entrada de bateria
display.setCursor(0, 0);
display.println("TEMPERATURA INTERNA");
display.setTextSize(2);//TAMANHO DA FONTE
display.setCursor(10, 30);
//display.println(temperatura);int hall = hallRead(); /* Armazena os valores de leitura */
display.print("32,5");
display.println("^C");
display.setTextSize(1);//TAMANHO DA FONTE
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.setCursor(60, 50);
display.println("VOLTAR <");
}
if(SEL_MENU_2==1 && OPSAO2==2){
int hall = hallRead();
display.clearDisplay();
display.setTextSize(1);//TAMANHO DA FONTE
bateria();//mostra entrada de bateria
display.setCursor(0, 0);
display.println("Sensor HALL int.");
display.setTextSize(2);//TAMANHO DA FONTE
display.setCursor(5, 30);
display.print(hall);
display.println(" >>>");
display.setTextSize(1);//TAMANHO DA FONTE
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.setCursor(60, 50);
display.println("VOLTAR <");
}
if(SEL_MENU_2==1 && OPSAO2==3){
int cap = touchRead(25);
display.clearDisplay();
display.setTextSize(1);//TAMANHO DA FONTE
bateria();//mostra entrada de bateria
display.setCursor(0, 0);
display.println("Sensor Capacitivo");
display.setTextSize(2);//TAMANHO DA FONTE
display.setCursor(12, 30);
display.print(cap);
display.println(" >>>");
display.setTextSize(1);//TAMANHO DA FONTE
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.setCursor(60, 50);
display.println("VOLTAR <");
}
if(SEL_MENU_2==1 && OPSAO2==4){
display.clearDisplay();
display.setTextSize(1);//TAMANHO DA FONTE
bateria();//mostra entrada de bateria
display.setCursor(0, 0);
display.println("TENSAO DE ENTRADA");
display.setTextSize(2);//TAMANHO DA FONTE
display.setCursor(12, 30);
display.print(valorGPIO39/1240.9);
display.println(" Vcc");
display.setTextSize(1);//TAMANHO DA FONTE
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.setCursor(60, 50);
display.println("VOLTAR <");
}
break;}
//################## FIM DE INFO #################################
case 8:{
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
float energyIncrement = (pot / 1000.0) * (interval / 3600000.0); // Incremento de energia em kWh
energy += energyIncrement;
t5++;
}
display.println("lei de Ohm");
display.setCursor(0, 10);
display.print("Resistencia:");
// if(corr !=0){
if(resistor<1000){display.print(resistor=(volt/corr));
}
if(resistor>1000){display.print((resistor=(volt/corr))/1000);
display.print("k");
}//}
//else {display.print("cir aberto");}
display.setCursor(0, 20);
display.print("Corrente:");
display.print(corr=(volt/resistor));
display.print("A");
display.setCursor(0, 30);
display.print("Tensao:");
display.print(volt=(resistor*corr));
display.print("V");
display.setCursor(0, 40);
display.print("Potencia:");
display.print(pot=(volt*corr));
display.print("W");
display.setCursor(0, 50);
display.print("Energia:");
display.print(energy);
display.print("kW/h");
display.setCursor(0, 65);
display.print("tempo:");
display.print(t5);
display.print("s");
display.display();
break;}
case 9:{
display.setCursor(0, 0);
display.println("menu 10");
break;}
case 10:{
display.setCursor(0, 0);
display.println("menu 11");
break;}
case 11:{
display.setCursor(0, 0);
display.println("menu 12");
break;}
case 12:{
display.setCursor(0, 0);
display.println("menu 13");
break;}
case 13:{
display.setCursor(0, 0);
display.println("menu 14");
break;}
case 14:{
display.setCursor(0, 0);
display.println("fim de menus ");
break;}
} //###########FIM DO CASE ##########################
display.display();
}
void drawGraph() {// FUNÇÃO GRAFICO
for (int i = 1; i < OLED_WIDTH; i++) {
int y1 = graphData[i - 1];
int y2 = graphData[i];
display.drawLine(i - 1, y1, i, y2, SSD1306_WHITE);
}
}
void bateria(){// Mapeia o valor lido para o intervalo da carga da bateria (0-100%)
int batteryLevel = map(valorGPIO35, 0, 4095, 0, 100);
// Desenha o contorno da bateria
display.drawRect(BATTERY_X_POS, BATTERY_Y_POS, BATTERY_WIDTH, BATTERY_HEIGHT, SSD1306_WHITE);
// Calcula a largura do nível da bateria com base na carga
int batteryLevelWidth = map(batteryLevel, 0, 100, 0, BATTERY_WIDTH - 2);
// Preenche a carga da bateria com base no nível atual
display.fillRect(BATTERY_X_POS + 1, BATTERY_Y_POS + 1, batteryLevelWidth, BATTERY_HEIGHT - 2, SSD1306_WHITE);
display.setCursor(BATTERY_X_POS + BATTERY_WIDTH + 5, BATTERY_Y_POS); // Exibe o nível da bateria
}//FIM DA FUNÇÃO BATERIA
void funsao(){//FUNÇÃO PARA EXECUSÃO DE CLP
///função analogica do CLP
if(IN1==0){if(valorGPIO32>maiorq && valorGPIO32<menorq){S2=1;}else S2=0;}
if(IN1==1){if(valorGPIO33>maiorq && valorGPIO33<menorq){S2=1;}else S2=0;}
if(IN1==3){if(valorGPIO34>maiorq && valorGPIO34<menorq){S2=1;}else S2=0;}
if(IN1==4){if(valorGPIO35>maiorq && valorGPIO35<menorq){S2=1;}else S2=0;}
////////////////////////////////////////////////////////////////////////
if(FUN2==1){
if(OUT ==0 || S1==0 ) { if((L1 ==1 && tempo>0)||(S1==0 && S2==1)){digitalWrite(d15, LOW);}else {digitalWrite(d15, HIGH);}}
if(OUT ==1 || S1==1 ) { if((L1 ==1 && tempo>0)||(S1==1 && S2==1)){digitalWrite(d2, LOW);}else {digitalWrite(d2, HIGH);}}
if(OUT ==2 || S1==2 ) { if((L1 ==1 && tempo>0)||(S1==2 && S2==1)){digitalWrite(d4, LOW);}else {digitalWrite(d4, HIGH);}}
if(OUT ==3 || S1==3 ) { if((L1 ==1 && tempo>0)||(S1==3 && S2==1)){digitalWrite(d5, LOW);}else {digitalWrite(d5, HIGH);}}
}
else{
if((OUT ==0 && L1 ==1 && tempo>0)||(S1==0 && S2==1)){digitalWrite(d15, HIGH);}else {digitalWrite(d15, LOW);}
if((OUT ==1 && L1 ==1 && tempo>0)||(S1==1 && S2==1)){digitalWrite(d2, HIGH);}else {digitalWrite(d2, LOW);}
if((OUT ==2 && L1 ==1 && tempo>0)||(S1==2 && S2==1)){digitalWrite(d4, HIGH);}else {digitalWrite(d4, LOW);}
if((OUT ==3 && L1 ==1 && tempo>0)||(S1==3 && S2==1)){digitalWrite(d5, HIGH);}else {digitalWrite(d5, LOW);}
}
if(IN == 0){ // se entrada 1 selecionada
entrada1 = digitalRead(UP_BUTTON_PIN);
if (entrada1== LOW && antentrada1 == HIGH) {//GERA UM PULSO
if(FUN1==2){ L1 = 1;tempo++;QUANT++;}
if(FUN1==3){onoff++;}
if(FUN1==4) {onoff++;}
if(FUN1==5 && onoff==0) {onoff++;}
}//FIM DO PULSO
else {if(FUN1==2){L1 = 0;}}//pulso
if(FUN1==3){ L1=onoff;tempo=onoff;}//retensão
if(FUN1==4){if(onoff==1)tempo++; if(tempo>tpligado){retardo++;tempo=0;}//loop
if(retardo==1){L1=1;}else L1=0;
if(onoff==0){tempo=0;}
}//fim do loop
if(FUN1==5){if(onoff==1){L1=1;tempo++;}if(tempo>automatico){tempo=0;L1=0;onoff=0;}}//automatico
if(FUN1==6){if(entrada1==0){tempo=1;L1=1;}}
antentrada1 = entrada1;
if(onoff>1){onoff=0;}
if(retardo>1){retardo=0;}
if(digitalRead(UP_BUTTON_PIN) == LOW) { //pino 14
if(FUN1==0){//delay para ligar
if(tempo<tpligar){tempo++;}
if(tpligar == tempo){L1=1;}else{L1=0;}
}
if(FUN1==1){//delay para desligar
if(tempo<tpdesligar){tempo++;}
if(tpdesligar == tempo){L1=0;}else{L1=1;}
}
}else {if(FUN1 !=3 && FUN1 !=4 && FUN1 !=5){tempo = 0;}}
}
if(IN == 1){//se entrada 2 selecionada
entrada1 = digitalRead(DOWN_BUTTON_PIN);
if (entrada1== LOW && antentrada1 == HIGH) {//GERA UM PULSO
if(FUN1==2){ L1 = 1;tempo++;QUANT++;}
if(FUN1==3){onoff++;}
if(FUN1==4) {onoff++;}
if(FUN1==5 && onoff==0) {onoff++;}
}//FIM DO PULSO
else {if(FUN1==2){L1 = 0;}}//pulso
if(FUN1==3){ L1=onoff;tempo=onoff;}//retensão
if(FUN1==4){if(onoff==1)tempo++; if(tempo>tpligado){retardo++;tempo=0;}//loop
if(retardo==1){L1=1;}else L1=0;
if(onoff==0){tempo=0;}
}//fim do loop
if(FUN1==5){if(onoff==1){L1=1;tempo++;}if(tempo>automatico){tempo=0;L1=0;onoff=0;}}//automatico
if(FUN1==6){if(entrada1==0){tempo=1;L1=1;}}
antentrada1 = entrada1;
if(onoff>1){onoff=0;}
if(retardo>1){retardo=0;}
if(digitalRead(DOWN_BUTTON_PIN) == LOW){ //pino 13
if(FUN1==0){//delay para ligar
if(tempo<tpligar){tempo++;}
if(tpligar == tempo){L1=1;}
}
if(FUN1==1){//delay para desligar
if(tempo<tpdesligar){tempo++;}
if(tpdesligar == tempo){L1=0;}else{L1=1;}
}
}else {if(FUN1 !=3 && FUN1 !=4 && FUN1 !=5){tempo = 0;}}
}
if(IN == 2){//se entrada 2 selecionada
entrada1 = digitalRead(direita);
if (entrada1== LOW && antentrada1 == HIGH) {//GERA UM PULSO
if(FUN1==2){ L1 = 1;tempo++;QUANT++;}
if(FUN1==3){onoff++;}
if(FUN1==4) {onoff++;}
if(FUN1==5 && onoff==0) {onoff++;}
}//FIM DO PULSO
else {if(FUN1==2){L1 = 0;}}//pulso
if(FUN1==3){ L1=onoff;tempo=onoff;}//retensão
if(FUN1==4){if(onoff==1)tempo++; if(tempo>tpligado){retardo++;tempo=0;}//loop
if(retardo==1){L1=1;}else L1=0;
if(onoff==0){tempo=0;}
}//fim do loop
if(FUN1==5){if(onoff==1){L1=1;tempo++;}if(tempo>automatico){tempo=0;L1=0;onoff=0;}}//automatico
if(FUN1==6){if(entrada1==0){tempo=1;L1=1;}}
antentrada1 = entrada1;
if(onoff>1){onoff=0;}
if(retardo>1){retardo=0;}
if(digitalRead(direita) == LOW) { //pino 27
if(FUN1==0){//delay para ligar
if(tempo<tpligar){tempo++;}
if(tpligar == tempo){L1=1;}
}
if(FUN1==1){//delay para desligar
if(tempo<tpdesligar){tempo++;}
if(tpdesligar == tempo){L1=0;}else{L1=1;}
}
}else {if(FUN1 !=3 && FUN1 !=4 && FUN1 !=5){tempo = 0;}}
}
if(IN == 3){//se entrada 2 selecionada
entrada1 = digitalRead(esquerda);
if (entrada1== LOW && antentrada1 == HIGH) {//GERA UM PULSO
if(FUN1==2){ L1 = 1;tempo++;QUANT++;}
if(FUN1==3){onoff++;}
if(FUN1==4) {onoff++;}
if(FUN1==5 && onoff==0) {onoff++;}
}//FIM DO PULSO
else {if(FUN1==2){L1 = 0;}}//pulso
if(FUN1==3){ L1=onoff;tempo=onoff;}//retensão
if(FUN1==4){if(onoff==1)tempo++; if(tempo>tpligado){retardo++;tempo=0;}//loop
if(retardo==1){L1=1;}else L1=0;
if(onoff==0){tempo=0;}
}//fim do loop
if(FUN1==5){if(onoff==1){L1=1;tempo++;}if(tempo>automatico){tempo=0;L1=0;onoff=0;}}//automatico
if(FUN1==6){if(entrada1==0){tempo=1;L1=1;}}
antentrada1 = entrada1;
if(onoff>1){onoff=0;}
if(retardo>1){retardo=0;}
if(digitalRead(esquerda) == LOW) { //pino 26
if(FUN1==0){
if(tempo<tpligar){tempo++;}
if(tpligar == tempo){L1=1;}
}
if(FUN1==1){//delay para desligar
if(tempo<tpdesligar){tempo++;}
if(tpdesligar == tempo){L1=0;}else{L1=1;}
}
}else {if(FUN1 !=3 && FUN1 !=4 && FUN1 !=5){tempo = 0;}}
}
}///########### FIM DA FUNÇÃO CLP #################