Dalla staffa dell'anemometro parto con i tre fili del sensore di hall (alimentazione + e - e segnale), vorrei mettere anche una fotoresistenza per far chiudere la tenda quando cala il sole e la vorrei montare nella staffa dell'anemometro. Secondo voi, se faccio passare i tutti i fili assieme, lunghezza tratta di 5 metri, potrei avere interferenze fra i due segnali?
Per me puoi andare tranquillissimo, i sensori hall lavorano con correnti modestissime e il segnale della fotoresistenza lo filtrerai sicuramente passa-basso in analogico. Attento piuttosto a schermare bene tutti i segnali e a mettere a terra la staffa, altrimenti coi temporali rischi grossi dispiaceri. Tieni presente che il sensore di luce lo puoi fare anche con un led, funzionano anche come fotodiodi.
A te serve cogliere eventi sulla scala di diverse decine di minuti, mentre il segnale che avrai, soprattutto dopo
contenuto spettrale con frequenze molto elevate rispetto a quello che ti interessa. In assenza di precauzioni basta uno "spike" per credere che sia passato da notte a giorno o viceversa.
Per questo devi implementare via software un passa basso adatto. In pratica ti serve di accumulare in un registro
la media la tieni da parte in un array a intervalli anche
che puoi adattare o mal che vada tenere da parte per futuri usi.
Ovviamente dato che io sono il direttore supremo dell'UCAF
--
- Ciao, ho visto le tue foto su Facebook
chiamami al 347******9
Ah, pensavo semplicemente ad un RC (R serie, C verso massa) prima di entrare nel canale analogico dell'Arduino, utile ad abbattere crosstalk dall'Hall ed eventuale RF "captata". Visto che l'intensita' di luce ha tempi di variazione molto piu' lunghi dei fronti del segnale Hall, hai ampio margine di progetto: puoi permetterti costanti di tempo dell'ordine dei secondi.
Comunque il cavo ha il brutto vizio di fare da antenna... Ti suggerirei di usare dal controllore al sensore un cavo schermato con lo schermo collegato al negativo di alimentazione Hall e a terra. Dentro ci trasporti il +5, il segnale dell'Hall e il segnale della fotoresistenza.
Non vorrei fare l'uccello del malaugurio, ma secondo me il PLA non e' adatto a stare al sole e non e' abbastanza robusto per fare i braccetti di supporto. Ricordati che deve resistere a sole, pioggia e grandine. In caso puoi rifare i braccetti con del tondino di alluminio o inox.
Anch'io mi sono costruito da molto tempo i controllori per i tendoni da sole (ne ho due in casa, uno controlla un tendone, l'altro una coppia). Ho sempre usato anemometri commerciali: i primi si sono rotti dopo pochi anni con la grandine, i secondi sono fatti meglio e molto piu' durevoli. Ci ho aggiunto un sensore di pioggia autocostruito col filo di inox. Della luce non mi sono preoccupato, anche se sono un po' pentito. Il primo controllore l'ho fatto circa vent'anni fa, basato su micro ST6 e scheda filata. Nel 2011 li ho rifatti usando il micro C8051F350, perche' con quella famiglia Silabs avevo accumulato una discreta esperienza al lavoro e ancora non conoscevo Arduino (diciamo che lo disprezzavo per principio, ma ho poi cambiato radicalmente idea e ora sono fan).
segnale che avviene nell'ordine di diversi minuti mentre
vuoi farlo via software puoi fare come segue:
1) dichiari una variabile accumulatore che a inizio ciclo poni uguale a zero; ogni tot secondi, diciamo 10 s prendi il valore che misura l'illuminazione e lo sommi a quello
per un minuto, quindi sei volte in tutto.
2) Dividi il valore per 6 e ottieni il valore medio su un minuto. Ovviamente lo metti da parte e azzeri il registro per poter ricominciare.
3) "Nel frattempo" avrai dichiarato un array di dimensione M dello stesso tipo di dato, e inserisci il valore precedentemente trovato nella cella di indice "i".
diverso da quello precedente, che serve a filtrare le
incrementare i in un tempo tale che considerando la dimensione M dell'array tu possa avere sott'occhio gli ultimi 10-15 min (che chiamo Dt).
5) Adesso hai M valori su un intervallo degli ultimi Dt minuti. Non solo con il primo passo hai eliminato gli spikes e altre componenti ad alta frequenza, ma osservando l'array e gli M valori puoi:
e confrontarlo con il valore corrispondente ad alba/tramonto, a quel punto accendere o spegnere.
Nota che puoi esaminare se i valori crescono o decrescono quindi puoi anche avere anticipo o ritardo differenti tra alba e tramonto. Non solo, se hai abbastanza valori puoi distinguere nuvole passeggere che potrebbero farti fare la cosa sbagliata.
7) Hai realizzato un passa basso nel dominio del tempo, giusto per un po' di soddisfazione personale :D
--
- Ciao, ho visto le tue foto su Facebook
chiamami al 347******9
imparare ad usare gli array. Intanto, nel mio piccolino, sono andato avanti con il programma, sono riuscito a far chiudere la tenda sia col vento oltre un set determinato da un trimmer, che dalla luce, sempre determinata da un trimmer, e
Non mi e` chiaro il perche` dell'array di medie. Se uso un semplice buffer circolare di letture non ho gia`la media mobile? Certo e` la media mobile del periodo delle N letture e non di un periodo piu` grande. E' questo che intendevi (la media su un periodo molto piu` lungo)?
con un solo array potrebbe diventare difficile distinguere gli effetti. Credo che almeno per la luce serva un periodo
considerando il passaggio di nubi; ipotizzando un array di
arduino o un piccolo controllore, ci sarebbe un campione
disturbo questo potrebbe falsare le valutazioni sui dati.
In questo caso come minimo almeno io calcolerei i parametri di una retta di regressione e anche la deviazione standard, e a partire da quelli cercare di capire cosa sta succedendo. Invece con un array piccolo di
confronti dei valori adiacenti.
filtraggio molto affidabile del segnale in ingresso (che potrebbe benissimo essere analogico) un solo array
Oh, e poi l'ho detto che io sono il capo dell'Ufficio
problemi (meritati) per questa mia tendenza :D
--
- Ciao, ho visto le tue foto su Facebook
chiamami al 347******9
In effetti non serve un array ma una semplice variabile di tipo sufficientemente "ampio" che userai per tenere la somma dei valori letti. Qui uso delle float...
float lettura,somma,media; int n;
somma=0; n=0; do n++; "Esegui la lettura" somma=somma+lettura; while (n==10); media=somma/10.0;
Ma comunque... cosi` effettui tutte le letture una dietro l'altra, impiegando, boh, qualche microsecondo?
Il rumore che elimini/riduci con questo sistema e` solo quello di quantizzazione dell'ADC (l'ultimo bit di ogni misura e` sempre "saltellante"), ma non elimini il ronzio di rete o eventuali disturbi esterni di durata comparabile o maggiore del tuo pacchetto di letture".
Per eliminare il ronzio 50Hz si devono fare due misure distanti tra loro esattamente 10ms e farne la media, questo processo va considerato un singolo campione.
Sono passati tanti anni e, come per tutti i miei progetti home-made, la documentazione lascia a desiderare. Oggi mi sono fatto coraggio e ho provato a mettere insieme il materiale e ad aggiornare lo schema (l'originale era modificato a penna sulla stampa...) e ho pubblicato tutto su github:
formatting link
Per quanto riguarda l'altra tua domanda: lo stampato l'ho progettato io, ma me lo son fatto produrre da una ditta online, al tempo usavo Olimex. Come noterai dalle foto, c'e' una importante modifica filata: all'inizio avevo previsto di alzare i tendoni in caso di allarme, ma di abbassarli solo a mano. Poi mi sono pentito ed ho aggiunto il rele' K3 dello schema col relativo transistor pilota. Nelle foto si vedono su una basettina che sporge dal PCB principale. Non ho pubblicato il PCB, perche' ho solo la versione senza il rele' K3, che poi ho modificato tagliando qualche pista per inserire i contatti di K3. Schema e PCB li ho fatti con Altium Designer.
Per la logica, prova a guardare un po' main.c e vedi se la capisci, e' abbastanza commentato. Purtroppo non ho una descrizione pronta e farla adesso mi porterebbe via parecchio tempo. Qualcosa c'e' anche:
- nella parte finale di init.c (routine di interrupt del timer), ossia la logica di interpretazione dei pulsanti in funzione dello stato corrente. Il resto di init.c e' specifico del micro usato e sono inizializzazioni
- nella routine di interrupt in F35x_ADC0.c: filtri digitali degli A/D e comando DAC.
A proposito di filtri e DAC: la lettura del sensore di pioggia e' effettuata applicando una tensione AC prodotta col DAC interno al micro e misurando la corrente come differenza tra due canali ADC. Questo e' fatto per evitare di applicare continua al sensore, che causerebbe spiacevoli effetti galvanici.
Se la cosa ti interessa, chiedimi pure chiarimenti su punti specifici.
Questo sotto esegue una misura ogni loop del programma. Puoi allungare l'intervallo di media aumentando n oppure eseguendo il codice per esempio ogni 4 loop invece che ad ognuno, mediante un semplice contatore.
int n=0, lettura, media; uint64_t somma=0;
.... // Nel loop
if (n==10) { media=somma/10; // Gestisci la media... somma=0; n=0; } else { lettura=.... // esegui la lettura somma=somma+lettura; n++; }
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.