Prima corsa con arduino.
/*
||
|| @file LM35+LCD.ino
|| @version 0.5
|| @author Nardello Matteo
|| @contact nrdmtt@gmail.com
||
|| @description
|| | Simple thermometer based on LM35 and a 16x2 LCD with Min/Max functionality
|| #
||
*/
///////////////////////////////////// LIBRERIE ///////////////////////////////////
#include <LiquidCrystal.h>
#include <TimedAction.h>
#include <Bounce.h>
///////////////////////////////////// DEFINES ///////////////////////////////////
#define Btn_Enter 8 //Pin a cui e' collegato il pulsante
#define Backlight 9 //Pin usato per regolare la retroilluminazione
/////////////////////////////////// TIMEOUTS //////////////////////////////////
TimedAction TO_BlackLight = TimedAction(10000, backlight);
TimedAction TO_ReturnHome = TimedAction(50000, mainpage);
TimedAction TO_Dati = TimedAction (200, dati);
TimedAction TO_Print = TimedAction (2000, Print);
/////////////////////////////////// DEBOUNCE ////////////////////////////////////
Bounce B_Btn_Enter= Bounce(Btn_Enter, 300); //Debounce pulsante enter
/////////////////////////////////// VARIABILI ///////////////////////////////////
int reading = 0, page = 0; // Variabile lettura pin
float V = 0, T = 0, Tmed = 0, Vmed = 0, Min = 80, Max = 0, Ite = 0; // Temperatura e voltaggio rilevati
float Mis[2] = {0 , 0}; // Array letture Temp - Volt
byte cerchio[8] = {B01100, B10010, B10010, B01100, B00000, B00000, B00000, B00000};
///////////////////////////////// DISPLAY /////////////////////////////////////
// LiquidCrystal display with:
// rs on pin 2
// enable on pin 3
// d4, d5, d6, d7 on pins 4, 5, 6, 7
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
////////////////////////////// FUNZIONI PAGINE //////////////////////////////////
void mainpage() //Funzione per la gestione della pagina principale
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Temperatura:");
lcd.setCursor(5, 1);
lcd.print(Tmed);
lcd.setCursor(10, 1);
lcd.write((uint8_t)0);
page = 0;
}
void firstpage() //Funzione per la gestione della pagina Tmax
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temperatura Max");
lcd.setCursor(5, 1);
lcd.print(Max);
lcd.setCursor(10, 1);
lcd.write((uint8_t)0);
}
void secondpage() //Funzione per la gestione della pagina Tmin
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temperatura Min");
lcd.setCursor(5, 1);
lcd.print(Min);
lcd.setCursor(10, 1);
lcd.write((uint8_t)0);
}
//////////////////////////// FUNZIONI TEMPERATRA ///////////////////////////////
void dati() //Funzione che salva in un array la somma di temperatura e tensoni misurate (misurate ogni 200 ms)
{
TO_Dati.reset();
reading = analogRead(0);
V = (reading * 5.0) / 1024;
T = V * 100;
Mis[0] = Mis[0] + T;
Mis[1] = Mis[1] + V;
Ite++;
}
void MAX() //Funzione che calcola la temperatura massima
{
if(Tmed > Max)
{
Max = Tmed;
}
}
void MIN() //Funzione che calcola la temperatura minima
{
if(Tmed < Min)
{
Min = Tmed;
}
}
void Print()
{
Serial.print(page);
Serial.print(" --- ");
}
///////////////////////////// FUNZIONI PROGRAMMA ///////////////////////////////
void OnBTn1() //Funzione gestione pressione bottone
{
switch(page)
{
case 1:
firstpage();
break;
case 2:
secondpage();
break;
case 3:
mainpage();
page=0;
break;
}
}
void backlight() //Funzione che disattila la retroilluminzazione
{
digitalWrite(Backlight, LOW);
}
///////////////////////////// SETUP -- LOOP ///////////////////////////////
void setup()
{
//SERIAL SetUp
Serial.begin(9600);
//LCD SetUp
lcd.begin(16, 2);
lcd.createChar(0, cerchio);
lcd.setCursor(0,0);
lcd.print(" WELCOME");
//PINS SetUp
pinMode(Backlight, OUTPUT);
pinMode(Btn_Enter, INPUT);
digitalWrite(Backlight, HIGH);
}
void loop ()
{
TO_Dati.check();
TO_BlackLight.check();
if(Ite == 10 ) // Ogni dieci misure ne faccio la media, calcola Max-Min e lo stampo sull'LCD
{
Tmed = Mis[0] / 10;
Vmed = Mis[1] / 10;
MIN();
MAX();
if (page == 0)
{
mainpage();
}
Mis[0]=Mis[1]=0;
Ite=0;
}
if(B_Btn_Enter.update() && B_Btn_Enter.read() == HIGH) // Controllo se ho premuto il bottone
{
TO_BlackLight.reset();
TO_ReturnHome.reset();
digitalWrite(Backlight, HIGH);
page++;
OnBTn1();
Print();
}
if (page != 0) // Se non sono sulla home, controllo il timeout per tornarci
{
TO_ReturnHome.check();
}
}
Essendo la mia prima esperienza, mi piacerebbe sentire alcuni pareri e consigli per migliorare il tutto.
Grazie