Sistema di acquisizione ISTITUTO TECNICO INDUSTRIALE STATALE “CELESTINO ROSATELI” CORSO DI ELETTRONICA & TELECOMUNICAZIONI Esame di Maturità A.S 2008 – 2009 FATTORI MARCO Radio sveglia con monitoraggio della temperatura 1 Sistema di acquisizione Introduzione Il progetto riguarda la realizzazione di una radio sveglia, con l’utilizzo di un microcontrollore, il quale ha il compito di gestire l’acquisizione della temperatura ambiente e la visualizzazione attraverso un display LCD alfanumerico. Il µC è provvisto di un’uscita seriale (RS232), attraverso la quale è interfacciato con il PC: la linea di unidirezionale di trasmissione seriale, è impiegata per l’invio dei valori della temperatura acquisiti. Il computer collegato, una volta ricevuti i dati, si occuperà della loro memorizzazione in un database, provvedendo ad aggiornare in tempo reale i risultati, su un sito internet. . AD 590 I/V CONV KEYBOARD RA0 PIC 16F876A RB3 RB4 RB5 RB6 RC0 RC1 RC4 RC5 RC6 RC7 RA5 RA2 DISPLAY LCD 16X2 LIGHT DRIVER FM TUNER DRIVER RA4 FM TUNER RECEIVER RS232 GESTIONE VISUAL BASIC (PC) LINE DRIVER RETE INTERNET CARATTERISTICHE DEL SISTEMA E PRINCIPALI PROBLEMATICHE Il sistema di acquisizione realizzato prevede il rilevamento della temperatura e la sua pubblicazione online in tempo reale. Ciò ha reso necessaria la realizzazione di un sito internet: è stato quindi scelto di realizzare pagine dinamiche in linguaggio asp, per poter utilizzare il database di Microsoft Access, essenziale per la memorizzazione della temperatura. Il software che si occupa della creazione del database è stato realizzato con Microsoft Visual Basic, il quale è in grado di interagire con altri programmi del pacchetto microsoft. Ultima importante caratteristica, è la scelta del linguaggio di programmazione del microcontrollore e il relativo compilatore: realizzare il software di gestione attraverso linguaggio macchina è oltremodo laborioso e non esente da errori. La scelta quindi è stata quella di programmare il micro attraverso un linguaggio ad alto livello, che permette di superare le problematiche sopraccitate: la decisione è stata quindi quella di realizzare il programma del Pic in C attraverso il compilatore CCS. Una volta definite le specifiche di progetto è stato necessario valutare alcune problematiche da tenere fortemente in considerazione. Innanzitutto le principali limitazioni per la realizzazione del progetto, sono le dimensioni: è evidente che una radio sveglia debba essere molto compatta oltre che funzionale. Inoltre va considerato che le tecniche realizzative a disposizione non permettono un’integrazione a larga scala. E’ necessario perciò ridurre al minimo la circuteria e l’ingombro stesso. 2 Sistema di acquisizione Altra importante problematica riguarda la realizzazione del ricevitore radio: circuiti ad alta frequenza estremamente critici e laboriosi in fase di taratura, possono essere facilmente alterati e risultare non correttamente funzionanti. La scelta è così caduta sull’utilizzo dell’integrato tda7000, il quale garantisce ottime prestazioni e necessita di pochissimi componenti per il funzionamento. In ultimo, la frequenza di lavoro: per motivi puramente funzionali che verranno chiariti in seguito, è stato adottato un quarzo per il funzionamento del µC, di 32768HZ. Come è intuibile, questo limita enormemente la risposta del sistema il quale sarà facilmente suscettibile a rallentamenti: a questo proposito si è reso necessario un processo di “snellitura”del software di gestione per permetterne il corretto funzionamento. TRASDUTTORE DI TEMPERATURA Il sensore di temperatura scelto nel progetto è l’AD590. La scelta di questo sensore è dovuta alla semplicità circuitale, che ne permette il relativo condizionamento, oltre che alla relativa economicità e disponibilità. Questo sensore, è prodotto dall'Analog Devices in forma integrata, è realizzato con materiale semiconduttore. Esso fornisce corrente proporzionale alla variazione di temperatura, espressa in gradi Kelvin. Il funzionamento di tale dispositivo si basa sulla variazione di tensione, ai capi di una giunzione polarizzata direttamente, in funzione della temperatura: in particolare tale variazione è nell’ordine di circa -2,3 mV/K e si mantiene con buona linearità in tutto il range di funzionamento del sensore. 3 Sistema di acquisizione 4 Sistema di acquisizione CIRCUITO DI CONDIZIONAMENTO Per il dimensionamento del circuito di condizionamento è innanzitutto necessario stabilire il range di temperatura da misurare, così da minimizzare l’errore di acquisizione e renderla il più precisa possibile. Dato che si vuole realizzare una radio sveglia realmente funzionante si è deciso di acquisire la temperatura con una scala che va dai -20°C ai +50°C. Prima di eseguire il dimensionamento del circuito va precisato, che la sua uscita è destinata ad una conversione analogico digitale eseguita direttamente dal µC e che quindi avrà una dinamica di ingresso di 0÷5V In particolare quindi il circuito andrà dimensionato per ottenere 0V in uscita in funzione di una temperatura di -20°C, e 5V a 50°C. Va poi ricordato che l’uscita del sensore è in corrente, mentre l’uscita del circuito di condizionamento deve necessariamente essere, in tensione. Per garantire ciò, ci si può servire di un convertitore I/V: nel nostro caso il circuito più semplice e discretamente valido si ha attraverso l’utilizzo di un’ amplificatore operazionale, del quale viene sfruttata la caratteristica configurazione invertente. Il circuito rappresentato, ha il seguente funzionamento. Definito l’estremo inferiore del range (-20°C) è possibile calcolare la corrente fornita dal sensore, che vale (273-20)µA, ossia 253µA. Ora osservando lo schema si nota che tenendo conto delle proprietà fondamentali dell’AO e dei sistemi retroazionati, i due ingressi sono allo stesso potenziale, quindi essendo l’ingresso non invertente connesso a massa, anche l’ingresso non invertente sarà in una condizione di massa virtuale. Vcc Imponendo una corrente I=253µA definita come (con Vcc = 5V), si determina il valore di R3 + R 2 Req ≈19,76KΩ. Il trimmer presente consente di affinare il valore di Req sperimentalmente: questa operazione è necessaria per togliere l’offset dal circuito e far si che a -20°C la corrente che circola sull’anello di reazione sia nulla, portando l’operazionale a 0V in uscita. Ora prendendo in considerazione l’estremo superiore della temperatura (50°C) possiamo valutare la corrente fornita dall’AD590: il valore assunto è di circa I=323µA. Ciò comporta che essendo già nel circuito la corrente imposta precedentemente, sul ramo di retro azione circolerà la differenza tra le 2 correnti (323-253)µA, che sarà quindi uguale a circa 70µA. Impostando ora un una Rfeq=R1+R4 in modo tale da ottenere una tensione di uscita di 5V con la corrente calcolata precedentemente, si otterà il valore di uscita desiderato. Anche in questo caso il trimmer inserito permette di rifinire la taratura. Re q = 5 ⋅ 10 6 = 71,48KΩ 70 70 ⋅ 10 −6 = 5 5 Re q Sistema di acquisizione MICROCONTROLLORE Il microcontrollore utilizzato è il PIC 16F876A, prodotto dalla Microchip. Si tratta di uno dei più completi pic della famiglia 16, prodotto in diversi package a 28 pin: possiede infatti, al suo interno, 3 porte di I/O, per un totale di 22 linee bidirezionali, 5 canali analogici multiplexabili via software ( 8 per la versione a 40 pin) , ben 3 timer e molto altro… 6 Sistema di acquisizione LINEE DI I/O Il µC presenta 3 linee bi-direzionali di comunicazioni. Come si nota dall’architettura, questi pin possono svolgere diverse funzioni a seconda della configurazione ad essi associata. Un esempio è la portaA. I 5 pin possono essere configurati come ingressi analogici, oppure semplici ingressi digitali. Inoltre la linea RA4 ad esempio può essere interessata dall’inserimento di un clock esterno per il comando di timer0 7 Sistema di acquisizione CONVERTITORE A/D Il convertitore A/D contenuto all’interno del µC incorpora in se il circuito di Sample and Hold spesso necessario per l’acquisizione delle grandezze analogiche. Per un corretto funzionamento è consigliabile non connettere sorgenti analogiche con impedenza d’uscita superiore ai 2,5kΩ, direttamente ma servirsi eventualmente di un circuito buffer. La Figura 11-1 evidenzia 2 importanti caratteristiche del convertitore: +Vref e -Vref , possono essere utilizzate per modificare la dinamica d’ingresso dell’ADC, mentre i 5 ingressi analogici possono essere selezionati attraverso il multiplexer analogico, comandabile attraverso (CH2-CH1-CH0), il tutto ovviamente tramite software. I tempi di campionamento e conversione da prendere in considerazione sono nell’ordine di: È intuibile che questi risultati sono ottenuti con la massima frequenza di lavoro del µC che è di 20Mhz. 8 Sistema di acquisizione TIMER Sono dei contatori che vengono incrementati \ decrementati, con una frequenza definita dall’utente. Le caratteristiche che rendono i timer largamente utilizzati nelle applicazioni, sono l’elevata precisione e la loro operatività in contemporanea con l’esecuzione del programma. Questa tipologia di microcontrollori impiega 4 cicli di clock per l’esecuzione di un’istruzione, dato fondamentale per la gestione dei timers: è possibile gestire individualmente, previa opportuna configurazione ognuno di questi. In particolare la figura 5-1 mostra la configurazione di TIMER0, architettura però, che è valevole per tutti i 3 timer. E’ possibile ridurre la frequenza di incremento del timer modificando opportunamente alcuni bit del registro OPTION: questi servono ad abilitare un eventuale prescaler (divisore di frequenza), oppure è possibile utilizzare un clock esterno all’integrato, nel caso specifico proveniente dal pin RA4. Nel nostro caso è stato scelto un quarzo da 32768 Hz, per il seguente motivo: dispositivi come orologi, sveglie… etc necessitano di una elevata precisione, altrimenti la loro affidabilità viene meno. Scegliendo un’oscillatore al quarzo di tale valore è possibile grazie all’ausilio del prescaler impostato su un valore di 32, e della variabile di conteggio di TIMER0, caricata al valore massimo, è stato possibile raggiungere un interrupt per overflow, di esattamente un secondo. Fosc 32768 = = 8192 Hz 4 4 Fosc 1 8192 ⋅ = = 256 Hz 4 32 prescaler 9 1 = 0,00390625s 256 Ttmr = 0,00390625 ⋅ 256 = 1s Tist = Sistema di acquisizione INTERRUPT Gli interrupt sono delle particolari modalità di funzionamento del programma in esecuzione. Essi vengono spesso utilizzati il controllo di alcune particolari condizioni del µC, durante il suo funzionamento. Ad ogni interrupt, viene associata una flag, come segnalatore di richiesta avvenuta: vengono perciò realizzate routine speciali che vengono eseguite solamente in queste particolare situazioni. Nel progetto sono state utilizzate 3 diverse modalità di interrupt: TMR0 INTERRUPT: generato in caso di overflow (superamento della capacità) di timer0 PORTB INTERRUPT: generato dal cambiamento di stato della linea B compresa tra RB4-RB7 TIMER1 OVERFLOW: interrupt generato dal superamento della capacità di TIMER1 Nel primo caso il TIMER0 è stato utilizzato per la gestione dell’orario, come specificato in precedenza grazie all’opportuno prescaler inserito. L’interrupt sulla linea B, è stato utilizzato per la gestione della tastiera, che permette di rimpostare l’orario, attivare 2 diverse modalità dell’apparato, di abilitare la retro illuminazione del display ed in ultimo l’abilitazione e lo spegnimento dell’allarme. Infine l’interrupt su TIMER1, è stata utilizzato per gestire la temporizzazione della retro illuminazione dell’LCD. AMBIENTE DI PROGRAMMAZIONE E COMPILATORE Il mercato offre la possibilità di programmare i µC con tutti i principali linguaggi di programmazione. L’ambiente di sviluppo utilizzato è il CCS che permette la compilazione dei microcontrollori in C. Il software, integrato con un apposito pacchetto chiamato IDE UTILITIES, implementa la configurazione grafica del µC, come ad esempio la direzione delle linee di I\O, il quarzo utilizzato, i vari tipi di interrupt i timer utilizzati… L’ambiente è completo di diversi modelli di gestione (es. per display LCD) per i dispositivi di interfacciamento, o ad esempio, funzioni precostituite per la gestione dei ritardi software. Per la programmazione del pic, è stato utilizzato l’ambiente di lavoro fornito dalla Microchip, Mplab 8 che permette di compilare e creare il file Hex, per la programmazione del µC, utilizzando direttamente il compilatore CCS. 10 Sistema di acquisizione DISPLAY LCD Il display utilizzato è compatibile con lo standard HITACHI 44780. Esistono diversi formati che si differenziano per il numero di caratteri e per le righe disponibili in visualizzazione su di ognuno. Quello utilizzato è un 16 caratteri per 2 righe: questo dispositivo consente la visualizzazione di caratteri alfanumerici divisi in matrici di 5x8 pixel. Il dispositivo presenta 14 pin di controllo e di invio dati e 2 pin di retro illuminazione (pin15 [light+], pin 16 [light-]. In particolare: Per ragioni pratiche, è stata scelta una particolare configurazione dell’lcd che prevede il non utilizzo del pin R\W, il quale viene posto direttamente a GND, e la comunicazione dei dati, attraverso 4 linee (D4-D7). Questa modalità consente di escludere dall’utilizzo le altre 4 linee dati, inviando il cosiddetto NIBBLE, ossia un pacchetto di soli 4 bit: il byte contenente il codice ascii, del carattere da visualizzare, viene diviso in due semi-byte dal micro, il quale attraverso un’opportuna configurazione provvede ad inviare i due pacchetti all’LCD. Il display, inoltre, è provvisto di un circuito di codifica che riserva in memoria i codici ascii fondamentali, offrendo inoltre la possibilità di editare eventuali caratteri, ed inserirli in RAM, per la loro visualizzazione. 11 Sistema di acquisizione FM TUNER Il dispositivo di allarme è stato realizzato con un ricevitore radio per frequenze che vanno da 88 ÷ 108 MHz. L’integrato utilizzato è il TDA7000, il quale integra in se tutte le parti fondamentali per la demodulazione in frequenza dei segnali. Si tratta di un circuito supereterodina che presenta lo stadio a frequenze intermedie di circa 70Khz, che consente l’utilizzo di semplici filtri attivi realizzati con operazionali, in esso integrati. Queste caratteristiche permettono di eliminare tutte le bobine di media frequenza, aumentandone la semplicità circuitale. L’integrato contiene poi un circuito FLL (Frequency Locked Loop) che rende più stabile l’aggancio in frequenza della stazione captata. In uscita al ricevitore è stato associato un finale audio integrato (TDA2003) in grado di pilotare altoparlanti con impedenze di 4 Ω, con una potenza di uscita di circa 1W 12 Sistema di acquisizione I modulatori supereterodina a modulazione di frequenza, basano i loro funzionamento sfruttando il fenomeno dei battimenti,il quale consente la conversione f / f con frequenza intermedia fissa indipendente dal segnale in ingresso, che nel caso del TDA7000 è di soli 70Khz. Il segnale in ingresso all’antenna giunge ad un circuito accordato LC, denominato preselettore, che ha il compito di sintonizzarsi sulla f P (frequenza portante). Nel nostro caso le portanti desiderate, occupano una gamma di frequenze (88 ÷ 108) MHz. L’oscillatore locale, è un circuito risonante LC, accordato sulla frequenza portante in ingresso del ricevitore. Il circuito di sintonia e l’oscillatore locale, sono interessati dalla stessa variazione di frequenza, mantenendo così una frequenza fissa in uscita dal circuito mixer. Quest’ultimo è un dispositivo non lineare che accetta 2 segnali in ingresso (uno a radio frequenza Fm) ed uno sinusoidale, generato dall’oscillatore locale, che produce le armoniche con frequenze somma e differenza fi = f LO ± f P Il segnale a fi risultante che viene preso in considerazione è quello dato dalla differenza dei segnali in ingresso, consentendo così di ottenerne così uno d’uscita a frequenza molto minore. Va ricordato che il segnale modulato in frequenza presenta una variazione di frequenza da quella portante, proporzionare all’ampiezza del segnale d’ingresso. f M = f P ± Δf L’uscita del circuito del mixer presenta quindi il segnale a fi nel quale è ancora presente la variazione di frequenza Δf data dalla modulazione. Questo degnale viene successivamente amplificato con un filtro attivo realizzato ad operazionali, sempre integrati nel chip. L’inviluppo ad ampiezza costante ma a frequenza variabile, arriva al circuito discriminatore, che oltre a demodulare fornendo un’uscita a bassa frequenza, si occupa del controllo dell’oscillatore. Questo, è controllato direttamente tramite un diodo varicap, che cambi la sua capacità in funzione della tensione di polarizzazione inversa. Per prevenire eventuali disallineamenti dell’oscillatore, affinché il ricevitore rimanga sintonizzato correttamente sulla frequenza portante desiderata, il CAF (controllo automatico della frequenza) applica un controllo indiretto, limitandone la variazione. La presenza del circuito CAG(controllo automatico dell’ampiezza), garantisce un controllo sul segnale di uscita per evitarne la distorsione. Infine sull’uscita del dispositivo è applicata anche una rete di deenfasi, necessaria per attenuare gli acuti sempre in eccesso, ed esaltare le frequenze più basse, in modo da ottenere un segnale di Bf ad alta fedeltà. 13 Sistema di acquisizione TDA 2003 14 Sistema di acquisizione RS232 (LINE DRIVER) L’RSR232 è uno standard di comunicazione seriale che permette l’invio di dati sotto forma di un treno di impulsi. Il protocollo è definito in logica negativa: livello alto –12 V (Mark), livello basso +12 V (Space). In assenza di trasmissione la linea Tx si trova nello stato logico alto. Esistono 2 tipi di modalità di trasmissione: asincrone e sincrone. Nel primo caso la comunicazione avviene senza sincronia tra il trasmettitore ed il ricevitore, i dati vengono perciò formattati e spediti sulla linea. Nel caso di trasmissione sincrona la comunicazione tra ricevitore e trasmettitore è sincronizzata attraverso un segnale di clock. Le caratteristiche della comunicazione seriale sono il Baud rate, che definisce la velocità di trasmissione in b/s e il controllo di flusso. Questo può essere, hardware, Xon Xoff oppure disabilitato: si tratta del controllo sulla comunicazione della linea e sui dati trasmessi. La trasmissione seriale avviene includendo prima di ogni sequenza dati, un bit di start, un eventuale bit di parità per il controllo sugli errori ed un bit di stop, o più, alla fine. I dati vengono suddivisi in gruppi di 7, o 8 bit a seconda della configurazione utilizzata. I livelli logici dei segnali provenienti dalla porta seriale, vanno adattati, per essere collegati con l’elettronica di tipo TTL. E’ necessario perciò un circuito driver che può essere realizzato in diverse modalità, e che abbia la funzione di interfacciamento tra i due livelli: l’integrato scelto per effettuare questo adattamento è il MAX232, prodotto dalla Maxim. Si tratta di un integrato che lavora su un circuito a pompa di carica, in grado di fornire livelli compatibili con la porta seriale con la sola alimentazione di +5V, e con la connessione di diversi condensatori necessari per il funzionamento. 15 Sistema di acquisizione 16 Sistema di acquisizione SOFTWARE DI GESTIONE DEL µC START Configurazione µC Porte I/O, timer, interrupt, RS232, ADC Int Timer0? Secondi ++ INCREMENTO ORARIO SI NO Int Abilità Int TMR1 Controlla RB3 e Definisci modalità 0 Clock - 1 Sveglia Abilita retroilluminazione SI RB? NO Disabilita retroilluminazione display RB4 ==1? Int Timer1? Si NO Si Ore ++ / AOre ++ a seconda della modalità NO Read ADC RA0 temperatura Send temperatura RS232 SI RB5 ==1? SI Minuti ++ / AMinuti ++ a seconda della modalità NO Secondi ==59? RB6 ==1? NO SI NO Visualizza Orario E temperatura sul display lcd Abilita Retroilluminazione Display 17 Abilita/disabilita Ricevitore FM Sistema di acquisizione SOFTWARE DI ACQUISIZIONE IN VISUAL BASIC Ultimata la realizzazione del prototipo, essendo questo dotato di interfaccia RS232, viene eseguito il collegamento con il PC, mediante la porta seriale per poter ricevere i dati acquisiti e aggiornarli sul sito internet. Per svolgere queste operazioni è stato scritto un programma in Visual Basic in grado di memorizzare i dati in un database di Microsoft Access. ACQUISIZIONE RS 232 DATABASE ACCESS AGGIORNAMENTO SITO ACQUISIZIONE RS232 Innanzitutto va analizzata la routine di acquisizione tramite rs232, possibile grazie al controllo integrato nell’ambiente, denominato MSCOMM32. Le proprietà fondamentali sono le seguenti: MSComm1.CommPort = seleziona il numero della porta COM da utilizzare MSComm1.Settings = "baud rate, bit di parità, numero di bit ,bit di stop" imposta le caratteristiche della comunicazione seriale MSComm1.PortOpen = abilita/disabilita la porta seriale alla comunicazione MSComm1.Input= legge e contemporaneamente a svuota il buffer della seriale MSComm1.Output= utilizzata per la scrittura seriale Inoltre questo controllo permette di gestire la ricezione seriale attraverso l’evento OnComm(), evitando il continuo monitoraggio della linea, da parte del programma: a tal fine è necessario impostare la proprietà Rthreshold=1. GESTIONE DATABASE MICROSOFT ACCESS Per permettere l’immagazinamento dei dati all’interno di un database di microsoft access si può utilizzare il controllo integrato in visual basic, denominato ADO. Questo permette di sfruttare i comandi SQL per la gestione dei database, consentendone la scrittura e la lettura dei dati. Innanzitutto per utilizzare questo controllo è fondamentale, definire la stringa di connessione al database (proprietà connectionstring): Adodc1.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\dati.mdb;Persist Security Info=False" Una volta connesso il database, si procede aprendo la connessione tramite codice. cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\dati.mdb;Persist Security 18 Sistema di acquisizione A questo punto è possibile effettuare la navigazione tra i record contenuti all’interno del database, facendo attenzione alla proprietà CursorType: impostarne un valore errato, ad esempio, non permettere di scorrere fino a giungere all’ultimo record del database. COSTANTE adOpenForwardOnly adOpenKeySet adOpenDynamic adOpenStaic DESCRIZIONE Permette la navigazione dei record solo in avanti Il programma vede soltanto alcuni cambiamenti eseguiti da altri utenti Il programma vede tutti i cambiamenti eseguiti da altri utenti Non si possono vedere i cambiamenti fatti da altri utenti Prima di modificare i record e di crearne nuovi, bisogna creare un Recordset, nel quale sarà poi possibile inserire i nuovi dati nei rispettivi campi. Set rs = New ADODB.Recordset With rs .CursorType = adOpenKeyset .LockType = adLockOptimistic .Source = "dati" .ActiveConnection = cn .Open "SELECT Temperatura, ora, data FROM dati ORDER BY Id" .AddNew !Data = system !ora = Time !temperatura = temp .Update .Close End With cn.Close Per poter poi garantire la scrittura all’interno del database, va impostato il tipo di accesso da effettuare: COSTANTE adLockReadOnly adLockPessimistic adLockOptimistic adLockBatchOptimistic DESCRIZIONE Definisce i dati nel recordset di sola lettura Definisce il blocco del record mentre lo si sta modificando I dati vengono bloccati soltanto quando si chiama il metodo Update Aggiorna più dati record in uno stesso tempo con il metodo UpdateBatch TRASMISSIONE FTP Dopo aver aggiornato il database, si passa alla terza fase che prevede l’invio del file .mdb ottenuto al server che gestisce il sito internet in linea. Per spedire il file si utilizza il protocollo FTP, attraverso l’oggetto inet.ocx, fornito direttamente in visual basic. In primo luogo si configura il componente aggiungendo i parametri ottenuti dal fornitore del host (nel nostro caso ARUBA). 19 Sistema di acquisizione inetFTP.UserName = Username inetFTP.Password = Password inetFTP.RemoteHost = ftp.xxxxxxxx.com inetFTP.Url = ftp:\\ftp.xxxxxxxx.com Una volta inseriti i parametri corretti, basta chiamare il metodo inetFTP.execute per poter mettere in comunicazione il sistema con il server. inetFTP.Execute , "cd /fattorimarco.com/mdb-database/" While inetFTP.StillExecuting: DoEvents: Wend inetFTP.Execute , "Put " & file_locale & " " & file_remoto While inetFTP.StillExecuting: DoEvents: Wend inetFTP.Execute , "close" Nel primo caso viene settata la cartella di navigazione sul server, per poter poi proseguire con l’invio del file locale. Al termine dell’invio è buona norma chiudere la connessione con il server. E’ possibile inoltre monitorare lo stato della connessione, monitorando le proprietà: inetFTP.ResponseCode “restituisce il codice di risposta dello stato della connessione” inetFTP.ResponseInfo “restituisce direttamente lo stato della connessione” SITO WEB La pubblicazione online del database contenente i dati acquisiti è stata realizzata attraverso la realizzazione di un sito internet con Dreamweaver, il quale garantisce piena compatibilità con tutti i principali browser utilizzati, che spesso causano delle anomalie e degli errori nella visualizzazione delle pagine. Il software permette la costruzione di pagine web in tutti i principali linguaggi di programmazione: nel nostro caso è stato scelto quello ASP. Questo linguaggio permette la costruzioni di pagine dinamiche integrate con un database, dal quale possono essere estratte informazioni utili all’utente. Una volta inserito il database è possibile controllarne le informazioni contenute, attraverso interrogazioni con istruzioni asp. Per poter interrogare il database, ed ottenere ad esempio il valore dell’ultimo record di temperatura presente, è stato necessario inserire un VB Script: <% Dim dati Dim dati_numRows Set dati = Server.CreateObject("ADODB.Recordset") dati.ActiveConnection = MM_Dat_tabella_STRING dati.Source = "SELECT Temperatura FROM dati" dati.CursorType = 1 dati.CursorLocation = 2 20 Sistema di acquisizione dati.LockType = 3 dati.Open() dati_numRows = 0 %> <% dati.Movelast()%> <%=(dati.Fields.Item("Temperatura").Value)%> Dal codice riportato si può notare la similitudine con il programma scritto precedentemente in Visual Basic, per la gestione del database. 21 Sistema di acquisizione 22 Sistema di acquisizione 23 Sistema di acquisizione 24 Sistema di acquisizione 25 Sistema di acquisizione 26 Sistema di acquisizione CODICE DEL SOFTWARE DI GESTIONE DEL MICROCONTROLLORE SVEGLIA.c #include <sveglia scuola ok.h> #include <lcd16x2.c> #priority RTCC,RB,TIMER1 //impostazione della priorità tra gli interrupt #int_TIMER1 //routine di interrupt per overflow dwel timer1 void TIMER1_isr(void) { OUTPUT_high(PIN_A5);//spegnimento della retroilluminzaione del display CLEAR_INTERRUPT(INT_TIMER1); //Pulizia della flag di interrupt del timer1 } #int_RB //routine di interrupt sulla linea Rb void RB_isr(void) { SET_TIMER1(35000); //precaricamento del timer1 enable_interrupts(INT_TIMER1); //abilitazione interrupt TIMER1 OUTPUT_low(PIN_A5);//abilitazione della retroilluminazione del display Bit=input_B(); //lettura del registro portb Bit&=240; //operazione necessaria a valutare quale linea ha generato l'interrupt switch(Bit){ Case 16: Switch(allarm) //interrupt generato dal pulsante delle ore { Case 0: ore++; //settaggio (orario) -oreif (ore==24) ore=0; break; Case 1: Aore++; //settaggio (sveglia) -oreif (Aore==24) Aore=0; break; } break; 27 Sistema di acquisizione Case 32: Switch(allarm) //interrupt generato dal pulsante dei minuti { Case 0: minuti++; //settaggio (orario) -minutiif (minuti==60) minuti=0; break; Case 1: Aminuti++; //settaggio (sveglia) -minutiif (Aminuti==60) Aore=0; break; } break; Case 64: //interrupt generato dal pulsante per l'abilitazio/disabilitazione del ricevitore radio OUTPUT_high(PIN_A2); //spegnimento del ricevitore radio buzzer-- ; //Istruzione complementa lo stato della variabile(attraverso la sottrazione) break; } CLEAR_INTERRUPT(INT_RB); //pulizia della flag di interrupt su portB enable_interrupts(INT_RB); //abilitazione interrupt sulla linea RB } #int_RTCC //interrupt per overflow del timer0 (ogni secondo) void RTCC_isr(void) { secondi++; //incremento secondi if (secondi==60){ minuti++; //incremento minuti secondi=0; } if (minuti==60){ ore++; //incremento ore minuti=0; } if (ore==24){ ore=0; } CLEAR_INTERRUPT(INT_RTCC); //pulizia della flag di interrupt del timer0 enable_interrupts(INT_RTCC); //Abilitazione dell'interrupt su timer0 } 28 Sistema di acquisizione void main() { setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(AN0); setup_spi(SPI_SS_DISABLED); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32); setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); enable_interrupts(INT_RTCC); //Abilitazione interrupt su Timer0 enable_interrupts(GLOBAL); //Abilitazione interrupt globali //Azzeramento variabili allarm=0; ore=0; minuti=0; secondi=0; Aminuti=0; Aore=0; buzzer=0; lcd_init(); //Inizializzazione display OUTPUT_low(PIN_A5);//abilitazione della retroilluminazione del display enable_interrupts(INT_RB); //abilitazione interrupt sulla linea Rb SET_TIMER1(35000); //precaricamento del timer1 enable_interrupts(INT_TIMER1); //abilitazione interrupt su timer1 while(1){ if (secondi==59){ printf("%2u",read); //invio su RS232 del valore della temperatura } set_adc_channel(0); //seleziono il canale analogico 0 (RA0) delay_ms(20); allarm=INPUT(PIN_B3); //Leggo il valore del pin RB3 per riconoscere la modalità di funzionamento Switch(allarm) { Case 0: //modalità orologio 29 Sistema di acquisizione lcd_gotoxy(5,1); // Inserisco il cursore sulla prima linea al carattere 5 del display printf(lcd_putc,"%02u", ore); //Visualizzazione sul display delle ore printf(lcd_putc,":%02u", minuti); //Visualizzazione sul display dei minuti printf(lcd_putc,":%02u", secondi); //Visualizzazione sul display dei secondi break; Case 1: //modalità sveglia lcd_gotoxy(5,1); // Inserimento del cursore sulla prima linea al carattere 5 del display printf(lcd_putc,"%02u", Aore); //Visualizzazione sul display dele ore per la modalità sveglia printf(lcd_putc,":%02u", Aminuti); //Visualizzazione sul display dei minuti per la modalità sveglia printf(lcd_putc,":%02u", secondi); //Visualizzazione sul display dei secondi per la modalità svelglia break; } //Verifica della coicidenza dell'orario della prima modalità, con quello settato in modalità sveglia if (buzzer==1){ if (ore==Aore) { if (minuti==Aminuti){ OUTPUT_low(PIN_A2); //avvio del ricevitore radio come allarme OUTPUT_low(PIN_A5); //accensione della retroilluminazione del display SET_TIMER1(35000); //precaricamento del timer1 enable_interrupts(INT_TIMER1); //abilitazione interrupt su timer1 } else OUTPUT_High(PIN_A2); //spegnimento del ricevitore radio } else OUTPUT_high(PIN_A2); //spegnimento del ricevitore radio } lcd_gotoxy(1,0); // Inserimento del cursore sulla seconda linea al carattere 1 del display if (buzzer==1) //Test sulla variabile per determinare l'on o l'off per l'attivazione dell'allarme printf(lcd_putc,"ON "); else printf(lcd_putc,"OFF"); read=read_adc(); //lettura del canale analogico Ra0 lcd_gotoxy(12,0); // Inserimento del cursore sulla seconda linea al carattere 12 del display //Algoritmo generato per l'operazione di casting, necessaria per visualizzare i dati acquisiti. Data //la bassa frequenza di funzionamento del µC è necessario visualizzare una variabile int8, //presupponendo perciò un algoritmo per la determinazione dei valori di temperatura negativa. //La routine termina con la visualizzazione dei risultati sul display 30 Sistema di acquisizione if (read>=72){ temp=(read*0.278)-20; lcd_putc("+"); printf(lcd_putc,"%2u", temp); } if (read<72){ temp=(read*0.25)-20; temp=~temp; lcd_putc("-"); printf(lcd_putc,"%2u", temp); } lcd_putc(0XDF); lcd_putc("C"); } } SVEGLIA.h #include <16F876A.h> #include <float.h> #device adc=8 #FUSES NOWDT #FUSES LP #FUSES NOPUT #FUSES NOPROTECT #FUSES NODEBUG #FUSES NOBROWNOUT #FUSES NOLVP #FUSES NOCPD #FUSES WRT_50% //No Watch Dog Timer //Low power osc < 200 khz //No Power Up Timer //Code not protected from reading //No Debug mode for ICD //No brownout reset //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O //No EE protection //Lower half of Program Memory is Write Protected #use delay(clock=32768) #use rs232(baud=300, xmit=PIN_A4) int8 ore; int8 secondi; int8 minuti; int8 Aore; int8 Aminuti; int1 allarm; int1 buzzer; int8 temp; int8 read; int8 Bit; 31 Sistema di acquisizione CODICE DEL SOFTWARE SCRITTO IN VISUAL BASIC Option Explicit Dim file_locale As String Dim file_remoto As String Dim invio, dati As Integer Dim cn As New ADODB.Connection Dim rs As ADODB.Recordset Dim system, clock As Date Dim temp As Long Private m_GettingDir As Boolean Private Sub AddMessage(ByVal msg As String) txtResults.Text = txtResults.Text & vbCrLf & msg txtResults.SelStart = Len(txtResults.Text) End Sub Private Sub Command1_Click() file_locale = "c:\dati.mdb" file_remoto = "dati.mdb" inetFTP.UserName = Text2.Text inetFTP.Password = Text3.Text inetFTP.RemoteHost = Text1.Text txtResults.Text = "In connessione" Timer1.Enabled = True End Sub Private Sub Command2_Click() End End Sub Private Sub Form_Load() MSComm1.CommPort = 1 MSComm1.Settings = "300,N,8,1" MSComm1.RThreshold = 1 MSComm1.PortOpen = True End Sub Private Sub MSComm1_OnComm() dati = MSComm1.Input temp = (dati * 0.2734375) - 20 trasmetti End Sub 32 Sistema di acquisizione Private Sub inetFTP_StateChanged(ByVal State As Integer) Select Case State Case icError AddMessage "Error: " & _ " " & inetFTP.ResponseCode & vbCrLf & _ " " & inetFTP.ResponseInfo Case icNone AddMessage "None" Case icConnecting AddMessage "Connecting" Case icConnected AddMessage "Connected" Case icDisconnecting AddMessage "Disconnecting" Case icDisconnected AddMessage "Disconnected" Case icRequestSent AddMessage "Request Sent" Case icRequesting AddMessage "Requesting" Case icReceivingResponse AddMessage "Receiving Response" Case icRequestSent AddMessage "Request Sent" Case icResponseReceived AddMessage "Response Received" Case icResolvingHost AddMessage "Resolving Host" Case icHostResolved AddMessage "Host Resolved" Case icResponseCompleted invio = invio + 1 AddMessage inetFTP.ResponseInfo & "n° dati inviati= " & invio If m_GettingDir Then Dim txt As String Dim chunk As Variant m_GettingDir = False ' Get the first chunk. chunk = inetFTP.GetChunk(1024, icString) DoEvents Do While Len(chunk) > 0 txt = txt & chunk chunk = inetFTP.GetChunk(1024, icString) DoEvents Loop AddMessage "----------" 33 Sistema di acquisizione AddMessage txt End If Case Else AddMessage "State = " & Format$(State) End Select Enabled = True MousePointer = vbDefault End Sub Public Sub trasmetti() Command2.Enabled = False system = Date clock = Time cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\dati.mdb;Persist Security Info=False" Set rs = New ADODB.Recordset With rs .CursorType = adOpenKeyset .LockType = adLockOptimistic .Source = "dati" .ActiveConnection = cn .Open "SELECT Temperatura, ora, data FROM dati ORDER BY Id" .AddNew !Data = system !ora = Time !temperatura = temp .Update .Close End With cn.Close List1.AddItem (" " & system & " " & Time & " " & temp & "°C" & " ") DoEvents txtResults.Text = "Working" txtResults.SelStart = Len(txtResults.Text) inetFTP.Execute , "cd /fattorimarco.com/mdb-database/" While inetFTP.StillExecuting: DoEvents: Wend inetFTP.Execute , "Put " & file_locale & " " & file_remoto While inetFTP.StillExecuting: DoEvents: Wend inetFTP.Execute , "close" Command2.Enabled = True End Sub 34 Sistema di acquisizione PULSANTE CAPACITIVO SCHEDA PRINCIPALE RICEVITORE FM 35 Sistema di acquisizione 36