Go Down

Topic: due lm35 comandano un servomotore (Read 1 time) previous topic - next topic

Cantatore74

#30
Oct 19, 2018, 06:03 pm Last Edit: Oct 19, 2018, 06:16 pm by Cantatore74
Provo ad mettere le 3 parti del programma dove deve funzionare il servomotore


Code: [Select]


#define butUp 12    //pulsante SU al pin 12
#define butDown   11    //Pulsante GIU al pin 11
#define butP 10    //Pulsante SELECT al pin 10
#define butM   1    //non utilizzato in questo esempio
#define LampRed   2    //LED Rosso al pin 2  (Botola chiusa)
#define LampRed2         3    //LED Rosso al pin 3  (Sensore Gas ON)
#define LampRed3         4    //LED Rosso al pin 4  (Allarme)
#define LampGreen        5    //LED Verde al pin 5  (On Arduino)
#define LampGreen2      14    //LED Verde al pin 14 (Termostato ON)
#define LampGreen3      15    //LED Verde al pin 15 (Sensore Fiamma ON)
#define LampGreen4      16    //LED Verde al pin 16 (Botola aperta)
#define LampRele         6    //Relè al pin 6 VENTOLA
#define LampRele2        7    //Relè al pin 7 CICALINO
#define LampRele3        8    //Relè al pin 8
#define PhotoSensor     A0    // sensore temperatura al pin analogico A0 (interno)
#define PhotoSensor     A1    // sensore temperatura al pin analogico A1 (esterno)
#define PhotoSensor     A2    // sensore temperatura al pin analogico A2 (sotto tetto )
#define sensorefiamma A0 PIN A7   //Mega 2560 A0 (Analogico) va collegato al Pin A7
#define sensorefiamma D0 PIN 23   //Mega 2560 D0 (Digitale) va collegato al Pin 78
#define BUZZER               22   //Buzzer al pin 22
#define randomWalkLowRange -20
#define randomWalkHighRange 20

//DISPLAY Mappa Hardware

#include <Servo.h>
#include <OneWire.h>
#include <Wire.h>              // libreria wire presente, di fault, nell'IDE
#include <LiquidCrystal_I2C.h> // libreria di gestione del display lcd
#include <Time.h>
#include <TimeLib.h>
#include <DS3232RTC.h>

//Parte servo
Servo myservo;
int pos = 0;
//const int pinServo = 9;

//Parte Sensore Gas
const int buzzerPin = 22;
const int lampRed2 = 3;
const int sensorPin4 = A6;
const int intervallo_base = 200;

int sensorValue4 = 0;
int sensorAlertMinValue = 40;//Valore minimo di allarme
int LampRed2Value = 0;
bool buzzerTone = 0;

unsigned long currentMillis = 0;
unsigned long previousMillis = 0;

//Parte Sensore fiamma
int flame_din = 23;
int flame_ain = A7;
int ad_value;
int rel = 7;    //relè
int max = 20;


byte BotolaApertaChar[] = {
  B00010,
  B00100,
  B01000,
  B10000,
  B11111,
  B10001,
  B10001,
  B11111
};
byte BotolaChiusaChar[] = {
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B10001,
  B10001,
  B11111
};

//Parte Ohm meter (Resistenze)
int analogPin5 = A9; // Pin Analogico A9
int raw = 0;
int Vin = 5; // Volt in uscita dal Pin 5V di Arduino
float Vout = 0;
float R1 = 1000; // impostare il valore della resistenza nota in Ohm
float R2 = 0;
float buffer = 0;

byte customChar[] = {
  B00000,
  B00000,
  B01110,
  B10001,
  B10001,
  B10001,
  B01010,
  B11011
};

//Parte Volt-metro da 0 a 30V
int analogInputA8 = A8;
int analogInputA10 = A10;
int analogInputA11 = A11;
float vout = 0.0;
float vin = 0.0;
float R10 = 100000.0; // inserire valore esatto resistenza R10 (100K)
float R11 = 10000.0; // inserire valore esatto resistenza R11 (10K)
int value = 0;


//int stepsize;
int i;                  // definisce la variabile "i" utilizzata in un ciclo di for
int valore;             //dichiaro la variabile valore che memorizzerà il valore dato dal convertitore analogico-digitale

int thisTime;
int total;


//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();
void ora_data();
void TestBattRTC();
void controlGas();
void controlFiamma();
void TestResistenze();
void TestTensione();
void Servomotori();

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

int relay = 7;
int relay2 = 6;
int relay3 = 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 float baseline_Temp = 22; //Impostazione Temperatura confort


//const int setpin = 4;   ///////////////////
//boolean statepin = 0;
//const int servoMin = 0; ////////////////////
//const int servoMax = 180; ///////////////////

LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // definisce la tipologia del display

//RTC DS3231
time_t t;
tmElements_t tm;

float temperaturaRTC = 0;
float temp4       = 0;
int digits        = 0;

char tabmesi [37] = "GenFebMarAprMagGiuLugAgoSetOttNovDic";

int mese          = 0;
int lavoro        = 0;

void esponidati(void)
{
  lcd.clear();
  lcd.print("   ");
  lcd.print(day());
  lcd.print(' ');

  mese = month();
  mese = mese - 1;

  lcd.print (tabmesi [(mese * 3)]);
  lcd.print (tabmesi [(mese * 3 + 1)]);
  lcd.print (tabmesi [(mese * 3 + 2)]);
  lcd.print (' ');
  lcd.print (year());
  lcd.setCursor(0, 1);
  lcd.print(hour());
  digits = (minute());
  printDigits();
  digits = (second());
  printDigits();
  lcd.print (" t:");
  lcd.print (temp4);
}

void printDigits()
{
  lcd.print(':');
  if (digits < 10)
    lcd.print('0');
  lcd.print(digits);
}

void allarme_sonoro() { //applicazione sonora
  tone(BUZZER, 2000);   //Tono buzzer
}
void setup() {

  myservo.attach(9);  // attaches servo al pin 9
  {
    Serial.begin (9600);
    lcd.begin(16, 2);
    lcd.backlight();
    lcd.print (" Buongiorno");
    delay (1500);
    lcd.createChar(0, DomenicoChar);
    lcd.setCursor(4, 1); //posizionamento (colonna,riga)
    lcd.write((uint8_t)0);
    lcd.setCursor(5, 1);
    lcd.print("omenico");
    delay (2000);

    //Setup RTC DS3231
    lcd.clear ();
    setSyncProvider(RTC.get);
    lcd.clear ();
    if (timeStatus() != timeSet)
      lcd.print (" orologio non");
    else
      lcd.print(" orologio");
    lcd.setCursor (0, 1);
    lcd.print  (" sincronizzato");
    delay (1500);
    temperaturaRTC = RTC.temperature();
  }
  //Setup sensore fiamma
  {
    lcd.begin(16, 2);
    pinMode(analogInputA8, INPUT);
    pinMode(flame_din, INPUT);
    pinMode(15, OUTPUT);
    pinMode(22, OUTPUT);
    pinMode(flame_ain, INPUT);
    pinMode (BUZZER, OUTPUT);
    pinMode(rel, OUTPUT);         //relè
    digitalWrite(rel, LOW);      //relè 2

  }



  lcd.begin(16, 2);
  for (char i = 9; i < 13; i++) { //Ingresso dei pulsanti

    pinMode(i, INPUT_PULLUP);

  }
  pinMode(22, OUTPUT);              //Buzzer (orig.PIN3)
  pinMode(4, OUTPUT);               //Led Allarme (Rosso)
  pinMode(LampRed, OUTPUT);    //LED ROSSO  (Botola Aperta)
  pinMode(LampRed2, OUTPUT);        //LED ROSSO  (Gas)
  pinMode(LampRed3, OUTPUT);    //LED ROSSO  (Allarm)
  pinMode(LampGreen, OUTPUT);       //LED VERDE  (On)
  pinMode(LampGreen2, OUTPUT);      //LED VERDE  (Termostato)
  pinMode(LampGreen3, OUTPUT);      //LED VERDE  (Fiamma)
  pinMode(LampGreen4, OUTPUT);      //LED VERDE  (Botola Chiusa)
  pinMode(LampRele, OUTPUT);        //RELÃ 1ˆ
  pinMode(relay, OUTPUT);           //rele' 1 per ventola
  pinMode(buzzerPin, OUTPUT);       //Buzzer Pin
  digitalWrite (LampRele, LOW);     //Imposto inizialmente il relè allo stato basso (LOW-Disattivo)

  //digitalWrite (4, HIGH);
  //Wire.begin();


  t_butUp = 0x00;   //Inizializza le variabili come ZERO
  t_butDown     = 0x00;
  t_butP = 0x00;
  t_butM = 0x00;

}

Cantatore74

Code: [Select]

/*Ciclo per la funzione controllo Botola*/

void controlBotola() {

  reading = analogRead(sensorPin);
  delay(5);
  reading = analogRead(sensorPin);
  int celsius = reading / 2;
  lcd.setCursor(0, 0);
  lcd.print("Botola(22C)In");
  lcd.setCursor(10, 1);
  lcd.print("Out");
  lcd.setCursor(14, 0);
  lcd.print(celsius, DEC);
  delay (2000);
  reading = analogRead(sensorPin2);
  delay(5);
  reading = analogRead(sensorPin2);
  int celsius2 = reading / 2;
  lcd.setCursor(14, 1);
  lcd.print(celsius2, DEC);
  delay (2000);

  if (celsius >= baseline_Temp && celsius2 >= baseline_Temp) {
    lcd.setCursor(0, 1);
    lcd.print("aperta");
    digitalWrite (LampGreen3, HIGH);
    digitalWrite (LampRed, LOW);
    //alarm();

    for (pos = 0; pos <= 180; pos += 1) // goes from 0 degrees to 180 degrees
    { // in steps of 1 degree
      myservo.write(pos);              // tell servo to go to position in variable 'pos'
      delay(15);                       // waits 15ms for the servo to reach the position
    }
    // myservo.write(180);
    //delay(15);
  }
  else {
    lcd.setCursor(0, 1);
    lcd.print("chiusa");
    digitalWrite (LampGreen3, LOW);
    digitalWrite (LampRed, HIGH);
    for (pos = 180; pos >= 0; pos -= 1) // goes from 180 degrees to 0 degrees

      myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position

    //myservo.write(0);
    //delay(15);

    for (i = 0; i < 350; i++) // definisce la durata del primo suono (350 cicli da 2 millisecondi).
    {
      digitalWrite(22, HIGH); // attiva il suono
      digitalWrite(LampRed, HIGH); // accende il led
      delay(1); // attende 1 millisecondo. Di fatto ripete il suono ogni 2 millisecondi e
      // quindi con una frequenza di 500 ripetizioni al secondo
      digitalWrite(22, LOW); // disattiva il suono
      delay(1); // attende 1 millisecondo e riparte dall'istruzione for (350 ripetizioni)
    }
    delay (50); // attende 50 millisecondi prima di lanciare il secondo ciclo di suoni
    for (i = 0; i < 150; i++) // definisce la durata del secondo suono (150 cicli da 4 millisecondi)
    {
      digitalWrite(22, HIGH); // attiva il suono
      digitalWrite(LampRed, HIGH);
      delay(2); // attende 2 millisecondi (ripete il suono ogni 4 millisecondi e quindi
      // 250 volte al secondo)
      digitalWrite(22, LOW); // spegne il suono
      delay(2); // attende 2 millisecondi e ripete il ciclo per 150 volte
    }
  }

Cantatore74

Tornando un pò indietro l'if non fa quello che deve fare, perchè la funzione di aprire lo fà solo su un valore (celsius2) e nò quando entrambi hanno superato la soglia (baseline).

Patrick_M

#33
Oct 21, 2018, 10:06 am Last Edit: Oct 21, 2018, 10:07 am by Patrick_M
Tornando un pò indietro l'if non fa quello che deve fare, perchè la funzione di aprire lo fà solo su un valore (celsius2) e nò quando entrambi hanno superato la soglia (baseline).
non è possibile , l'and (&&) controlla che entrambe le condizioni siano vere

p.s.
devono aver raggiunto o superato (>=) la quota
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

Cantatore74

non è possibile , l'and (&&) controlla che entrambe le condizioni siano vere

p.s.
devono aver raggiunto o superato (>=) la quota
I pin dei sensori possono stare vicini? A0 A1 A2? Il programma funzionava con Arduino Uno, adesso ho Arduino Mega2560 R3, cambia qualcosa oltre ad avere un numero maggiore di entrate/uscite?
Esiste un programma che controlla la sequenza del loop e vedere dove c'è l'intoppo?
Può essere che in tutto il programma c'è qualche interferenza?
Adesso devo fare la prova del 9 nel senso che devo ridurre all'osso il menù e lasciare il necessario dove c'è if. e il servomotore.

Patrick_M

#35
Oct 21, 2018, 11:12 pm Last Edit: Oct 21, 2018, 11:19 pm by Patrick_M
ti sei ricordato di raddoppiare le letture e buttare via la prima? (per ogni sensore intendo) :)
si ho visto il listato sopra :)
il "programma che controlla" lo scrivi tu, aggiungendo la scrittura sul monitor seriale del valore delle variabili che vuoi verificare, grazie a questo puoi controllare anche ogni riga del programma e capire cosa fa e non fa ;)
prima di questa riga
Code: [Select]
if (celsius >= baseline_Temp && celsius2 >= baseline_Temp) {
aggiungi
Code: [Select]

Serial.print("celsius ");
serial.println(celsius);
Serial.print("celsius2 ");
serial.println(celsius2);
Serial.print("baseline_Temp ");
serial.println(baseline_Temp);
così a monitor vedi i valori...
ovvio che devi avere nel setup
la Serial.begin(9600);
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

Patrick_M

però ho dato un'occhiata al programma che hai postato al post #30 (inizio di questa pagina)

alla riga   17 trovo:#define PhotoSensor     A0 
alla riga   20 trovo:#define sensorefiamma A0 PIN A7   (che francamente non capisco cosa significa)
alla riga   57 trovo:int flame_ain = A7;
alla riga 153 trovo:int sensorPin = A0;

alla riga     9 trovo:#define LampRed3         4

alla riga 21 trovo:#define sensorefiamma D0 PIN 23   (come sopra)
alla riga 21 trovo:int flame_din = 23;

alla riga 22 trovo: #define BUZZER               22
alla riga 42 trovo: const int buzzerPin = 22;

alla riga   8 trovo: #define LampRed2         3
alla riga 43 trovo: const int lampRed2 = 3;

alla riga  8 trovo:#define LampRele2        7
alla riga 55 trovo:int rel = 7;
alla riga 148 trovo:int relay = 7;


questa poi è una delle migliori :)
int analogPin5 = A9; // Pin Analogico A9


poi nel setup cose come:
riga 259:    pinMode(rel, OUTPUT);         //relè                     ->riga  55 = pin 7
riga 283:    pinMode(relay, OUTPUT);     //rele' 1 per ventola->riga148 = pin 7

riga273:     pinMode(4, OUTPUT);                 //Led Allarme (Rosso) 
riga 276     pinMode(LampRed3, OUTPUT);    //LED ROSSO  (Allarm) -> riga9 =pin 4


dovresti proprio ripulirlo e usare 1 variabile sola per ogni cosa....
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

Cantatore74

Per quanto riguarda (sensore fiamma A0 pin A7) effettivamente è un mio errore dovuto al passaggio da Arduino Uno a Mega, il pin A7 è il nuovo pin. Mannaggia ho dimenticato di metterlo dopo, dovevo fare (sensore fiamma A7 //A0 per promemoria). L'analogico va al pin A7 e il digitale al 23.

alla riga 9:#define LampRed3 4, allora ci sono 3 led rossi e 4 verdi  e non ho fatto altro che numerarli, in questo caso LampRed3 (terzo Led rosso) è collegato al pin 4, il 3 è tutt'uno con il nominativo del led e credo che non dovrebbe interferire con il pin 4 o mi sbaglio?

Per quanto riguarda il buzzer non ci ho fatto caso del maiuscolo/minuscolo e anche del nominativo differente, ma questo dipende dal fatto che ho cancellato dei programmi dimenticando di cancellare tutti i comandi.

Si effettivamente ieri stavo rivedendo i relè e i led che erano riportati a doppio con due nomi differenti. I relè li dovrei rinominarli. Per non parlare che ho fatto confusione con i led (quale doveva fare cosa) dato che stò montando il tutto in un contenitore di un combinatore telefonico, i led devono funzionare in modo intuitivo in base alla disposizione messa senza considerare ciò che è scritto sul display.

analogicPin5 che diventa A9 inizialmente era A5, ho voluto in parte mantenere il programma originale e ho cambiato solo il pin assegnato. Per voi che state abitualmente a programmare notate questi particolari, le cose fatte per bene si và con un certo ordine, ma per mè che è il mio primo assemblaggio questi particolari non sapevo che facessero molto, ora capisco che portano a confusione, ciò che è collegato al pin A9 che è un ohmetro dopotutto funziona bene.

Questo progetto dopo tantissimi errori che son riuscito a risolvermeli da solo dovevo prima o poi fare degli errori stupidi, maggiormente quando ho dovuto lasciare un lavoro a metà per riprenderla dopo qualche giorno e non ricordarmi dove ero arrivato.

Io mi chiedo perchè il programma non dà l'errore di conflitti prima di caricarlo su arduino?
Per la pulizia infatti successivamente dovevo chiedere se c'era qualcuno disponibile a controllarlo del tutto e togliere qualche riga di troppo.

Ok Patrik_M credo che l'intoppo maggiore è quel A0, apporterò le modifiche e vedremo cosa succede.
Per il LampRed3 cosa devo fare provoca qualche errore il 3?

Patrick_M

Quote
Per il LampRed3 cosa devo fare provoca qualche errore il 3?
ma no!

e che anche qui usi due cose diverse per lo stesso oggetto
Code: [Select]

riga273:     pinMode(4, OUTPUT);                 //Led Allarme (Rosso)
riga 276     pinMode(LampRed3, OUTPUT);    //LED ROSSO  (Allarm) -> riga9 =pin 4



sono la stessa cosa! e solo 3 righe di codice dopo
sono un sacco di righe sprecate e possibilità maggiori di errori e confusioni
quando poi vai a fare il debug non capisci più nulla se una volta usi un nome e la volta dopo un altro non ti puoi rendere conto di cosa fa il programma.

non c'è molto da pensare per A0 qui:
Code: [Select]

alla riga   17 trovo:#define PhotoSensor     A0
alla riga   20 trovo:#define sensorefiamma A0 PIN A7   (che francamente non capisco cosa significa)
alla riga 153 trovo:int sensorPin = A0;

semplicemente 2 righe le cancelli e ne tieni una.... come per tutto il resto
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

Patrick_M

#39
Oct 22, 2018, 10:52 pm Last Edit: Oct 22, 2018, 10:56 pm by Patrick_M
Quote
Io mi chiedo perchè il programma non dà l'errore di conflitti prima di caricarlo su arduino?
il programma non ti da errore e si carica perchè di errori di "sintassi" (parentesi dimenticate, mancanza di punti e virgole, istruzioni errate) non ce ne sono

anche il definire più nomi per lo stesso pin sintatticamente non è un errore, nel senso che ogniuna delle varie righe è valida per cui per indicare il pin A0 nel tuo programma puoi usare
PhotoSensor     
sensorefiamma
sensorPin
il problema è appunto che usandone 3 nel programma ti creeresti solamente una grande confusione in testa (ma arduino non farebbe una piega ;) )

poi che però il programma non faccia quello che pensavi tu è un altro discorso :D
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

Cantatore74

Code: [Select]

alla riga   17 trovo:#define PhotoSensor     A0
alla riga   20 trovo:#define sensorefiamma A0 PIN A7   (che francamente non capisco cosa significa)
alla riga 153 trovo:int sensorPin = A0;


la riga 17 è uno dei tre lm35 quindi sono A0 A1 A2 ed è corretto
la riga 20 è il sensore fiamma quindi A0 era come riportato nel programma originale, ma nel mio caso diventa A7 perchè A0 è occupato dal lm35.
mentre la riga 153  con la riga 17 appartengono al programma che ho copiato.
Quindi si potrebbe fare a meno della riga 153 e rinominare tutti i sensorpin con il photosensor.

Code: [Select]

riga273:     pinMode(4, OUTPUT);                 //Led Allarme (Rosso)
riga 276     pinMode(LampRed3, OUTPUT);    //LED ROSSO  (Allarm) -> riga9 =pin 4


questi erano gli altri comandi che avevo già notato.
Questo è un esempio che mi fà un pò rabbia perchè ogniuno usa un modo diverso per sviluppare il programma.
Io all'inizio ho fatto un pò di fatica  a capire, perchè questi esempi non usano un linguaggio standard, quando ho confrontato due programmi che fanno la stessa cosa, mi sono accorto che questa differenza dopotutto facevano la stessa cosa.

Dato che ci siamo con il discorso delle parentesi mi è sorto una curiosità.
Tutti i programmi utili che ho voluto integrare in questo programma hanno un setup, e i vari setup mettendoli in questo mio progetto li ho racchiusi nelle graffe per una ricerca maggiore, qui cambia qualcosa? E' ovvio che qui c'è anche il comando per il setup del servo
Code: [Select]

void setup() {

  myservo.attach(9);  // attaches servo al pin 9
  {
    Serial.begin (9600);
    lcd.begin(16, 2);
    lcd.backlight();
    lcd.print (" Buongiorno");
    delay (1500);
    lcd.createChar(0, DomenicoChar);
    lcd.setCursor(4, 1); //posizionamento (colonna,riga)
    lcd.write((uint8_t)0);
    lcd.setCursor(5, 1);
    lcd.print("omenico");
    delay (2000);

    //Setup RTC DS3231
    lcd.clear ();
    setSyncProvider(RTC.get);
    lcd.clear ();
    if (timeStatus() != timeSet)
      lcd.print (" orologio non");
    else
      lcd.print(" orologio");
    lcd.setCursor (0, 1);
    lcd.print  (" sincronizzato");
    delay (1500);
    temperaturaRTC = RTC.temperature();
  }
  //Setup sensore fiamma
  {
    lcd.begin(16, 2);
    pinMode(analogInputA8, INPUT);
    pinMode(flame_din, INPUT);
    pinMode(15, OUTPUT);
    pinMode(22, OUTPUT);
    pinMode(flame_ain, INPUT);
    pinMode (BUZZER, OUTPUT);
    pinMode(rel, OUTPUT);         //relè
    digitalWrite(rel, LOW);      //relè 2

  }



Praticamente non ho voluto smuovere i vari setup perchè c'è il comando:

Code: [Select]
   
 lcd.begin(16, 2);


riportato molte volte, e per non interferire con il tutto li ho lasciati così.

Quindi le domande sono:

Questo comando è sufficiente scriverlo una sola volta?
Cosa succede se lascio le graffe in questo modo?
Se nel caso sono da rimuoverli possono lasciarli integri in questo modo?

p.s.
I comandi dei relè li devo correggere in questo momento.

Patrick_M

#41
Oct 23, 2018, 09:39 pm Last Edit: Oct 23, 2018, 09:49 pm by Patrick_M
le funzioni nel linguaggio c++ (che è quello usato in arduinese :) ) come anche in C standard

prevedono:
assegnazioneDelTipoDiParametroDiRitornoDellaFunzione nomeDellaFunzione(TipoParametro nomeParametro) {
   corpoDellaFunzione
   ...
   ...
}

praticamente per esempio nella funzione setup trovi:
Code: [Select]

void setup() {
...
...
}

dove void significa che non restituisce nessun valore al termine
setup è il nome della funzione
() le parentesi non contengono nulla perchè non richiede parametri
{   graffa aperta = inizio funzione
} graffa chiusa = fine funzione

ci sono ovviamente altri comandi che prevedono apertura e chiusura delle graffe
come ad esempio
if () {
} else {
}

for(){
}

swich (){
}

ma nel tuo caso non stai usando nessuno di questi e quindi
Code: [Select]

void setup() {

  myservo.attach(9);  // attaches servo al pin 9
  {
    Serial.begin (9600);
    lcd.begin(16, 2);

anche se praticamente viene ignorata dal compilatore in effetti è un errore
è meglio se le elimini anche perchè anche qui fanno confusione
ricordati comunque di levarle a coppie perchè se ne dimentichi una ti si incasina tutto ;)


lcd.begin(parametri)

questa riga inizializza, attiva, fa funzionare (diciamo così) il tuo lcd, è come quando giri la chiave per accendere il motore, non è che lo fai ad ogni cambio marcia :D quando è partito, è partito!
idem per Serial.begin() e per tutti gli altri begin() che potrai trovare


sul fatto che puoi trovare dei programmi scritti in un modo o in un altro, è normale e abbastanza personale, ogniuno scrive come vuole :)

ovvio che se io trovo un programma dove c'è scritto
Code: [Select]

if (digitalRead(4)) {
   int x=analogRead(A0);
   if (x< 100) {
       digitalWrite(5,HIGH);
   }
}

ti sfido a capire cosa fa (non le singole istruzioni, ma la logica)
mentre se scrivo
Code: [Select]

if (PulsanteAvvioPremuto) {
   int luminosita = AnalogRead(pinFotodiodo);
   if (luminosita < 100) {
      digitalWrite(luceDelleScale,HIGH);
   }
}

è molto più comprensibile no?
ovviamente in testa al programma avrai messo o i define:
Code: [Select]

#define PulsanteAvvioPremuto 4
#define pinFotodiodo A0
#define luceDelleScale 5

oppure
Code: [Select]

const byte PulsanteAvvioPremuto=4; 
const byte pinFotodiodo=A0;
const byte luceDelleScale=5;

 ma non entrambi anche se qui almeno il nome è lo stesso ;)
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

Cantatore74

Ok, ho inquadrato di più il tutto, effettivamente se al posto della x e/o funzione viene quasi scritto ciò che si vuole fare è molto più semplice.

Tornando al progetto ho risolto il problema dell' lm35, che quando entrambi superano la soglia dei 22 gradi partisse il servomotore. Non ho fatto altro che spostare le righe nel loop, pratricamente ho avvicinato le due righe che leggono i valori. Lo vedo strano.

Per quanto riguarda il servomotore non ho capito cosa dava fastidio nel menù che interferiva con il pin9, come ho già detto ho provato a fare la prova del nove con gli esempi per far funzionare solo il servomotore al pin9, in questo modo funzionava tranquillamente, con il menù nò. Ho provato anche a creare una posizione nel menù dedicato solo al servomotore, anche qui non ho trovato la soluzione fino a quando ho semplicemente cambiato il pin da 9 a 24 e finalmente funziona.

Adesso devo vedere perchè durante lo scorrimento del menù si è creato dello spazio, faccio un esempio, supponiamo che sul display durante lo scorrimento del menù visualizzo dei numeri e quello che vedo è questo:
1/2/3/4/5/6/7/8/9/../../../../10/11/12 ecc..
Dopo tutto nel menù non ci sono state modifiche particolari. Come mai? Mi chiedo se è una questione del passaggio della nona posizione alla decima?

Patrick_M

non ne ho idea....
vedere programma prego ;)
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

Cantatore74

Code: [Select]

void OraData() {
  indiceset = 0;
  indiceset = digitalRead (butP);
  if (indiceset == 1)
  { delay (1000);
    acquisiscidati ();
  }
  tempocorrente = millis();
  if ((tempocorrente - tempoprec ) > 1000)
  {
    tempoprec = tempocorrente;
    esponidati();
  }
}

//Ciclo funzione Test Batteria
void TestBattRTC() {

  delay(100); //aspetto(100 millisecondi);
  valore = analogRead (A3); //Leggo il valore analogico alla porta A3 e lo metto dentro "valore"
  lcd.setCursor(0, 0);
  lcd.print("Test RTC");
  lcd.setCursor(0, 1);
  lcd.print("Battery  %");
  lcd.setCursor(11, 1);
  lcd.print ((valore * 100) / 614);
  delay(500);

  //comando Rel Ventola
  {
    reading = analogRead(sensorPin2);
    delay(5);
    reading = analogRead(sensorPin2);
    int celsius = reading / 2;
    delay(500);
    if (celsius > 25) {
      //modificare la temperatura desiderata,
      //inserire > se attivo superiore a 28C°
      //e < se attivo inferiore a 25C°
      delay(1000);
      digitalWrite(Rel, HIGH);
      digitalWrite(LampGreen4, HIGH);
    } else {
      digitalWrite(Rel, LOW);
      digitalWrite(LampGreen4, LOW);
    }

  }
}


Questi sono i due loop del menù, quando passo dalla posizione dell'orologio a quella successiva si creano degli spazi vuoti sul display. Stà da dire che "esponidati" è un void che và prima del setup. Lo devo aggiungere?

Go Up