Go Down

Topic: [RISOLTO] Arduino Rheobus Implementare la funzione millis() (Read 954 times) previous topic - next topic

Antonio7882

Jun 02, 2015, 02:16 am Last Edit: Jun 03, 2015, 04:05 pm by Antonio7882 Reason: [RISOLTO]
Ciao a Tutti

Dopo quello di presentazione questo è il primo Topic che apro su questo forum

Premessa Sono Nabbo d.o.c. in programmazione

ho fatto il mio primo progetto ed anche il mio primo Sketch prendendo delle parti di codice qua e la per mettere insieme uno Sketch decente ed ore e ore per farlo funzionare

Dopo una settimana il sistema funziona!!!

...ma "a rilento"

nel senso che le variazioni di temperature non sono istantanee
questo ritardo si nota anche sull'attivazione delle ventole e sulla regolazione delle stesse
ho un Arduino mega2560 e la parte lcd dello Sketch non l'ho ancora provata

- c'è un modo per sintetizzare le funzioni/sintassi ripetute n volte e quindi sintetizzare lo Sketch per renderlo più "snello" eliminando le cose inutili?

- la funzione millis() è la soluzione al mio problema di lentezza?

- come implemento la funzione nel mio Sketch? ( se è come penso mi ci vorrà un'altra settimana )

P.S.

ho letto svariati articoli e tutorial ma non c'ho capito una mazza ... compreso questo

Multitasking Arduino: millis()

Ciao Antonio

uwefed

dimentica subito quella guida. É piena di errori.
Code: [Select]
letturaluce1=analogRead(SENSORELUCE1);
posservo1= analogRead(letturaluce1);

non ha nessun senso. leggere un sensore su un pin e prendere quel valore per determinare quale entrata leggere.

Il Tuo programma:

Usa dei Array dove memorizzi i pin e in un ciclo for fai le cose.

Code: [Select]
int fan1 = 8;       // Il pin che controlla la ventola 1
int fan2 = 9;
int fan3 = 10;
int fan4 = 11;
int fan5 = 12;
int fan6 = 13;


Code: [Select]
led[6] = {31,33,35,37,39,41};

for (int i=0; i<6; i++)
{
pinMode(led[i], OUTPUT);
}


Le entrate analogiche e le uscite PWM non necessitano di un pinMode();

delay(200);
lcd.clear();
e
delay(1000);
rallentano lo sketch tantissimo.

vedi un po questo esempio:
http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay


ciao Uwe

gpb01

Per come si usa la millis() puoi guardare prima QUI, poi QUI ed infine leggi anche QUI ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

Antonio7882

#3
Jun 02, 2015, 02:10 pm Last Edit: Jun 02, 2015, 05:31 pm by Antonio7882
Ho capito il discorso che i delay aumentano il tempo del ciclo loop

4 ore tra le varie guide e tuorial esempi ecc per capire come togliere i delay e mettere millis
ma niente da fare sono troppo Nabbo

Code: [Select]

   lcd.print("TEMP1: ");
   lcd.print(temp1);
   lcd.print("C ");
   lcd.setCursor(0,1);
   lcd.print("FANS1: ");
   lcd.print(fan1LCD);
   lcd.print("%");
   delay(200);
   lcd.clear();

   Serial.println("TEMP1: ");
   Serial.print(temp1);
   Serial.println(" C SENSORE-1");
   Serial.println("Ventola1: ");  
   Serial.print(fan1LCD);
   Serial.println(" %");
   delay(1000);

ho capito a che serve la funzione millis ma non come implementarlo nel mio Sketch
Quindi ho deciso di richiedere il vostro supporto

-Visto il mio Sketch come e dove lo modifico per la funzione millis?
                  (fate finta di parlare a un bimbo di 6 anni)

Ciao Antonio

Edit:

forse ci sono
questo prima di void setup()
Code: [Select]

#define interval 1000  //Intervallo di tempo
long previousMills = 0;//Memorizza l'ultima volta che è stato aggiornato

questo e tutto il resto rimane invariato nel void setup()
Code: [Select]

void setup() {
  Serial.begin(9600);
}

lcd.print e serial.print dentro la funzione millis
il tempo di "print" dovrebbe essere ogni secondo ... spero sia corretto
Code: [Select]

void loop() {
 
if (millis() -  previousMills > interval ){
previousMills = millis();

   lcd.print("TEMP: ");
   lcd.print(temp);
   lcd.print("C ");
   lcd.setCursor(0,1);
   lcd.print("FANS: ");
   lcd.print(fanLCD);
   lcd.print("%");
   lcd.clear();   
   
   Serial.println("TEMP: ");
   Serial.print(temp);
   Serial.println("C ");
   Serial.println("FANS: ");
   Serial.print(fanLCD);
   Serial.println(" %");
}


gentilmente avrei solo bisogno di una vostra conferma

 ... cosi posso scrivere RISOLTO al mio primo Topic :D

Ciao antonio

Maurotec

Si va bene, tranne per il tipo che hai usato per previousMills. Il long può gestire anche i numeri negativi (e non serve) ma il prezzo da pagare e che la metà dei bit serve per i numeri negativi e l'altra metà per i positivi.

Quindi in breve usa:
Code: [Select]

unsigned long previousMillis;
// oppure
uint32_t previousMillis;


Quote
ma niente da fare sono troppo Nabbo

Sarai pure Nabbo, ma se hai capito come usare millis in così breve tempo ci sono buone speranze di scrollarsi di dosso l'appellativo.

Ciao.

Antonio7882

#5
Jun 03, 2015, 01:35 am Last Edit: Jun 03, 2015, 01:10 pm by Antonio7882
Vi ringrazio oltre che per i consigli sopratutto per la pazienza
faccio un riepilogo:
Code: [Select]

#define interval1 200                                      //Intervallo di tempo per la scrittura sul display lcd
long previousMills1 = 0;                                   //Memorizza l'ultima volta che è stato aggiornato
#define interval2 3000                                     //Intervallo di tempo per la scrittura sul serial monitor
long previousMills2 = 0;

void setup() {
      lcd.begin(16,2);

      Serial.begin(9600);
etc.......
}
void loop() {

      ScritLCD();                                          //scrittura sul display lcd
      
      ScritSerial();                                       //scrittura sul serial monitor

void ScritLCD() {
  
      unsigned long currentMillis = millis();
      if (millis() -  previousMills1 > interval1 ){
      previousMills1 = millis();
      
      lcd.print("TEMP1: ");
      lcd.print(temp1);
etc.......

MauroTec, dici cosi? (...spero di non aver capito una cosa per un'altra)

Ciao Antonio

Edit:
Sopra mi sa che ho scritto un fesseria la sintassi giusta dovrebbe essere la seguente
Code: [Select]

unsigned long previousMillis1 = 0; //Memorizza l'ultima volta che è stata avviata la scrittura LCD
unsigned long interval1 = 200;      //Intervallo di tempo per la scrittura sul display lcd
unsigned long previousMillis2 = 0; //Memorizza l'ultima volta che è stata avviata la scrittura serial
unsigned long interval2 = 3000;    //Intervallo di tempo per la scrittura sul serial monitor
//etc......
void setup() {
      lcd.begin(16,2);
      Serial.begin(9600);
//etc.....
void loop() {
      unsigned long currentMillis = millis();
      if(currentMillis - previousMillis1 > interval1) {
      previousMillis1 = currentMillis;
     
      lcd.print("TEMP1: ");
      lcd.print(temp1);
//etc.......
      unsigned long currentMillis = millis();
      if(currentMillis - previousMillis2 > interval2) {
      previousMillis2 = currentMillis;
     
      Serial.println("TEMP1: ");
      Serial.print(temp1);
//etc.......


Spero di non aver scritto 2 cavolate!
(in tal caso correggetemi cosi che io possa capire dove ho sbagliato)

Maurotec

Giusto l'ultimo.

PS: non ho controllato nel dettaglio tutto il codice ma al volo il tipo e la if e sembra tutto ok.

Ciao.

Antonio7882

Grazie MauroTec

Metto [Risolto] sul titolo del topic ...  ;)

Ciao Antonio

Go Up