Pages: 1 ... 3 4 [5]   Go Down
Author Topic: Loop nel Loop  (Read 3819 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10463
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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(smiley-cool
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';

Logged

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

Offline Offline
God Member
*****
Karma: 0
Posts: 589
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley 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 smiley
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 smiley
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?
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10463
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley 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 smiley
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 smiley
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
Logged

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

Offline Offline
God Member
*****
Karma: 0
Posts: 589
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
  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 smiley-grin La rileggo domani smiley-kiss
Notte Lesto e grazie!
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10463
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :-)
Logged

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

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10463
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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++;
}

Logged

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

Offline Offline
God Member
*****
Karma: 0
Posts: 589
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

questo mi ritorna year = 2011 e month = 12

Code:
  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 smiley
Al massimo, e qua ammetto la mia pigrizia, non ho capito quel cavolo di + 'O' a che serve smiley-razz
 
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10463
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

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

Pages: 1 ... 3 4 [5]   Go Up
Jump to: