Hola que tal, pues resulta que me salio un pequeño projecto... muy sencillo
se trata solamente de un termostato con una temperatura de inicio y una final.
Ademas tenemos un sensor de humedad y lo imprimimos todo en la LCD...
La idea basica era usar una libreria pero resulta que me cuesta mucho trabajo y no tengo de momento soporte, hablo de MENWIZ que es una maravilla, mas por desconocimiento no puedo hacer que trabaje como yo quiero.
Asi que me pregunte si puedo poner dos potenciomentros analogicos como limite inferior y superior respectivamente (tiene la ventaja que es mas sencillo para el usuario)
Idea general; la lcd imprime la temperatura en F y C ademas de la humedad.
Al mover un potenciometro la lcd cambia mostrado la nueva temperatura de incio o de final dependiendo de que potenciomentro se haya movido...
Ya tengo funcionando los sensores, ya imprimen la temperatura y humedad, solo me falta el ajuste, asi que si alguien me puede ayudar un poco se los agradeceria.
Intentaba hacer algo como;
leer_sensores// en relidad potenciomentros no lo he arreglado
↓
si lectura actual =! anterior → Pantalla ajuste temp
↓
si no pantalla_normal();
Por algun motivo(sospecho que no hay un debounce adecuado)
se imprime la pantalla de ajuste de temperatura.
Bueno, les dejo el codigo;
#include <Wire.h>
#include <OneWire.h>
#include <dht.h> //Libreria para DTH
#include <DallasTemperature.h> //Libreria Ds1820
#include <LiquidCrystal_I2C.h> //Libreria IC2
dht DHT; //constructor del objeto
#define DHT11_PIN 5 // Pin sensor DTH
#define ONE_WIRE_BUS 2 //Pin Sensor temperatura
OneWire oneWire(ONE_WIRE_BUS); //define un bus para comunicarse con cualquier sensor
DallasTemperature sensors(&oneWire); // Pass our oneWire reference to Dallas Temperature.
DeviceAddress insideThermometer; // arrays to hold device address
//Constructor objeto LCD
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
//----------------------------------Variables Globlales ------------------------------------------//
int humedad = 0; //lectura del sensor de humedad
float tempC = 0; //lectura del termomentro
float tempF = 0; //en farenheit
float tempInicoSet = 0; //variable para incial calefaccion
float tempFinalSet = 0; //variable para terminar calefaccion
byte AR_inc =0; //Analog read Incio
byte AR_fin =0; //Analog read final
float tempInicoAnt= 0;
float tempFinalAnt= 0;
////////////////////////////////////VOID SET UP///////////////////////////////////////////////////////
void setup(void)
{
pinMode(A0, INPUT);
pinMode(A1, INPUT);
Serial.begin(9600);
lcd.begin(16,2);
//-----------------------------------SENSOR DS1820-------------------------------------------------//
// locate devices on the bus
sensors.begin();
Serial.print(sensors.getDeviceCount(), DEC);
//Linea para debug
if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
Serial.print("Device 0 Address: ");
//Funcion para imprimir la direccion del dispositivo --printAddress(insideThermometer);
// set the resolution to 9 bit (Each Dallas/Maxim device is capable of several different resolutions)
sensors.setResolution(insideThermometer, 10);
//--------------------------------SENSOR DTH-------------------------------------------------------//
Serial.println("DHT TEST PROGRAM ");
Serial.println();
Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
lcd.setCursor(0,0); //Start at character 4 on line 0
lcd.print(" SANHER");
lcd.setCursor(0,1);
lcd.print(" INGENIEROS");
delay(4000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" 10/01/2015");
delay(2000);
lcd.clear();
}
void loop(void){
lee_sensores();
if(tempInicoSet =! tempInicoAnt){
cambioTempIncio(); }
if(tempFinalSet =! tempFinalAnt){
cambioTempFinal(); }
// READ DATA
Serial.print("DHT11, \t");
int chk = DHT.read11(DHT11_PIN);
switch (chk)
{
case DHTLIB_OK:
Serial.print("OK,\t");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.print("Checksum error,\t");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.print("Time out error,\t");
break;
default:
Serial.print("Unknown error,\t");
break;
}
//PRINT DATA
humedad = (DHT.humidity);
Serial.print(humedad);
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
sensors.requestTemperatures(); // Send the command to get temperatures
// It responds almost immediately. Let's print out the data
printTemperature(insideThermometer); // Use a simple function to print out the data
if (humedad < 40){
alarma_humedad();}
//if (tempC < 25)
// alarma_bajatemp();
pantallaNormal();
Serial.print("Analog read 1 ="); Serial.println(AR_inc);
Serial.print("Analog read 2 ="); Serial.println(AR_fin);
Serial.print(" Temp Incio = "); Serial.println(tempInicoSet);
Serial.print(" Temp final = "); Serial.println(tempFinalSet);
Serial.println("----------------------");
}
//---------------------------FUNCIONES AUXILIARES ------------------------------------//
// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
tempC = sensors.getTempC(deviceAddress);
tempF = DallasTemperature::toFahrenheit(tempC); // Converts tempC to Fahrenheit
Serial.print("Temp C: ");
Serial.print(tempC);
Serial.print(" Temp F: ");
Serial.println(tempF);
}
void pantallaNormal(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(tempC);
lcd.setCursor(0,1);
lcd.print(tempF);
lcd.setCursor(6,0);
lcd.print("C");
lcd.setCursor(6,1);
lcd.print("F");
lcd.setCursor(9,0);
lcd.print("HUMEDAD");
lcd.setCursor(11,1);
lcd.print(humedad);
}
void lee_sensores(){
AR_inc = analogRead(A0);
AR_fin = analogRead(A1);
tempInicoSet = map(AR_inc,0, 254, 19, 51);
tempFinalSet = map(AR_fin,0, 254, 19, 51);
}
void cambioTempIncio(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Temp Inic");
lcd.setCursor(0,1);
lcd.print(tempInicoSet);
tempInicoSet = tempInicoAnt;
}
void cambioTempFinal(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Temp Final");
lcd.setCursor(0,1);
lcd.print(tempFinalSet);
tempFinalSet =tempFinalAnt; }
void alarma_humedad(){
lcd. clear();
lcd.setCursor(0,0);
lcd.print(" BAJA");
lcd.setCursor(0,1);
lcd.print(" HUMEDAD");
delay(3000); }
void alarma_bajatemp(){
lcd. clear();
lcd.setCursor(0,0);
lcd.print(" BAJA");
lcd.setCursor(0,1);
lcd.print(" TEMPERATURA");
delay(3000); }
Esta un poco sucio todavia, pero no lo he terminado espero se pueda entender...
Abajo esta la alarma por temperatura ... en lugar de un valor fijo... se contrastara contra el limite inferior que se lea del potenciometro..
Los potenciometros me dan una lectura analogica entre 0 y 256, es por eso que escogí ese rango en la funcion map...
Como puedo hacer un debounce adecuado?
Sera suficiente algo asi;
primera_lectura
delay(50);
segunda_lectura
if(primera_lectura =! segunda_lectura); ??????
Bueno... de ante mano... Gracias!!!!!
Saludos.
-Alex.