Ciao a tutti, essendo un principiante ed avendo tempi ristretti, mi trovo nella situazione di chiedere un vostro aiuto...
Devo fare un progetto utile ad un esame per l'università, ma mi sono bloccato poichè non riesco a capire l'errore nel programma :~.
I componenti che devo usare sono:
Arduino uno;
sensore termico LM35;
un microservo;
un LCD 16x2;
un pulsantino (per l'accensione e spegnimento);
un buzzer;
3 led(rosso, giallo e verde).
Il mio scopo è quello di avere un termostato in cui la temperatura viene visualizzata sull' LCD;
a determinate temperature vengono attivati differenti sottoprogrammi:
temperatura ottimale: led verde;
temperatura critica: led giallo ad intermittenza;
superata la temperatura critica: led rosso ad intermittenza, servo e buzzer.
Ecco il programma.
#include <LiquidCrystal.h>
#include <Servo.h>
#define BUTTON 1
#define LM35 2
#define D4 3
#define D5 4
#define D6 5
#define D7 6
#define RS 7
#define EN 8
#define SERVO 9
#define BUZZER 10
#define LEDRED 11
#define LEDYELLOW 12
#define LEDGREEN 13
float vref = 1.1;
LiquidCrystal lcd( D4, D5, D6, D7, RS, EN );
Servo myservo;
int val = 0;
int vecchio_val = 0;
int stato = 0;
int pos = 0;
int fascia;
int valore;
void setup() {
pinMode( BUTTON, INPUT);
pinMode( LM35, INPUT );
pinMode( LEDGREEN, OUTPUT);
analogReference( INTERNAL );
analogRead( LM35 );
lcd.begin( 2, 16 );
pinMode( LEDYELLOW, OUTPUT );
pinMode( LEDRED, OUTPUT );
pinMode( BUZZER, OUTPUT );
myservo.attach ( 9 );
}
void loop(void) {
val = digitalRead(BUTTON);
if ((val = HIGH) && (vecchio_val == LOW)) {
stato = 1 - stato;
delay(35);
}
vecchio_val = val;
if (stato == 1) {
lcdLM35(), HIGH;
segnalatoriLM35(), HIGH;
}
else {
lcdLM35(), LOW;
segnalatoriLM35(), LOW;
}
void lcdLM35()
{
float temp = readTemp());
sendTempToLCD( temp );
}
float readTemp()
{
float temp = 0.0;
int val = 0;
int nread = 5;
float somma = 0.0;
for (int i=0; i<nread; i++)
{
val = analogRead( LM35 );
temp = ( 100.0 * vref * val ) / 1024.0;
somma += temp;
}
return ( somma / nread );
}
void sendTempToLCD( float temp )
{
lcd.clear();
lcd.setCursor( 0, 0 );
lcd.print( "Temperatura di: ");
lcd.setCursor( 0, 1 );
lcd.print( temp );
lcd.print( ' ' );
lcd.print( (char) 223 );
lcd.print( 'C' );
delay( 250 );
}
void segnalatoriLM35()
{
valore=analogRead(LM35);
fascia=map(valore, 0, 1023, 0, 3);
if (fascia==0) fascia=1;
spegni();
digitalWrite(14-fascia, HIGH);
delay(500);
}
void spegni() {
digitalWrite(LEDGREEN,LOW);
digitalWrite(ledyellow(),LOW);
digitalWrite(allarme(),LOW);
}
void ledyellow() {
digitalWrite( LEDYELLOW, HIGH);
delay(1000);
digitalWrite( LEDYELLOW, LOW);
delay(1000);
}
void allarme() {
digitalWrite({ledred()}, HIGH);
digitalWrite({servo()}, HIGH);
digitalWrite({buzzer()}, HIGH);
}
void ledred() {
digitalWrite(LEDRED, HIGH);
delay(500);
digitalWrite(LEDRED, LOW);
delay(500);
}
void servo() {
for(pos = 0; pos < 180; pos +=1)
{
myservo.write(pos);
delay(15);
}
for(pos = 180 ;pos >= 1; pos -=1)
{
myservo.write(pos);
delay(15);
}
}
void buzzer()
{
buzz(BUZZER, 4186, 100);
delay(10);
}
void buzz(int targetPin, long frequency, long length)
{
long delayValue = 1000000/frequency/BUZZER;
long numCycles = frequency * length/ 1000;
for (long p=0; p < numCycles; p++)
{
digitalWrite(BUZZER,HIGH);
delayMicroseconds(delayValue);
digitalWrite(BUZZER,LOW);
delayMicroseconds(delayValue);
}
}
P.S.
nelle temperature deve essere presente un range,
il led verde deve essere acceso tra 0 e 20°C;
il led giallo invece tra 21°C e 30°C;
il led rosso, buzzer e microservo, infine, dai 31°C in poi.
Grazie in anticipo per l'aiuto