due lm35 comandano un servomotore

Buongiorno, stò iniziando ad usare Arduino Uno per poi passare ad Arduino Mega 2560, vedendo gli esempi pubblicati su internet sto imparando a capire la programmazione. Tra qualche copia incolla e qualche modifica cerco di imparare il linguaggio. Ho qualche conoscenza base in elettronica e Arduino è quasi a caso mio.
Il primo problema è che il servomotore non si muove, in pratica deve andare da 0 a 180°
L'altro problema è che quando mi soffermo alla posizione del menù dove mi fà visualizzare lo stato della botola aperta/chiusa non riesco ad andare ne avanti ne indietro.
La funzione del led che mi fa vedere lo stato delle botole, lo devo ricopiare in tutti i punti del menù per vedere la posizione aperto/chiuso? C'è un'alternativa? L'errore dov'è?
Per mancanza di spazio in questo messaggio, taglio il menù

P.S.
E' facile che nello skech sia rimasto qualche residuo di comando di qualche altra prova fatta in precedenza.

Grazie per l'attenzione.

#define butUp 12    
#define butDown   11    
#define butP 10      

#define LampRed   13     
#define LampRed2         1  
#define LampRed3         5  
#define LampGreen        6  
#define LampRele         8   
#define LampRele2        7  
#define PhotoSensor     A0
#define PhotoSensor     A1 
#define PhotoSensor     A2 
#include <Servo.h>
Servo myServo;          
int pos = 0;

//Funzioni dei vari cicli 
void changeMenu();
void dispMenu();
void mostraMsg();
void controlLed();
void controlLed2();
void controlRele();
void temperatura();
void temperatura2();
void temperatura3();
void controlRele2();
void controlBotola();

//Variabili globali
char menu = 0x01;
char set1 = 0x00, set2 = 0x00 , set3 = 0x00;
boolean t_butUp, t_butDown, t_butP, t_butM;

int relay2 =7;
int relay =8;
int sensorValue = 0;
int reading = 0;
int sensorPin = A0;
int sensorValue2 = 0;
int reading2 = 0;
int sensorPin2 = A1;
int sensorValue3 = 0;
int reading3 = 0;
int sensorPin3 = A2;
int angle = 0;
const int pinServo = 9;
const float baseline_Temp = 20;

//DISPLAY Mappa Hardware
#include <OneWire.h>
#include <Wire.h>   
#include <LiquidCrystal_I2C.h> 
const int servoMin = 165; 
const int servoMax = -30; 
Servo myservo

LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

void setup() {
  
   {
  myservo.attach(9);
}
  lcd.begin(16, 2);
  for (char i=9; i<13; i++){
    
   pinMode(i, INPUT_PULLUP);
    
  }
  pinMode(3,OUTPUT);  
  pinMode(LampRed, OUTPUT);
  pinMode(LampRed2, OUTPUT); 
  pinMode(LampRed3, OUTPUT);
  pinMode(LampGreen, OUTPUT);
  pinMode(LampRele, OUTPUT); 
  pinMode(relay,OUTPUT);       
  digitalWrite (LampRele, HIGH);   
  
  t_butUp = 0x00; //Inizializza le variabili come ZERO
  t_butDown     = 0x00;
  t_butP = 0x00;
  t_butM = 0x00;
  

}

void loop() {
  
  
  changeMenu();
  
  dispMenu();
  
  
}


//Funzioni

void changeMenu(){
  
  if(digitalRead(butUp) == 0x00){ //Setta la variabile in 1 se si preme il pulsante UP
    
    t_butUp = 0x01;
    
  }
  
   if(digitalRead(butDown) == 0x00){ //Setta la variabile in 1 se si preme il pulsante DOWN
    
    t_butDown = 0x01;
    
  }
  
  if(digitalRead(butUp) && t_butUp){
    
    t_butUp = 0x00;
    
    lcd.clear();    
    
    menu++;
     
    if(menu > 0x09){
      
      menu = 0x01;
    }
  }
  
  if(digitalRead(butDown) && t_butDown){
    
    t_butDown = 0x00;
    
    lcd.clear();
    
    menu--;
     
    if(menu < 0x01){
      
      menu = 0x09;
    }
  }    
  
}



void dispMenu(){
  
  switch(menu){
    
    case 0x01:
        controlLed();
     break;
    case 0x02:
     controlLed2();          
     break;
    case 0x03:
     temperatura();
     break;
    case 0x04:
     temperatura2();
     break;
    case 0x05:
     temperatura3();            
     break;
    case 0x06:
     controlRele2();            
     break;
    case 0x07:
        controlRele();       
        break;
    case 0x08:
        controlBotola();         
        break;
    
  }
}

                         
void controlLed(){
 
  lcd.setCursor(0,0);
  lcd.print("ACCENSIONE LED 1");
  
  if(digitalRead(butP) == 0x00){
   
    t_butP = 0x01;
    
  }
  
  if(digitalRead(butM) == 0x00){
   
    t_butM = 0x01;
    
  }
  
  if(digitalRead(butP) && t_butP){
    
    t_butP = 0x00;
    set1++;

    
    if(set1 > 2){
      
      set1 = 0x01;
    }
    
    switch(set1){
      
      case 0x01:
       lcd.clear();
        lcd.setCursor(0,1);
       digitalWrite (LampRed, HIGH);
        lcd.print("LED ROSSO ON");
       break;
      case 0x02:
        lcd.clear();
        lcd.setCursor(0,1);
       digitalWrite (LampRed, LOW);  
        lcd.print("LED ROSSO OFF");
      break;
    }
  }
}



                         
void controlLed2(){
 
  
  lcd.setCursor(0,0);
  lcd.print("ACCENSIONE LED 2");
  
  if(digitalRead(butP) == 0x00){
   
    t_butP = 0x01;
    
  }
  
  if(digitalRead(butM) == 0x00){
   
    t_butM = 0x01;
    
  }
  
  if(digitalRead(butP) && t_butP){
    
    t_butP = 0x00;
    set3++;

    
    if(set3 > 2){
      
      set3 = 0x01;
    }
    
    switch(set3){
      
      case 0x01:
        lcd.clear();
        lcd.setCursor(0,1);
        digitalWrite (LampRed2, HIGH);
        lcd.print("LED VERDE ON");
        break;
      case 0x02:
        lcd.clear();
        lcd.setCursor(0,1);
        digitalWrite (LampRed2, LOW);
        lcd.print("LED VERDE OFF");
      break;
    }
  }
}


void temperatura(){
  reading = analogRead(sensorPin);
  int celsius = reading/2;
  lcd.setCursor(0, 0);
  lcd.print("Temp interna "); 
  lcd.setCursor(0,1);
  lcd.print(celsius, DEC);
  lcd.print((char)223);
  lcd.print("C");
} 
void temperatura2(){
  reading = analogRead(sensorPin2);
  int celsius2 = reading/2;
  lcd.setCursor(0, 0);
  lcd.print("Temp esterna "); 
  lcd.setCursor(0,1);
  lcd.print(celsius2, DEC);
  lcd.print((char)223);
  lcd.print("C");
  
}
void temperatura3(){
  reading = analogRead(sensorPin3);
  int celsius3 = reading/2;
  lcd.setCursor(0, 0);
  lcd.print("Temp sotto tetto"); 
  lcd.setCursor(0,1);
  lcd.print(celsius3, DEC);
  lcd.print((char)223);
  lcd.print("C");

}
  
void controlRele2(){
reading = analogRead(sensorPin2);
  int celsius = reading/2;
  lcd.setCursor(0, 0);
  lcd.print("Temperatura: "); 
  lcd.setCursor(0,1);
  lcd.print(celsius, DEC);
  lcd.print((char)223);
  lcd.print("C");
  
  if (celsius >25) { 
    //modificare la temperatura desiderata, 
    //inserire > se attivo superiore a 28C°
    //e < se attivo inferiore a 25C°
    
    digitalWrite(7,HIGH);
     lcd.print("    ON");
  } else {
    digitalWrite(7,LOW);
    lcd.print("   OFF");
  }
  delay(500);
  lcd.clear();
}

                        
void controlRele(){
  
    
  lcd.setCursor(0,0);
  lcd.print("RELE");
  
  if(digitalRead(butP) == 0x00){
   
    t_butP = 0x01;
    
  }
  
  if(digitalRead(butM) == 0x00){
   
    t_butM = 0x01;
    
  }
  
  if(digitalRead(butP) && t_butP){
    
    t_butP = 0x00;
    set2++;

    
    if(set2 > 2){
      
      set2 = 0x01;
    }
    
    switch(set2){
      
      case 0x01:
       lcd.clear();
        lcd.setCursor(0,1);
       digitalWrite (LampRele, LOW);
        lcd.print("RELE ON");
       break;
      case 0x02:
        lcd.clear();
        lcd.setCursor(0,1);
       digitalWrite (LampRele, HIGH);
        lcd.print("RELE OFF");
      break;
    }
  }
}
                           /*Ciclo per la funzione controllo Botola*/
                           
void controlBotola(){
  
  reading = analogRead(sensorPin);
  int celsius = reading/2;
  lcd.setCursor(0, 0);
  lcd.print("Botola(22) In");
  lcd.setCursor(10, 1);
  lcd.print("Out");
  lcd.setCursor(14, 0);
  lcd.print(celsius, DEC);
  delay (2000); 
  reading = analogRead(sensorPin2);
  int celsius2 = reading/2;
  lcd.setCursor(14, 1);
  lcd.print(celsius2, DEC); 
  delay (2000);
  
  if (celsius && celsius2 >=baseline_Temp) {
    
      myservo.write(180);
      delay(15);
        lcd.setCursor(0,1);
        lcd.print("aperta");
       digitalWrite (LampGreen, HIGH);
        digitalWrite (LampRed3, LOW); 
        //alarm();
 }
  else {
    
      myservo.write(0);
      delay(15);
        lcd.setCursor(0,1);
       digitalWrite (LampGreen, LOW);
        digitalWrite (LampRed3, HIGH);
        lcd.print("chiusa");
        tone(4,400,500);
        delay(500);
        tone(4,650,500);
        delay(500);
  }
}

Buonasera,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili

Prima di soffermarmi ad analizzare il tuo programma, verificherei innanzitutto con un programma di esempio se il servomotore funziona correttamente. Tale programma d'esempio, che fa muovere avanti e indietro da 0° a 180° il servomotore, lo trovi a questo link:

Se hai un altro Arduino a cui non è collegato niente, esegui i collegamenti come mostrato in figura, carica il programma di esempio, e vedi il risultato pratico.

Buonasera,
chiedo scusa per essere entrato in questo modo, non ho capito se i 9000 caratteri max da scrivere è di tutto la richiesta o dello skech oppure di entrambi, in quanto avevo scritto molto di più ma poi ho dovuto tagliare molte cose pur per spiegare il problema.
Comunque sono Domenico scrivo dalla prov. di Bari arrangio con l'elettronica e come avevo detto Arduino fa il caso mio.
Il servomotore che era nuovo è da buttare, con dei primi skech per provarlo funzionava, dopo averlo integrato con questo programmino non ha funzionato. Ho provato un servomotore di un modellino ed è tutto ok funziona. Ho notato un certo surriscaldamento quando ho utilizzato un alimentatore esterno, portato ad una tensione di 4,5V e messo il negativo collegato a massa con Arduino. Vorrei utilizzare un altro alimentatore da 5V 3A.
Il servomotore essendo sempre sottotensione c'è un modo per farlo disattivare quando non serve?

In oltre dovrei cercare da qualche parte la soluzione per lm35, non capisco per quale motivo 3 sensori collegati in modo uguali e vicini fra loro, mi danno dei valori diversi e irreali. Il collegamentodi ogni singolo sensore sono gli estremi alla tensione - e +5v ed il centrale al pin analogico A0. Ho visto da qualche parte che veniva aggiunto una resistenza credo sul+.

In oltre in un menù non si può ottenere l'automatismo se non si entra nella posizione giusta, ad esempio: nel menù aggiungo la posizione per visualizzare l'ora, ma la funzione del servomotore è attiva? Oppure nello skech dell'orologio devo ricopiare i comandi del servo e del sensore escludendo la visualizzazione della temperatura?

>Cantatore74: lo hai letto attentamente il mio post #1 ? ? ? :o :o :o

C'è tanto di link dove andare a fare la presentazione ... e del regolamento da leggere con attenzione ... ::slight_smile:

... faccio notare che NON saranno ammesse altre risposte sino a quando non sarà rispettato il suddetto regolamento. Grazie.

Guglielmo

Cantatore74:
Ok, fatto.

E dove scusa? ... visto che hai 3 post e sono tutti e tre in questo thread ? ? ? :o :o :o

Guglielmo

Strano, comunque sono Domenico conosco qualche base di elettronica non ho conoscenza del linguaggio di Arduino e sto imparando grazie a skech dimostrativi, con qualche modifica ho potuto notare il comportamento del programma così che possa apprendere meglio la funzionalità. Tra i diversi esempi che ho trovato ho notato l'ordine in cui viene eseguito un'istruzione e da qui ho potuto apportare modifiche tali da poter fare un mega programma. Anche se all'inizio ho trovato delle difficoltà la maggior parte degli errori sono riuscito a risolverli.
Purtroppo sono all'inizio e di strada ne devo fare.
Io sono affascinato dall'elettronica e Arduino mi affascina ancor di più perchè dà la libera creatività.

P.S.
Questo era un regalo per mio figlio in quanto per me Arduino raccoglie i tre elementi fondamentali in quanto usa una programmazione per pc, elettronica e meccanica. Questi tre elementi dovevano sostituire pian piano il gioco di mio figlio per il semplice motivo che gioca con il pc, da qui la programmazione; ed i Lego che li associo alla creatività come per elettronica e meccanica. Purtroppo questo progetto che avevo per mio figlio non è andato a buon fine, perchè è negato per la meccanica ma per sistemi finanziari e giuridici che a me non dispiace per la sua scelta.

Grazie.

Perdona, ma esiste un REGOLAMENTO e va rispettato ...
... ripeto quindi LEGGI BENE il mio post #1 e vai a presentarti NEL THREAD che ho likato.

Presentazioni nei specifici thread di singoli argomenti NON servono a nulla !!!

Guglielmo

Spero di averlo inviato nella pagina corretta

Cantatore74:
Spero di averlo inviato nella pagina corretta

Perfetto, grazie :slight_smile:

Guglielmo

ce l'ho fatta

ritornando con i piedi per terra
Vorrei chiedere quando si crea un menù, dove Arduino esegue diverse funzioni per ogni opzioni, se si vuole osservare o dare continuità ad un comando, questo si deve ripetere ogni volta?
Per essere più chiaro faccio un esempio: alla prima posizione del menù c'è il programma di un termostato, mentre nella seconda posizione un orologio che vorrei vedere tutto il giorno ok? Quando visualizzo l'orologio il primo comando va in pausa? Dovrei ricopiare quasi tutto del termostato e aggiungerlo nel programma dell'orologio? Ovviamente escludendo la parte visiva del termostato. O mi sbaglio?

Cantatore74:
ritornando con i piedi per terra
Vorrei chiedere quando si crea un menù, dove Arduino esegue diverse funzioni per ogni opzioni, se si vuole osservare o dare continuità ad un comando, questo si deve ripetere ogni volta?
Per essere più chiaro faccio un esempio: alla prima posizione del menù c'è il programma di un termostato, mentre nella seconda posizione un orologio che vorrei vedere tutto il giorno ok? Quando visualizzo l'orologio il primo comando va in pausa? Dovrei ricopiare quasi tutto del termostato e aggiungerlo nel programma dell'orologio? Ovviamente escludendo la parte visiva del termostato. O mi sbaglio?

Di solito, al fine di non ripetere la scrittura di parti di codice già definite, si usa scrivere il codice da ripetere all'interno di una funzione richiamabile più volte a piacere nel loop, da dentro un'altra funzione oppure sia nell'uno che nell'altro caso contemporaneamente. Non ha importanza quante volte chiami la funzione e dove lo fai. Se vuoi che il comando che hai dato perduri fra una chiamata della funzione e l'altra, nella funzione puoi dichiarare di tipo "static" la variabile che memorizza il comando che fornisci alla tua uscita. In questo modo, ad ogni chiamata della funzione, la variabile "static" manterrà il valore che aveva assunto nella chiamata precedente e di conseguenza anche la tua uscita il cui stato è funzione di tale variabile.

Salve krypton18, per quanto riguarda il codice da ripetere mi può fare un esempio?
Poi per "static" ho trovato un esempio dove mi parla "test randomWalk function" e dove appunto è inserito il comando "static". Dato che non sono molto pratico, qui mi trovo più in difficoltà.
La prima domanda è questa dato che questo sketch è un esempio, il "randomWalk" bisognerebbe sostituirlo?
La seconda domanda è che questo si deve ripetere in ogni funzione o no? Se è no, io ho usato il comando "case" come lo posso integrare?

P.S.
Vorrei chiedere al sig. Guglielmo che nel mio primo post ho potuto inserire il mio sketch con il comando "code" come dite di fare, ma in questo messaggio non riesco a trovarlo, come mai?

Cantatore74:
Vorrei chiedere al sig. Guglielmo che nel mio primo post ho potuto inserire il mio sketch con il comando "code" come dite di fare, ma in questo messaggio non riesco a trovarlo, come mai?

Nel "Quick reply" (la finestrella in basso) NON hai i bottoni, devi usare il botone "Reply" ed usare quindi l'ediror completo oppure, più semplicemente, metterli a mano, tanto basta che metti [code] prima del codice e che metti [/code] subito dopo :wink:

Guglielmo

... ancora più semplice dall'IDE Arduino..

  1. premere Ctrl + T (per formattare il tutto) oppure dal menu strumenti scegliere formattazione automatica

  2. premere Ctrl+maiuscolo + C oppure dal menu modifica selezionare copia per il forum

nel post di risposta fasr Ctrl + V o click con tasto destro e scegliere incolla e i tag ci sono già :slight_smile:

Grazie Patrick_M

krypton18:
Di solito, al fine di non ripetere la scrittura di parti di codice già definite, si usa scrivere il codice da ripetere all'interno di una funzione richiamabile più volte a piacere nel loop, da dentro un'altra funzione oppure sia nell'uno che nell'altro caso contemporaneamente. Non ha importanza quante volte chiami la funzione e dove lo fai. Se vuoi che il comando che hai dato perduri fra una chiamata della funzione e l'altra, nella funzione puoi dichiarare di tipo "static" la variabile che memorizza il comando che fornisci alla tua uscita. In questo modo, ad ogni chiamata della funzione, la variabile "static" manterrà il valore che aveva assunto nella chiamata precedente e di conseguenza anche la tua uscita il cui stato è funzione di tale variabile.

Salve, per usare questo comando c'è un programmino? Non mi è molto chiaro. Avevo fatto delle prove ma credo di incasinarmi, non trovo degli esempi per i riferimenti.

Nel frattempo vorrei chiedere quando si carica uno sketch su Arduino questo rimane in memoria, ma quando si applicano delle modifiche cambiando resistenze ecc. e collego il cavo usb per caricare un nuovo sketch, questo crea dei cortocircuiti? Perchè avendo in memoria il vecchio sketch dà segnali in modo sbagliato al nuovo progetto giusto? Come si resetta Arduino?

come dice il buon Guglielmo (ovviamente non solo lui :smiley: )
gli carichi il buon vecchio blink (che trovi negli esempi) così lo rimetti com'era quando l'hai comprato :wink: