Hola, espero que estén pasando un buen día. Hace poco creé el tema Duda Botón: Hacer que un programa cambie al pulsar botón [SOLUCIONADO] - Proyectos - Arduino Forum en el que tenía un problema con un botón que al final solucioné con el código que subí en el último post. Tenía un programa funcional que mostraba la temperatura en ºC o en K según tocara el botón, pero tenía el problema del rebote, pulsaba el botón y cambiaba 3 ó 4 veces.
Hoy, después de informarme un poco he probado a intentar arreglar el problema del rebote con un condensador y un disparador Schmitt, pero al no tener idea de que es al menos el disparador (no acabo de comprender que hago) lo he hecho copiando un esquema que he encontrado en Google, y aquí empieza el problema. El programa que tengo hoy no tiene rebotes, si pulso muestra la temperatura en ºC y si vuelvo a pulsar en K, pero la muestra fija, si quiero que cambie tengo que dejar pulsado el botón. Es decir, antes miraba la pantalla y la veía bailando "23,85-23,89-23,92-23,90..." pulsaba y lo mismo en K, ahora muestra una única temperatura, la que haya al pulsar el botón.
El esquema que he seguido y lo que he hecho son las imágenes adjuntas (en vez de una bombilla RGB un termistor), el programa es:
//Librerías
#include <FastIO.h>
#include <I2CIO.h>
#include <LCD.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal_SR.h>
#include <LiquidCrystal_SR2W.h>
#include <LiquidCrystal_SR3W.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#include <Wire.h>
//Asignación de variables.
//BOTÓN
int boton=2; //Donde conecto el botón (2 ó 3).
bool eboton=1; //Flag Estado del Botón (ºC=1;K=0).
bool flag=0; //Flag reinicio de pantalla.
//TERMISTOR
int sensorPin = A0; //Sensor del que leo el termistor.
int valorsensor; //Valor bruto que lee el sensor (0-1023).
float voltaje; //Voltaje que llega al sensor que lee.
float r1; //R Termistor.
int r2=9800; //R conocida.
float a=-30.36;
float b=232.94; //Parámetros T=a·ln(R)+b .
float temp; //Temperatura que lee el termistor.
float temp2; //Temp auxiliar para la pantalla.
/*************Comienzo del programa*************/
void setup() {
lcd.begin(16,2);
pinMode(boton,INPUT);
Serial.begin(57600); //¿Necesario?
attachInterrupt(0,Inter,LOW); //Interrupción elegante.
}
void loop() {
while (eboton==0) { //Temperatura en K
if (flag==0){
lcd.clear();
flag=1;
}
temp=md()+273.15;
lcdpr();
lcd.print(temp);
lcd.setCursor(13,1);
lcd.print("K");
delay(500);
}
while (eboton==1) { //Temperatura en ºC
if (flag==0){
lcd.clear();
flag=1;
}
temp=md();
lcdpr();
lcd.print(temp);
lcd.setCursor(12,1);
lcd.print("C");
delay(500);
//Si cambio el número de cifras en la pantalla la reinicio.
if ((temp>100 && temp2<=100)||(temp<100 && temp2>=100)){
lcd.clear();
lcdpr();
}
if ((temp>10 && temp2<=10)||(temp<10 && temp2>=10)){
lcd.clear();
lcdpr();
}
lcd.setCursor(6,1);
lcd.print(temp);
lcd.setCursor(12,1);
lcd.print("C");
temp2=temp;
}
}
/**********Funciones**********/
float tem(int vs) { //Función para el cálculo de la Tª
voltaje=(vs*5);
voltaje=voltaje/1023; //Calcula el voltaje
r1=r2*(5-voltaje)/voltaje; //Calcula la resistencia
temp=log(r1);
temp=a*temp;
temp=temp+b;
return temp;
}
float md() { //Función para la media de 10 muestras
float suma=0;
float media=0;
int i=0;
for (i=0;i<10;i++) {
suma=suma+tem(analogRead(sensorPin));
}
media=suma/10;
return media;
}
void lcdpr() { //Función imprimir "La temperatura\n es de".
lcd.setCursor(0,0);
lcd.print("La temperatura");
lcd.setCursor(0,1);
lcd.print("es de ");
lcd.setCursor(6,1);
}
void Inter(){ //Función interrupción.
eboton=!eboton;
flag=0;
}
Adjunto una tercera imagen de que muestra el programa si le pido que muestre la temperatura por consola. Hace eso sin pulsar yo el botón.
No me deja subir esta imagen: http://i.imgur.com/W1mVj3e.jpg
Un saludo y gracias por todo.
PD: Cables rojos->Alimentación (5V)
C. negros->Masa
C. blancos-> Conectados a Arduino para dar u obtener información.
C. amarillos->Movimiento de aquí a allá por la protoboard
MODIFICACIÓN:
En primer lugar pido disculpas, prometo que llevaba ya tiempo y no podía sacarle punta a esto y justo ahora de casualidad lo he resuelto. He cambiado
attachInterrupt(0,Inter,LOW);
por
attachInterrupt(0,Inter,FALLING);
Me gustaría dejar un día o dos antes de indicar que está solucionado porque sólo funciona en ese modo y no entiendo porque. Hasta donde veo en todos sitios al tocar un botón se dan los 4 estados: LOW, RISING, FALLING y CHANGE (este último "funciona", cambia dos veces y da cambios de Tª continua).
De nuevo lo siento pero no se me había ocurrido algo tan básico como cambiar eso en lugar de seguir un consejo como los burros. Si alguien pudiera explicarme (o indicarme algún error) se lo agradezco mucho.

