#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Button.h>
#include "driver/ledc.h"
#include "RTClib.h"
#include <stdio.h>
#include "esp_err.h"
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define Sensor_Hall 18
#define TIMER LEDC_TIMER_0
#define MODO LEDC_LOW_SPEED_MODE
#define PIN_SALIDA (5)
#define CANAL LEDC_CHANNEL_0
#define RESOLUCION LEDC_TIMER_13_BIT //Resolucion de 13 bits
#define DUTY (4096) //Duty al 50%, para detectar correctamente los pulsos
#define FRECUENCIA (1) //Podremos variarla para modificar la velocidad de los pulsos (bicicleta)
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
RTC_DS1307 RTC;
char days[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
const int radio_rueda = 35; // en centimetros
float velocidad = 0.0; // en km/h
float distancia = 0.0; //en metros
unsigned long t1 = 0;
volatile int numero_pulsos = 0;
volatile int numero_pulsos_5seg = 0;
Button boton_res(35);
void detecta_pulso() {
numero_pulsos++;
}
void calculos() {
if (millis()-t1 > 5000) {
velocidad = ((numero_pulsos-numero_pulsos_5seg)/5.0)*2*PI*(radio_rueda*0.01)*3.6;
t1 += 5000;
numero_pulsos_5seg = numero_pulsos;
}
distancia = 2*PI*(radio_rueda)*0.01*numero_pulsos;
}
static void generacion_pulsos() {
ledc_timer_config_t timer = {
.speed_mode = MODO,
.duty_resolution = RESOLUCION,
.timer_num = TIMER,
.freq_hz = FRECUENCIA,
.clk_cfg = LEDC_AUTO_CLK
};
ESP_ERROR_CHECK(ledc_timer_config(&timer));
ledc_channel_config_t canal = {
.gpio_num = PIN_SALIDA,
.speed_mode = MODO,
.channel = CANAL,
.intr_type = LEDC_INTR_DISABLE,
.timer_sel = TIMER,
.duty = 0,
.hpoint = 0
};
ESP_ERROR_CHECK(ledc_channel_config(&canal));
}
void setup() {
Serial.begin(115200);
if (!RTC.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x64
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
delay(1000);
display.setTextColor(WHITE);
display.clearDisplay();
generacion_pulsos();
ESP_ERROR_CHECK(ledc_set_duty(MODO, CANAL, DUTY));
ESP_ERROR_CHECK(ledc_update_duty(MODO, CANAL));
pinMode(Sensor_Hall, INPUT_PULLUP);
boton_res.begin();
attachInterrupt(digitalPinToInterrupt(Sensor_Hall), detecta_pulso, RISING);
}
void loop() {
calculos();
DateTime london = RTC.now();
DateTime now(london.unixtime() + 3600); // One hour later.
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.print(now.day());
display.print('/');
display.print(now.month());
display.print('/');
display.print(now.year());
display.print('-');
display.println(days[now.dayOfTheWeek()]);
display.println(' ');
display.setCursor(15, 14);
display.setTextSize(2);
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.print(':');
if (now.second() < 10)
display.print('0');
display.println(now.second());
display.setTextSize(1.5);
display.setCursor(0,40);
display.print("Dist:");
display.setCursor(0,50);
display.print(distancia);
display.print(" m");
display.setCursor(60,40);
display.println("Vel:");
display.setCursor(60,50);
display.print(velocidad);
display.print(" km/h");
display.display();
if (boton_res.pressed()) {
distancia = 0.0;
numero_pulsos = 0;
numero_pulsos_5seg = 0;
}
delay(50);
}