In questo progetto, realizzeremo un sistema di allarme antincendio utilizzando il microcontrollore ATMEGA8 e il sensore antincendio. Il sensore antincendio può essere di qualsiasi tipo, tuttavia utilizziamo un sensore antincendio basato su IR (infrarossi). Sebbene i sensori antincendio basati su IR presentino alcuni svantaggi principalmente di imprecisione, è il modo più economico e semplice per rilevare il fuoco.
I sensori antincendio basati su IR hanno una visione di rilevamento inferiore, quindi monteremo il sensore antincendio su un servomotore. Il servo effettuerà rotazioni del pendolo di 180 gradi. Con il sensore antincendio montato su di esso, otteniamo una visione di rilevamento del fuoco di oltre 270 gradi. Il servo ruoterà continuamente dando così un sistema completo di allarme antincendio della stanza. Per una maggiore precisione possiamo aggiungere un sensore di fumo al sistema. Con ciò potremmo ottenere una maggiore precisione.
Componenti del circuito
Hardware: alimentazione + 5v, servomotore (sg90), ATMEGA8, BUZZER, pulsante, resistenza 10KΩ, resistenza 1KΩ, resistenza 220Ω, condensatore 100nF, PROGRAMMATORE AVR-ISP.
Software: Atmel studio 6.1, progisp o flash magic.
Schema del circuito e funzionamento
Affinché l'albero del servo si muova completamente a sinistra, dobbiamo dare 1/18 di rotazione in razione, e affinché l'albero ruoti completamente a sinistra dobbiamo dare PWM con una razione di 2/18. Programmeremo ATMEGA8 per emettere un segnale PWM che ruoterà l'albero del servo a 180 e poi a 0 dopo un certo ritardo.
Per tutto il tempo, il sensore antincendio sarà acceso e il controller sarà completamente allertato. In caso di incendio, il sensore fornisce un impulso alto a questo impulso quando rilevato dal controller imposta un allarme. L'allarme verrà disattivato premendo un pulsante di ripristino ad esso collegato.
In atmega8 per tre canali PWM, abbiamo designato tre pin. Possiamo solo prendere l'uscita PWM solo su questi pin. Poiché stiamo usando PWM1 dovremmo prendere segnale PWM al pin OC1A (PORTB 1 st PIN). Come mostrato nello schema del circuito, stiamo collegando il segnale del servo al pin OC1A. Qui un'altra cosa è su tre canali PWM, due sono canali PWM a 8 bit e un canale PWM a 16 bit. Utilizzeremo qui un canale PWM a 16 bit.
In ATMEGA ci sono un paio di modi per generare PWM, lo sono
1. PWM corretto di fase.
2. PWM veloce.
Qui manterremo tutto semplice, quindi useremo il metodo FAST PWM per generare il segnale PWM.
Prima di scegliere la frequenza del PWM, questo dipende dall'applicazione di solito, per un LED qualsiasi frequenza maggiore di 50Hz andrebbe bene. Per questo motivo scegliamo il contatore di clock 1MHZ, quindi non scegliamo prescalar. Un prescalar è un numero selezionato in modo da ottenere un contatore di clock inferiore. Ad esempio, se il clock dell'oscillatore è 8Mhz, possiamo scegliere un prescalar di '8' per ottenere un clock da 1MHz per il contatore. Il prescalar viene selezionato in base alla frequenza. Se vogliamo più impulsi di periodo di tempo, dobbiamo scegliere un prescalar più alto.
Ora per ottenere il FAST PWM di 50Hz dall'ATMEGA, dobbiamo abilitare i bit appropriati nel registro " TCCR1B ".
Qui, CS10, CS11, CS12 (GIALLO): selezionare il prescalar per la scelta del contatore di clock. La tabella per il prescalar appropriato è mostrata nella tabella sottostante. Quindi per il prescaling (orologio dell'oscillatore = counter clock).
quindi CS10 = 1, gli altri due bit sono zero.
ROSSO (WGM10-WGM13): vengono modificati per scegliere le modalità di generazione della forma d'onda, in base alla tabella seguente, per PWM veloce. Abbiamo WGM11, WGM12 e WGM12 impostati su 1.
Ora sappiamo che PWM è un segnale con diversa razione di servizio o diversi tempi di accensione e spegnimento. Finora abbiamo scelto frequenza e tipo di PWM. Il tema principale di questo capitolo si trova in questa sezione. Per ottenere razioni di servizio diverse, sceglieremo un valore compreso tra 0 e 255 (2 ^ 8 a causa di 8 bit). Supponiamo di scegliere un valore 180, poiché il contatore inizia a contare da 0 e raggiunge il valore 180, la risposta dell'uscita potrebbe essere attivata. Questo trigger può essere invertente o non invertente. Questo è l'output che può essere detto di tirare su quando si raggiunge il conteggio, oppure si può dire di abbassare quando si raggiunge il conteggio.
VERDE (COM1A1, COM1A0): questa selezione di pull up o down è scelta dai bit CM1A0 e CM1A1.
Come mostrato nella tabella, affinché l'uscita aumenti durante il confronto e l'uscita rimarrà alta fino al valore massimo. Dobbiamo scegliere la modalità di inversione per farlo, quindi COM1A0 = 1; COM1A1 = 1.
Come mostrato nella figura sottostante, OCR1A (Output Compare Register 1A) è il byte che memorizza il valore scelto dall'utente. Quindi, se cambiamo OCR1A = 180, il controller attiva la modifica (alta) quando il contatore raggiunge 180 da 0.
OCR1A deve essere 19999-600 per 180 gradi e 19999-2400 per 0 gradi.