- Materials necessaris:
- Requisits previs:
- Esquema de connexions:
- Programació per al despertador:
- Simulació:
- Funcionament del rellotge despertador digital mitjançant PIC16F877A:
La Revolució digital iniciada el 1950 transforma totes les estructures electròniques mecàniques i analògiques existents en ordinadors digitals. Atès que el creixement de l’electrònica digital ha estat exponencial, avui en dia és gairebé impossible que una persona es resisteixi a utilitzar cap equip electrònic. A partir del despertador que us desperta i de la torradora que us serveix per esmorzar, tot és una contribució de l’electrònica digital. Pensant en tot això, és realment emocionant programar les nostres pròpies coses que puguin fer tasques senzilles però útils, com el despertador que construirem en aquest projecte amb el microcontrolador PIC. Anteriorment, hem creat despertador amb altres microcontroladors:
- Rellotge despertador Raspberry Pi mitjançant el mòdul RTC DS1307
- Rellotge digital basat en Arduino amb alarma
- Rellotge despertador mitjançant microcontrolador ATmega32
Aquest despertador tindrà una pantalla LCD de 16x2 que mostrarà l’hora actual i l’hora establerta. Utilitzarem uns quants botons per definir l’hora de l’alarma sempre que sigui necessari. L’hora actual es mantindrà en pista mitjançant el mòdul RTC DS3231 i utilitzarem la comunicació IIC per obtenir aquests valors del mòdul RTC. Ja hem après sobre el mòdul RTC i sobre com connectar-lo amb PIC. Per tant, es recomana llegir aquest tutorial; ometrem la major part de la informació coberta en aquest tutorial.
Materials necessaris:
- Taula de pa - 2Nos
- PIC16F877A
- Font d'alimentació de 5V - Mòdul de subministrament
- Cristall de 20 MHz
- Condensador de 33pf - 2Nos
- Mòdul RTC DS3231
- Mòdul de pantalla LCD de 16 * 2
- 10K POT
- Resistència de 10k i 1K
- Polsadors: 5Nos
- Zumbador
- Connexió de cables
Requisits previs:
Aquest projecte requereix conèixer alguns conceptes bàsics sobre el microcontrolador PIC i com programar-lo. Utilitzarem GPIO, pantalla LCD i mòdul RTC per a aquest projecte. Per tant, és millor aprendre a utilitzar aquests mòduls prèviament. Els enllaços següents us ajudaran a aprendre el mateix
- Escrivint el vostre primer programa amb el microcontrolador PIC
- Interfície LCD amb PIC
- Comunicació I2C mitjançant PIC
- DS3231 Interfície RTC amb PIC
Esquema de connexions:
A continuació es mostra el diagrama de circuits d’aquest projecte de despertador basat en PIC, que es va crear amb el programari proteus. També s’utilitzarà per a la simulació en aquest projecte.

Els cinc polsadors actuaran com a entrada per configurar l'alarma durant el temps requerit. Així, un extrem de tots els botons polsadors està connectat a terra i els altres extrems estan connectats al pin PORTB, s’utilitzarà una resistència de tracció interna en aquests pins per evitar que els pins flotin. El buzzer actuarà com a sortida i ens donarà un so quan es dispari l'alarma i es connecti al pin PORT S. El temps actual sempre es manté en pista mitjançant el mòdul RTC DS3231 des del qual el PIC rep les dades a través del bus I2C, de manera que els pins SCL i SDA del mòdul RTC es connecten als pins SCL i SDA del controlador PIC. S'adjunta una pantalla LCD al PORTD del PIC que s'utilitza per mostrar l'hora actual i l'hora establerta. Obteniu més informació sobre l’ús del mòdul RTC DS3231 amb PIC aquí.
El circuit complet es pot construir sobre una taula de treball. Com que hi ha un parell de dotzenes de cables per connectar, només cal tenir paciència i assegurar-se que les connexions siguin correctes. La configuració del maquinari semblava semblant a la següent, un cop he acabat les connexions

He utilitzat un mòdul de panell i un adaptador de 12V per alimentar el mòdul. Aquesta és la meva font de tensió d'alimentació de + 5V. A més, he de fer servir dues taules per mantenir el circuit net. També podeu soldar tot el circuit amb un tauler de perfecció si voleu fer un projecte més robust.
Programació per al despertador:
El programa PIC complet d’aquest projecte de despertador es pot trobar a la part inferior d’aquesta pàgina. Aquest projecte també requereix tres biblioteques per utilitzar LCD, I2C i RTC amb PIC. El codi complet amb fitxers de capçalera es pot descarregar des del fitxer ZIP aquí i es pot obrir mitjançant MPLABX després d’extreure’l. Més avall només explico el fitxer c principal com a petits fragments. Podeu tornar als tutorials esmentats anteriorment si voleu saber com funcionen els fitxers de capçalera.
Abans d’entrar al programa principal, hem de definir els pins que hem utilitzat amb un nom més significatiu. D’aquesta manera serà fàcil utilitzar-los durant la programació. Els pins definits al nostre programa es mostren a continuació
// Definiu els pins LCD #define RS RD2 // Restableix el pin de LCD #define EN RD3 // Activa el pin de LCD #define D4 RD4 // Bit de dades 0 de LCD #define D5 RD5 // Bit de dades 1 de LCD #define D6 RD6 // Bit de dades 2 de LCD # definir D7 RD7 // Bit de dades 3 de LCD // Definir botons # definir MB RB1 // El botó central # definir LB RB0 // Botó esquerre # definir RB RB2 // Botó dret # defineix UB RB3 // Botó superior #define BB RB4 // Botó inferior // Defineix Buzz #define BUZZ RD1 // El buzzer està connectat a RD1
Dins de la funció principal comencem declarant els pins d'entrada i sortida. En el nostre projecte, el PORTB s’utilitza per als botons polsadors, que és un dispositiu d’entrada, de manera que configurem els seus pins com a entrades i PORTD s’utilitza per a LCD i buzzer, de manera que configurem els seus pins com a sortida. A més, no s'ha de deixar mai un pin flotant, és a dir, els pins d'E / S sempre han d'estar connectats a terra o al voltatge de + 5V. En el nostre cas per als polsadors, els pins no es connectaran a res quan no es prem el botó, de manera que fem servir una resistència de tracció interna que posa el pin en Alt quan no s’utilitza. Això es fa mitjançant els registres de control com es mostra a continuació
TRISD = 0x00; // Fer pins del port D com outptu per LCD d'interfície TRISB = 0xFF; // Els commutadors es declaren com a pins d'entrada OPTION_REG = 0b00000000; // Activa la resistència pull up al port B per als commutadors BUZZ = 0; // Torn de zumbador
Com que tenim el fitxer de capçalera LCD i I2C enllaçat amb el programa principal, podem iniciar la inicialització del LCD trucant a una funció senzilla. També es pot fer el mateix amb la inicialització I2C. Aquí estem iniciant la comunicació I2C a 100 kHz ja que el mòdul RTC funciona amb 100 kHz.
Lcd_Start (); // Inicialitzar el mòdul LCD I2C_Initialize (100); // Inicialitzeu I2C Master amb un rellotge de 100 KHz
La funció següent s'utilitza per definir l'hora i la data al mòdul RTC, un cop definida l'hora i la data, elimineu aquesta línia. Altrament, cada vegada que inicieu el programa, la data i l'hora es configuraran una i altra vegada
// Elimineu la línia següent un cop s'hagi definit l' hora i la data per primera vegada. Set_Time_Date (); // definiu l’hora i la data al mòdul RTC
Per indicar que el programa s’inicia, mostrem una petita pantalla d’introducció que mostra el nom del projecte i el nom del lloc web com es mostra a continuació
// Envieu un missatge d'introducció a la pantalla LCD Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Rellotge despertador"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("-Circuit Digest"); __delay_ms (1500);
A continuació a l'interior de l' temps de bucle hem de llegir l'hora i data actuals de la lliçó RTC, això es pot fer amb només trucar el següent funció.
Update_Current_Date_Time (); // Llegiu la data i l'hora actuals des del mòdul RTC
Si crideu a la funció anterior, s'actualitzaran les variables seg, min i hora amb el valor actual. Per mostrar-los a la pantalla LCD els hem de dividir en caràcters individuals mitjançant el codi següent.
// Divideix el caràcter en caràcters per mostrar-lo a lcd char sec_0 = sec% 10; char sec_1 = (seg / 10); char min_0 = min% 10; char min_1 = min / 10; char hour_0 = hora% 10; hora char_1 = hora / 10;
A continuació, actualitzem els valors a la pantalla LCD. L'hora actual es mostrarà a la primera línia i l'hora establerta en què s'ha d'activar l'alarma es mostrarà a la segona línia. El codi que fa el mateix es mostra a continuació.
// Mostra l'hora actual a la pantalla LCD Lcd_Clear (); Lcd_Set_Cursor (1, 1); Lcd_Print_String ("HORA:"); Lcd_Print_Char (hora_1 + '0'); Lcd_Print_Char (hour_0 + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (min_1 + '0'); Lcd_Print_Char (min_0 + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (sec_1 + '0'); Lcd_Print_Char (sec_0 + '0'); // Mostra la data a la pantalla LCD Lcd_Set_Cursor (2, 1); Lcd_Print_String ("Alarma:"); Lcd_Print_Char (alarm_val + '0'); Lcd_Print_Char (alarm_val + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (alarm_val + '0 '); Lcd_Print_Char (alarm_val + '0');
Ara, hem mostrat l'hora i l'hora establerta a la pantalla LCD, hem de comprovar si l'usuari intenta configurar l'hora de l'alarma. Per fer-ho, l'usuari ha de prémer el botó central, de manera que comprovarem si es prem el botó central i canviarem una variable per entrar al mode de configuració d'alarma. Es tornarà a prémer el mateix botó per confirmar que els valors estan establerts i, en aquest cas, hem de sortir del mode de configuració d'alarma. Per tant, fem servir la línia de codi següent per canviar l’estat de la variable set_alarm .
// Utilitzeu el botó central per comprovar si s'ha d'establir l' alarma si (MB == 0 && set_alarm == 0) {// Si es prem el botó central i l'alarma no està activada mentre (! MB); // Espereu fins que es deixi anar el botó set_alarm = 1; // comenceu a configurar el valor de l'alarma } si (MB == 0 && set_alarm == 1) {// Si es prem el botó central i l'alarma no està desactivada mentre (! MB); // Espereu fins que es deixi anar el botó set_alarm = 0; // deixar de configurar el valor de l'alarma }
Si l'usuari ha premut el botó central, vol dir que intenta configurar l'hora de l'alarma. En aquest cas, el programa entra en mode d'alarma mitjançant el codi anterior. Dins del mode de configuració de l'alarma, si l'usuari prem el botó esquerre o dret, vol dir que hem de moure el cursor cap a l'esquerra o cap a la dreta. Per fer-ho, simplement augmentem de disminució el valor de la posició a la qual s'ha de col·locar el cursor
if (LB == 0) {// Si es prem el botó esquerre mentre (! LB); // Espereu fins que es deixi anar el botó pos--; // A continuació, moveu el cursor cap a l'esquerra } if (RB == 0) {// Si es prem el botó dret mentre (! RB); // Espereu fins que es deixi anar el botó pos ++; // Mou el cursor cap a la dreta }
Mentre s’utilitza un polsador amb un microcontrolador o microprocessador, hi ha un problema comú que cal solucionar. Aquest problema s’anomena rebot de commutador. És a dir, quan es prem el botó, pot donar-se polsos sorollosos a la MCU / MPU, que poden falsificar la MCU per a diverses entrades. Aquest problema es pot solucionar afegint un condensador a través del commutador o mitjançant una funció de retard tan aviat com es detecti el botó. Aquest tipus de solució s’anomena rebot. Aquí hem utilitzat un temps de bucle per mantenir el programa en el seu lloc fins que es deixa anar el botó. Aquesta no és la millor solució per eliminar el rebot, però per a nosaltres funcionarà bé.
mentre que (! RB);
De manera similar al botó esquerre i dret, també tenim els botons superior i inferior que es poden utilitzar per augmentar o disminuir el valor del temps d’alarma. A continuació es mostra el codi per fer el mateix. Tingueu en compte que cada caràcter de l'hora d'alarma establerta s'adreça al valor d'índex de la matriu. En aquest cas, podem accedir fàcilment al caràcter requerit, els valors del qual s'han de canviar.
if (UB == 0) {// Si es prem el botó superior mentre (! UB); // Espereu fins que es llanci el botó alarm_val ++; // Augmenteu aquest valor de caràcter particular } si (BB == 0) {// Si es prem el botó inferior mentre (! UB); // Espereu fins que es deixi anar el botó alarm_val--; // Disminueix aquest valor de caràcter en particular }
Un cop configurada l'hora de l'alarma, l'usuari tornarà a prémer el botó central. Aleshores podem començar a comparar l’hora actual amb l’hora establerta. La comparació comprovant si cada caràcter del temps actual és igual al caràcter del temps establert. Si els valors són iguals, desencadenem l'alarma establint la variable trigger_alarm , sinó que comparem fins que sigui igual.
// IF alarm is set Comproveu si el valor establert és igual al valor actual if (set_alarm == 0 && alarm_val == hour_1 && alarm_val == hour_0 && alarm_val == min_1 && alarm_val == min_0) trigger_alarm = 1; // Activeu el disparador si el valor coincideix
Si l’alarma està configurada, hem de fer un so de la sonora per avisar l’usuari de l’alarma. Això es pot fer simplement commutant el timbre a un interval regular, tal com es mostra a continuació.
if (trigger_alarm) {// If alarm is triggered // Beep the buzzer BUZZ = 1; __delay_ms (500); BUZZ = 0; __delay_ms (500); }
Simulació:
Aquest programa també es pot simular mitjançant el programari proteus. Simplement torneu a crear el circuit que es mostra més amunt i carregueu el fitxer hexadecimal al PIC. El codi hexadecimal d’aquest projecte es troba al fitxer ZIP que hi ha enllaçat. A continuació es mostra una captura de pantalla realitzada durant la simulació

La simulació es fa molt útil quan intenteu afegir noves funcions al projecte. També podeu utilitzar el mòdul de depuració I2C per comprovar quines dades entren i surten a través del bus I2C. Podeu provar de prémer els botons i també establir l'hora de l'alarma. Quan el temps establert és igual al temps actual, el brunzidor pujarà.
Funcionament del rellotge despertador digital mitjançant PIC16F877A:
Construïu el circuit a la taula de treball, obteniu el codi des de l’enllaç de descàrrega i compileu-lo amb el compilador MplabX i XC8. Si heu descarregat el codi del fitxer ZIP que es proporciona aquí, no hauríeu de tenir cap problema en compilar-lo, ja que els fitxers de capçalera ja estan adjunts.
Després de compilar-lo, pengeu el programa al vostre maquinari mitjançant el programador PicKit3. La connexió per connectar el programador pickit a PIC IC també es mostra al diagrama del circuit. Després de penjar el programa, hauríeu de veure la pantalla d'introducció i, a continuació, l'hora que es mostra, podeu utilitzar els botons per configurar l'hora de l'alarma. La meva configuració de maquinari quan estic alimentada té el següent aspecte.

Quan l'hora de l'alarma coincideix amb l'hora actual, el brunzidor començarà a sonar per alarmar l'usuari. Podeu trobar el funcionament complet al vídeo següent. El projecte té una gran quantitat d’opcions per construir. El mòdul RTC pot fer un seguiment de qualsevol hora i data, de manera que podeu realitzar una tasca planificada en qualsevol moment / data necessària. També podeu connectar un aparell de CA com un ventilador o un llum i programar-lo perquè s’encengui o s’apagui quan sigui necessari. Encara hi ha molt més que podeu aprofitar d’aquest projecte, feu-me saber quina idea se us acudeix com a actualització d’aquest projecte i estaré encantat de saber-vos.
Espero que hàgiu entès el projecte i que hàgiu après alguna cosa útil del procés. Si teniu dubtes en aquest projecte, utilitzeu la secció de comentaris per publicar-los o utilitzeu els fòrums per obtenir ajuda tècnica.
El codi PIC complet amb fitxers de capçalera es pot trobar aquí
