Go Down

Topic: Loop nel Loop (Read 4545 times) previous topic - next topic

lesto

File myFile;

DHT dht_in (DHTPIN_in, DHTTYPE_in);
DHT dht_out (DHTPIN_out, DHTTYPE_out);

byte T1_SENSOR[8] = {
  0x10,0x72,0x08,0xBA,0x01,0x08,0x00,0x64};
byte T2_SENSOR[8] = {
  0x10,0x25,0x06,0xBA,0x01,0x08,0x00,0x6D};
RTC_DS1307 RTC;

queste possono essere spostate all'interno del codice dove le usi. Considera che la visibilità sono le {}; ovvero una variabile dichiarata in un blocco {} muore quando il blocco termina, rilasciando la ram. Se vuoi puoi rimpire il tuo codice di blocchi arbitrari, ma piuttosto di solito si usano i blocchi degli if, dei cicli, o funzioni. Sopratutto la SD.begin, chiamala solo quando ti serve, poi fai una SD.close(), etc.. questo vale per tutti quindi

OneWire  ONE_WIRE_BUS(8)
ShiftRegLCD srlcd(2, 3, TWO_WIRE, 2 );


#include <Wire.h>
sicura che ti serva quasta include?


quì c'è un errore:
nomefilelog[2] = year%10 + '0';
nomefilelog[3] = year%10 + '0';

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

DanielaES

Probabilmente sono io che non faccio le operazioni giuste ma spostando secondo le tue indicazioni ottengo bene o male sempre lo stesso errore in compilazione:

'xxxx' was not declared in this scope
per i dht perché c'è un dht.begin nel setup
per RTC perché come sopra.
Gli indirizzi delle sonde dallas e il myfile me li fa spostare e si compila correttamente. Ma al momento non ho modo di provare il codice :) Sto facendo l'endurance test


#include <Wire.h>
sicura che ti serva quasta include?


Se non sbaglio quella veniva con l'RTC /lib adafruit/ togliendola ed eliminando l'inizializzazione nel setup non si compila il codice.

Quote

quì c'è un errore:
nomefilelog[2] = year%10 + '0';
nomefilelog[3] = year%10 + '0';


Più che errore... mistero :)
Citando l'autore del codice:
Quote

as for the year, if i use the /10 suggested i get this.
Code:
    filename[0] = year/10 + '0';
    filename[1] = year%10 + '0';
Code:

"ù1"
I am using this as I assume no registries before year 2000


Siccome nemmeno io dovevo backloggare nel tempo prima dell'anno 2000... ho lasciato quello :)
In realtà c'è un sospetto che il codice funzioni solo perché "siamo" nel 2011, quindi in realtà dovrei sostituirlo con:

filename[2] = (year-2000)/10 + '0';

Mi ero dimenticata di chiedervi conferma, ergo... confermate?

Ma le modifiche suggerite, in linea di massima, produrrebbero un cambiamento significativo?
O sono più delle modifiche di stile generale che andrebbero imparate?

lesto


Probabilmente sono io che non faccio le operazioni giuste ma spostando secondo le tue indicazioni ottengo bene o male sempre lo stesso errore in compilazione:

'xxxx' was not declared in this scope
per i dht perché c'è un dht.begin nel setup
per RTC perché come sopra.
Gli indirizzi delle sonde dallas e il myfile me li fa spostare e si compila correttamente. Ma al momento non ho modo di provare il codice :) Sto facendo l'endurance test

no, questo errore indica che il blocco in cui stai usando la variabile è più esterno al blocco in cui l'hai dichiaratata (non è visibile). il begin non c'entra niente.



#include <Wire.h>
sicura che ti serva quasta include?


Se non sbaglio quella veniva con l'RTC /lib adafruit/ togliendola ed eliminando l'inizializzazione nel setup non si compila il codice.

Quote

quì c'è un errore:
nomefilelog[2] = year%10 + '0';
nomefilelog[3] = year%10 + '0';


Più che errore... mistero :)
Citando l'autore del codice:
Quote

as for the year, if i use the /10 suggested i get this.
Code:
    filename[0] = year/10 + '0';
    filename[1] = year%10 + '0';
Code:

"ù1"
I am using this as I assume no registries before year 2000


Siccome nemmeno io dovevo backloggare nel tempo prima dell'anno 2000... ho lasciato quello :)
In realtà c'è un sospetto che il codice funzioni solo perché "siamo" nel 2011, quindi in realtà dovrei sostituirlo con:

filename[2] = (year-2000)/10 + '0';

Mi ero dimenticata di chiedervi conferma, ergo... confermate?

Ma le modifiche suggerite, in linea di massima, produrrebbero un cambiamento significativo?
O sono più delle modifiche di stile generale che andrebbero imparate?


infatti c'è l'errore:

tu fai
nomefilelog[2] = year%10 + '0';
nomefilelog[3] = year%10 + '0';
con il resto della divisione di un qualsiasi numero per 10 ottieni la cifra più a sinistra, quindi l'unità, che metterai in nomefilelog[3]... ma non stai estrapolando correttamente l'unità:
per ottenere l'unità il metodo corretto è dividere per dieci, in modo da eliminare l'unità e rendere la decina la nuova unità, e poi usare il modulo per estrarre l'unità!
nomefilelog[2] = ((year/10)%10) + '0';
per esempio per il centennio:
nomefilelog[1] = ((year/100)%10) + '0';
e il m,illennio:
nomefilelog[0] = ((year/1000)%10) + '0';

ps. l'errore vale anche per il calcolo del mese
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

DanielaES


no, questo errore indica che il blocco in cui stai usando la variabile è più esterno al blocco in cui l'hai dichiaratata (non è visibile). il begin non c'entra niente.


boh... dicevo questo perché è l'IDE che mi evidenzia in giallo i vari begin

Code: [Select]
  RTC.begin();
  dht_in.begin();
  dht_out.begin();


Quote

infatti c'è l'errore:

tu fai
nomefilelog[2] = year%10 + '0';
nomefilelog[3] = year%10 + '0';
con il resto della divisione di un qualsiasi numero per 10 ottieni la cifra più a sinistra, quindi l'unità, che metterai in nomefilelog[3]... ma non stai estrapolando correttamente l'unità:
per ottenere l'unità il metodo corretto è dividere per dieci, in modo da eliminare l'unità e rendere la decina la nuova unità, e poi usare il modulo per estrarre l'unità!
nomefilelog[2] = ((year/10)%10) + '0';
per esempio per il centennio:
nomefilelog[1] = ((year/100)%10) + '0';
e il m,illennio:
nomefilelog[0] = ((year/1000)%10) + '0';

ps. l'errore vale anche per il calcolo del mese


Oh mamma. Questa la devo capire con calma :D La rileggo domani :*
Notte Lesto e grazie!

lesto

oddio ho confuso, anzichè scrivere decina il mio cervello si è bloccato su unità... intendevo che sbagli ad estrapolare la decina, l'unità è ok

si evidenzia i begin perchè quando arriva a quella istruzione non trova la variabile...

quando ti serve la lettura, crei la variabile, gli dai il begin, la usi, se serve dai il close e poi via, altro giro a ltra corsa :-)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

lesto

la matematica è molto semplice:
allora funziona così
prendiamo il numero 123456 ed estrapoliamo tutti suoi numeri: prima di tutto vogliamo sapere quanti sono... è abbasatnza facile.
se noi lo dividiamo per 10, e prendiamo solo la sua parte intera del risultato, il numero di divisioni per 10 che riusciremo a fare prima che il risultato sia 0 è il numero delle sue cifre, quindi:
int ris = 123456; //notare che ho usato int, ovvero un numero solo di parti intere
int numeroCifre=0;
while (ris>0){
   ris=ris/10; //o anche ris/=10;
   numeroCifre++;
}

ma se la divisione per 10 elimina la cifra più a sinistra, dove va a finire? semplice, è il resto della divisione, ovvero la parte dopo la virgola. Ma come possiamo ottenere la parte dopo la virgola di una divisione? con l'operatore %.
Quindi, contiamo il numero di cifre, e stampiamole una per una via seriale:

int ris = 123456; //notare che ho usato int, ovvero un numero solo di parti intere
int numeroCifre=0;
char cifra;
while (ris>0){
   cifra = ris%10 + '0';
   Serial.print(cifra);
   ris=ris/10; //o anche ris/=10;
   numeroCifre++;
}

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

DanielaES

Ok, questo l'ho capito, quello che mi sfugge è perché dici che il codice che ho su ora è sbagliato...

Code: [Select]

DateTime now = RTC.now();
  int year = now.year();
  int month = now.month();


questo mi ritorna year = 2011 e month = 12

Code: [Select]

  nomefilelog[0] = '2';
  nomefilelog[1] = '0';
  nomefilelog[2] = (year-2000)/10 + '0';
  nomefilelog[3] = year%10 + '0';
  nomefilelog[4] = month/10 + '0';
  nomefilelog[5] = month%10 + '0';



Ora siccome io so già di quanti numeri è composta una data, non ho bisogno di ricavarli.
Inizio a scrivere 20
poi aggiungo (2011-2000)/10 = 1
poi aggiungo 2011%10 = 1  // se fossimo nel 2012 il modulo mi darebbe 2
Per i mesi, che sono valori a due cifre, siamo già a posto no?
Non capisco dove sta l'errore :)
Al massimo, e qua ammetto la mia pigrizia, non ho capito quel cavolo di + 'O' a che serve :P
 

lesto

hai ragione mi sono ingannato con (year-2000), che comunque funziona solo per anni > di 2000  :smiley-mr-green:

il +'0' (zero) è semplice: tu hai un numero in formato binario, ma la seriale parla in ascii http://it.wikipedia.org/wiki/ASCII#Stampabili
come puoi vedere per stampare uno 0, in realtà devi stampare il numero corrispondente, ovvero il 48. Il bello è che se non ti ricordi il valore corrispondente, e per rendere il codice più leggibile, se scrivi '0' oppure 'a' o altro ottieni il valoreche ti serve.

ora, dato che i numeri sono tutti in fila da 0 a 9, se al numero da trasformare agguingi 48, noterai che automaticamente (per i numeri a una cifra) otterrai il corrispondente valore ascii.

tu mi dirai: ma io ho stampato tanti di quegli int con print... certo, ma finchè era all'interno di una variabile int a fare questo gioco ci pensava la print, ora visto che li passi alla print sotto forma di array devi gestirtela a mano

in compenso è facile da implementare il cifrario di cesare: http://it.wikipedia.org/wiki/Cifrario_di_Cesare
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up