Si no las trae el módulo, sí, agregalas.
Te recomiendo que sean de 4k7.
Saludos
#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'
Y comienza con un código de letras que salga bien y luego ve comparando.
Es ruido, puse capacitorores y mejoro, pero todavía hay fallas ya se por donde buscar, gracias
Prueba acortando las cables si te es posible.
consulta, como se usa esta linea de codigo oled.bitmap(0, 0,120,60,imagen);que se pone para una imagen de 100x60 ?
Busca los ejemplos yo siempre me respondo de ese modo.
Pero observa que tienes X0, Y0 y X1,Y1 lo que plantea un marco donde poner la imagen contenida en un array de bytes llamado imagen.
La librería lo debe indicar pero no lo hacer pq no tiene ejemplos.
La librería TinyOzOLED.h plantea las cosas al revés asi que no se a que líbrería te refieres
Mira lo que dice la librería
void OzOLED::drawBitmap(const byte *bitmaparray, byte X, byte Y, byte width, byte height){
Ya veo que hablas de Tiny4kOLED.h pero en tu último código no la usas por eso mi consulta anterior.
Debes darnos siempre un marco de consulta porque no estamos a tu lado y respondemos muchas preguntas y obviamente se nos pierden datos.
Como dije, tiene un ejemplo
Simplemente míralo y quedará claro.
// The display will show two bitmaps,
// one of SOLOMON SYSTECH's logo
// one of the text SOLOMON SYSTECH
// The logo bitmap is 37 pixels wide
// The text bitmap is 69 pixels wide
// Both are 32 pixels (4 pages) high
oled.bitmap(6, 0, 6 + 37, 4, solomon_systech_logo_bitmap);
oled.bitmap(54, 0, 54 + 69, 4, solomon_systech_text_bitmap);
Tenes razón, a veces uno cree que todos están viendo lo que sea hace!
si uso Tiny4kOLED me resulto mas estable que la otra libreria si estoy tratando de entender
oled.bitmap(0, 0, 128, 4, logo_me); pero me muestra bien la mitad del lcd si pongo 8 en lugar de 4 ya no muestra nada poer eso estoy re mareado con esto
Corriste el ejemplo que te sugerí?
Debes prestar atención a dicho ejemplo
El último dígito no tendría que estar, no se como limpiarlo de la pantalla!
El ultimo digito es porque presentas números sin tener en cuenta la posición, para ello te recomiendo siempre presentar números con sprintf(buffer, "formato de presentación", variable)
El problema es que con arduinos pequeños incluso como el UNO/NANO esta desactivado el manejo de floats con sprintf por lo que debes convertir a cadena de char.
Te dejo un tutorial
https://programarfacil.com/blog/arduino-blog/conversion-de-numeros-a-cadenas-en-arduino/
Si usaras otro IDE como el VSCode hay otro modo de hacerlo mucho mas elegante pero no si si estara soportado por el ATtiny.
En VSCode puedes indicarle al compilador que use la librería que permita imprimir los floats.
Aclaro, que una vez leí un hilo donde un SUeco o Noruego hacía lo mismo con el IDE pero no pude repetirlo y luego desistí al encontrar la solución con el VSCode.
yo uso esta funcion en el oled , como lo haria ?
void displayOLED() {
char tmp[4];
dtostrf( voltaje_final, 4, 3, tmp);
oled.setFont (FONT16X32DIGITS);
oled.setCursor(30,10);
oled.print( voltaje_final);
}
Esta incompleto.
Primero terminas enviado al oled la misma variable voltaje_final y debia ser justamente la que has convertido a char o sea tmp
void displayOLED() {
char tmp[4], buffer[10];
oled.setFont (FONT16X32DIGITS);
dtostrf( voltaje_final, 4, 3, tmp);
sprintf(buffer,"%4s", tmp);
oled.setCursor(30,10);
oled.print( buffer);
}
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.


