#include <TinyWireM.h>
#include <TinyOzOLED.h>
#include "avr/interrupt.h";
#include <EEPROM.h>
#include <stdio.h>
float voltaje_entrada;
float voltaje_final;
float resistencia1 = 100000; //Resistencia de 100K
float resistencia2 = 10000; //Resistencia de 10k
int cont3;
int m =9;
volatile int value;
volatile int lastEncoded = 0;
const int boton=10;
const int led=8;
int estadoled=HIGH;
int ultimoestadoboton;
int estadoactualboton;
void energia (){
if(digitalRead(m)==LOW){
cont3++;
delay(1);
if (cont3 >5) {
EEPROM.put(0,value);
delay(50);
cont3 = 0;
}
}
}
void setup()
{
OzOled.init(); // inicia oled
OzOled.clearDisplay(); //limpia pantalla y establece posicion en la izquierda
OzOled.setNormalDisplay(); //display normal
OzOled.sendCommand(0xA1); // orientar oled
OzOled.sendCommand(0xC8);
EEPROM.get(0, value);
pinMode(5, OUTPUT);
pinMode(1, INPUT);
pinMode(2, INPUT);
digitalWrite(1, HIGH);
digitalWrite(2, HIGH);
pinMode(m, INPUT_PULLUP);;
pinMode(led,OUTPUT);
pinMode(boton,INPUT);
digitalWrite(led,HIGH);
estadoactualboton=digitalRead(boton);
/*
* WGM10, WGM12: Fast PWM, 8-bit TOP=255
* CS10: No prescaler
* COM1B1: Pin 5 to LOW on match with OCR1B and to HIGH on TOP
*/
TCCR1A = _BV(COM1B1) | _BV(WGM10);
TCCR1B = _BV(CS10) | _BV(WGM12);
/*
* 50% duty cycle
* 32 kHz with 8MHz CPU clock
*/
OCR1B =value;
PCMSK0 = bit (PCINT1) | bit (PCINT2);
GIMSK = bit (PCIE0);
sei();
}
void duty() {
OCR1B = 255 - value;
}
void loop()
{
energia ();
duty();
ultimoestadoboton=estadoactualboton;
estadoactualboton=digitalRead(boton);
if (ultimoestadoboton==LOW && estadoactualboton==HIGH){
estadoled=!estadoled;
digitalWrite(led,estadoled);
}
voltaje_entrada = (analogRead(7) * 4.95) / 1023; //Lee el voltaje de entrada
voltaje_final = voltaje_entrada / (resistencia2 / (resistencia1 + resistencia2)); //Fórmula del divisor resistivo para el voltaje final
displayOLED();
}
ISR(PCINT0_vect)
{
int MSB = digitalRead(1);
int LSB = digitalRead(2);
int encoded = (MSB << 1) |LSB;
int sum = (lastEncoded << 2) | encoded;
if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011)
value++;
if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000)
value--;
lastEncoded = encoded;
if (value <= 0)
value = 0;
if (value >= 255)
value = 255;
}
void displayOLED() {
char tmp[5];
dtostrf( voltaje_final, 3, 2, tmp);
OzOled.printBigNumber(tmp, 2, 2, 4);
}
bueno funciona todo pero creo que el código no esta bien , ya que en la pantalla muestra puntos raros por todos lados, no se como resolverlo'