Go Down

Topic: Problemi sul software per un progetto! (Read 5 times) previous topic - next topic

acca90

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.

Code: [Select]

#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  :smiley-surprise:

tonid

Ma qual'è il problema di fondo?
Dov'è che ti sei bloccato,cosa non capisci?
Se tu esponessi più informazioni sarebbe più semplice poterti aiutare  :)

acca90

Quando vado a fare la verifica mi da degli errori nei sottoprogrammi...e non riesco a capire il motivo.
Visto che non riesco a finire il programma, non posso nemmeno provare se funziona come io voglio.
precisamente questo:

progetto.ino: In function 'void loop()':
progetto:63: error: a function-definition is not allowed here before '{' token
progetto:70: error: a function-definition is not allowed here before '{' token
progetto:165: error: expected `}' at end of input

tonid

Ti manca semplicemente una parentesi graffa di chiusura del loop
Code: [Select]
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;
  }
} LA DEVI INSERIRE QUI
 

Brunello

e comunque ci sono un sacco di errori

l'assegnazione dei pin LCd e' errata
LiquidCrystal lcd( D4, D5, D6, D7, RS, EN );
quella corretta e'  LiquidCrystal lcd( RS, EN, D4, D5, D6, D7 );

l'LM35 lo hai collegato a un input digitale ( Pin 2 )
dato che devi leggere un valore analogico, va' usato su una porta da A0 a A5

in lcd.begin( 2, 16 );
prima si mette il numero dei caratteri e poi le righe.  lcd.begin( 16 , 2 );

e poi chissa' cosa hai combinato


Go Up