/****************************Referências******************************************
https://blog.wjcomponentes.com.br/2022/04/08/contador-com-botao-no-arduino-uno/
https://www.robocore.net/tutoriais/primeiros-passos-rtc-ds1307-com-arduino
*******************************************************************************/
//Inclui as bibliotecas
#include <Wire.h>
#include "RTClib.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Preferences.h>
Preferences pref;
RTC_DS3231 rtc; //Objeto rtc da classe DS3132
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire, -1);
char daysOfTheWeek[7][12] = {"Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab"}; //Dias da semana
bool s_high;
int pinosensor = 19;
int valor_sensor; // Armazena o valor lido pelo sensor optico
int h_cont; // Variável para armazenar a hora da contagem
int cont; // Variável para armazenar a contagem atual
int cont_ant; // Variável para armazenar a contagem anterior
unsigned long startTime = 0;
unsigned long endTime = 0;
unsigned long downtime = 0;
unsigned long totalOffTime = 0; // Total de tempo em que o sensor ficou desligado
const unsigned long threshold = 3000; // Tempo mínimo para considerar como "desligado" (em milissegundos)
void setup () {
Serial.begin(9600); //Inicializa a comunicacao serial
pinMode(pinosensor, INPUT); // Configura o pino como INPUT
pref.begin("h_contador", false);
pref.begin("contador", false);
pref.begin("contador_ant", false);
cont = pref.getInt("contador", 0);
cont_ant = pref.getInt("contador_ant", 0);
h_cont = pref.getInt("h_contador", 0);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Inicia Display Oled
display.clearDisplay(); // Limpa o display
#ifndef ESP8266
while (!Serial); // wait for serial port to connect. Needed for native USB
#endif
if (! rtc.begin()) { //Se o RTC nao for inicializado, faz
Serial.println("RTC NAO INICIALIZADO"); //Imprime o texto
display.setTextSize(1); //Defina o tamanho da fonte usando a função setTextSize();
display.setTextColor(WHITE); //Defina a cor da fonte com setTextColor().O parâmetro WHITE define fonte branca e fundo preto;
display.setCursor(0, 10); //Defina a posição onde o texto começa usando setCursor(x,y). O parâmetro x (em pixels) é a posição na largura do display que o texto inicia. O parâmetro y (em pixels) define a posição na altura que o texto inicial.
display.print("RTC NAO INICIALIZADO"); //Você pode enviar o texto para o display usando print();
display.display(); //você precisa usar a função display() para realmente exibir o texto na tela.
while (1) delay(10); //Trava o programa
}
if (rtc.lostPower()) {
Serial.println("O RTC perdeu energia, vamos acertar a hora!");
// Quando for necessário acertar a hora em um novo dispositivo ou após uma queda de energia, o
// a linha a seguir define o RTC para a data e hora em que este esboço foi compilado
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
delay(100); // 100 Milissegundos
}
}
void loop() {
DateTime now = rtc.now(); // Faz a leitura de dados de data e hora
// Vamos ler o estado do nosso sensor
valor_sensor = digitalRead(pinosensor);
if (valor_sensor == 0) {
startTime = millis();
}
if (valor_sensor == 1) { // Algum objeto passou por ele
s_high = 1;
endTime = millis();
downtime = endTime - startTime;
}
// Quando o sensor passar por ele conta +1
if (!valor_sensor && s_high) {
s_high = 0;
cont++; // Incrementa o valor do contador
pref.putInt("contador", cont); // Salva cont no espaço contador
Serial.print(F("Contador: ")); // Imprime a quantidade de cont na Serial
Serial.println(cont);
}
if (downtime >= threshold) {
totalOffTime += downtime;
Serial.print("DownTime: ");
Serial.print(downtime / 1000);
Serial.println(" segundos.");
Serial.print("TotalOffTime: ");
Serial.print(totalOffTime / 60000);
Serial.println(" minutos.");
}
if (h_cont != now.minute()) { // Compara a hora do h-cont com a hora do RTC, até virar a hora
cont_ant = cont; // Salva o valor contado na hora anterior em Cont_ant
pref.putInt("contador_ant", cont_ant); // Salva cont_ant no espaço contador_ant
Serial.print("Tempo anterior: "); // Imprime o h_cont como hora anterior
Serial.print(h_cont);
Serial.print("N moldes anterior; ");
cont = 0;
pref.putInt("contador", cont); // Salva cont no espaço contador
h_cont = now.minute(); // Atualiza h_cont com a hora atual
pref.putInt("h_contador", h_cont);
Serial.print("Tempo atual: "); // Imprime o h_cont como hora atual
Serial.println(h_cont);
}
display.clearDisplay();
display.fillRect(0, 0, 128, 14, WHITE);
display.setTextSize(1); //Defina o tamanho da fonte usando a função setTextSize();
display.setTextColor(BLACK, WHITE); //Defina a cor da fonte com setTextColor().O parâmetro WHITE define fonte branca e fundo preto;
display.setCursor(26, 3); //Defina a posição onde o texto começa usando setCursor(x,y). O parâmetro x (em pixels) é a posição na largura do display que o texto inicia. O parâmetro y (em pixels) define a posição na altura que o texto inicial.
display.print("Bausch + Lomb");
display.setTextSize(1); //Defina o tamanho da fonte usando a função setTextSize();
display.setTextColor(WHITE); //Defina a cor da fonte com setTextColor().O parâmetro WHITE define fonte branca e fundo preto;
display.setCursor(9, 16);
display.print("Contador de moldes");
display.setCursor(5, 27); //Defina a posição onde o texto começa usando setCursor(x,y). O parâmetro x (em pixels) é a posição na largura do display que o texto inicia. O parâmetro y (em pixels) define a posição na altura que o texto inicial.
display.print(daysOfTheWeek[now.dayOfTheWeek()]);
display.print(" ");
if (now.day() < 10) {
display.print("0");
}
display.print(now.day());
display.print('/');
if (now.month() < 10) {
display.print("0");
}
display.print(now.month());
display.print('/');
display.print(now.year());
display.print(" ");
if (now.hour() < 10) {
display.print("0");
}
display.print(now.hour());
display.print(":");
if (now.minute() < 10) {
display.print("0");
}
display.print(now.minute());
display.setCursor(1, 39);
display.print("Hora atual:");
if (cont < 10) {
display.print("00");
}
if (cont > 9 && cont < 100) {
display.print("0");
}
display.print(cont);
display.print(" Pda:");
display.print(totalOffTime / 6000);
display.setCursor(1, 53);
display.print("Hora anter:");
if (cont_ant < 10) {
display.print("00");
}
if (cont_ant > 9 && cont_ant < 100) {
display.print("0");
}
display.print(cont_ant);
display.print(" Pda:");
display.print(downtime);
display.display();
}