radiosveglia con monitoraggio della temperatura

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