- Potrebni materiali:
- Predpogoji:
- Shema vezja:
- Programiranje za budilko:
- Simulacija:
- Delovanje digitalne budilke z uporabo PIC16F877A:
Digitalna revolucija, ki se je začela leta 1950, spremeni vse obstoječe mehanske in analogne elektronske strukture v digitalne računalnike. Ker je bila rast digitalne elektronike eksponentna, se danes človek skorajda ne more upreti uporabi katere koli elektronske opreme. Od budilke, ki vas zbudi, in opekača kruha, ki vam postreže z zajtrkom, vse prispeva digitalna elektronika. Ob vsem tem je res vznemirljivo programirati lastne stvari, ki bi lahko opravljale preproste, a koristne naloge, na primer budilko, ki jo bomo v tem projektu zgradili z mikrokrmilnikom PIC. Pred tem smo zgradili budilko z drugimi mikrokrmilniki:
- Budilka Raspberry Pi z uporabo modula RTC DS1307
- Digitalna ura z alarmom na osnovi Arduina
- Budilka z uporabo mikrokrmilnika ATmega32
Ta budilka bo imela 16x2 LCD zaslon, ki bo prikazoval trenutni čas in nastavljeni čas. Po potrebi bomo z nekaj tipkami nastavili čas alarma. Trenutni čas se bo spremljal z uporabo modula DS3231 RTC, za pridobitev teh vrednosti iz modula RTC pa bomo uporabili komunikacijo IIC. Že smo se naučili o modulu RTC in kako ga povezati s PIC. Zato je priporočljivo, da preberete to vadnico, saj bomo preskočili večino informacij, opisanih v tej vadnici.
Potrebni materiali:
- Deska za kruh - 2Št
- PIC16F877A
- 5V vir napajanja - napajalni modul
- 20 MHz kristal
- 33 pf kondenzator - 2 št
- Modul DS3231 RTC
- 16 * 2 LCD zaslon
- 10K LONČEK
- 10k in 1K upor
- Tipke - 5Št
- Zvočni signal
- Priključne žice
Predpogoji:
Ta projekt zahteva, da poznate nekaj osnov o mikrokrmilniku PIC in kako ga programirati. Za ta projekt bomo uporabili GPIO, LCD zaslon in RTC modul. Zato je bolje, da se prej naučite, kako uporabljati te module. Naslednje povezave vam bodo pomagale, da se boste naučili istega
- Pisanje vašega prvega programa z mikrokrmilnikom PIC
- Povezava LCD-ja s PIC-om
- I2C komunikacija s pomočjo PIC
- DS3231 RTC povezovanje s PIC
Shema vezja:
Shema vezja za ta projekt budilke, ki temelji na PIC, je prikazana spodaj, ki je bila ustvarjena z uporabo programske opreme proteus. V nadaljevanju bo projekt uporabljen tudi za simulacijo.
Pet tipk bo služilo kot vhod za nastavitev alarma za potreben čas. Tako so en konec vseh tipk priključeni na maso, drugi konci pa na zatič PORTB, na teh zatičih se bo uporabil notranji vlečni upor, da se izognemo plavanju nožic. Zvočni signal bo deloval kot izhod in nam zapiskal, ko se sproži alarm in je povezan na zatič PORT S. Trenutni čas vedno spremlja DS3231 RTC modul, od katerega PIC sprejema podatke prek vodila I2C, zato so zatiči SCL in SDA modula RTC povezani na zatič SCL in SDA krmilnika PIC. Na PORTD PIC je pritrjen LCD zaslon, ki se uporablja za prikaz trenutnega in nastavljenega časa. Več o uporabi modula DS3231 RTC s PIC tukaj.
Celotno vezje je mogoče zgraditi na plošči. Ker obstaja nekaj ducatov žic za povezavo, zato bodite potrpežljivi in se prepričajte, da so povezave pravilne. Ko sem končal s povezavami, je moja nastavitev strojne opreme spodaj izgledala nekako takole
Za napajanje modula sem uporabil modul plošče in 12V adapter. To je moj vir napajalne napetosti + 5V. Prav tako moram uporabiti dve plošči, da ohranim vezje čisto. Celo vezje lahko spajkate tudi na ploščo za perf, če želite narediti bolj robusten projekt.
Programiranje za budilko:
Popolna PIC program za ta Alarm projekt Ura je mogoče najti na dnu te strani. Ta projekt zahteva tudi tri knjižnice za uporabo LCD, I2C in RTC s PIC. Popolno kodo z zaglavnimi datotekami lahko prenesete iz ZIP datoteke tukaj in jo po izvlečku odprete s pomočjo MPLABX. Nadalje spodaj razlagam glavno datoteko c kot majhne delčke. Če želite vedeti, kako delujejo datoteke z glavo, se lahko vrnete na zgoraj omenjene vadnice.
Preden vstopimo v glavni program, moramo definirati nožice, ki smo jih uporabili z bolj pomenljivim imenom. Tako jih bo enostavno uporabljati med programiranjem. Zatiči, definirani v našem programu, so prikazani spodaj
// Določite zatiče LCD #define RS RD2 // Ponastavite zatič LCD #define EN RD3 // Omogočite pin LCD #define D4 RD4 // Podatkovni bit 0 LCD #define D5 RD5 // Podatkovni bit 1 LCD #define D6 RD6 // Podatkovni bit 2 na LCD-ju #define D7 RD7 // Podatkovni bit 3 na LCD-u // Določi gumbe #define MB RB1 // Srednji gumb #define LB RB0 // Levi gumb #define RB RB2 // Desni gumb # definirajte UB RB3 // Zgornji gumb #define BB RB4 // Spodnji gumb // Določite Buzz #define BUZZ RD1 // Zvočni signal je povezan z RD1
Znotraj glavne funkcije začnemo z razglasitvijo vhodnih in izhodnih zatičev. V našem projektu se PORTB uporablja za tipke, ki je vhodna naprava, zato smo njihove zatiče nastavili kot vhode, PORTD pa za LCD in brenčalo, zato smo njihove zatiče nastavili kot izhod. Tudi zatič nikoli ne sme ostati v lebdečem pomenu, V / I zatiči morajo biti vedno priključeni na ozemljitev ali na + 5V napetost. V našem primeru za tipke nožice ne bodo priključene na nič, ko gumba ne pritisnete, zato uporabljamo notranji upor, ki zatič nastavi na High, ko ga ne uporabljamo. To se naredi z uporabo kontrolnih registrov, kot je prikazano spodaj
TRISD = 0x00; // Naredite zatiče vhoda D kot izhod za povezavo LCD-ja TRISB = 0xFF; // Stikala so deklarirana kot vhodni zatiči OPTION_REG = 0b00000000; // Omogoči vlečni upor na priključku B za stikala BUZZ = 0; // Obračanje brenčača
Ker imamo glavno datoteko LCD in I2C povezano z glavnim programom, lahko inicializacijo LCD začnemo s klicem preproste funkcije. Enako je mogoče storiti tudi za inicializacijo I2C. Tu začenjamo komunikacijo I2C pri 100 kHz, saj RTC modul deluje s 100 kHz.
Lcd_Start (); // Inicializacija LCD modula I2C_Initialize (100); // Inicializirajte I2C Master z uro 100KHz
Spodnja funkcija se uporablja za nastavitev ure in datuma na modulu RTC, ko je čas in datum nastavljen, odstranite to vrstico. Ob vsakem zagonu programa se čas in datum nastavita znova in znova
// Odstranite pod črto enkrat čas in datum, ki je določen za prvič. Set_Time_Date (); // nastavimo uro in datum na modulu RTC
Kot znak, da se program zažene, prikažemo majhen uvodni zaslon, ki prikazuje ime projekta in ime spletnega mesta, kot je prikazano spodaj
// Na LCD-prikazovalniku Lcd_Clear () podajte uvodno sporočilo ; Lcd_Set_Cursor (1,1); Lcd_Print_String ("Budilka"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("-Velikost kroga"); __zakasnitev_ms (1500);
Naslednje znotraj zanke while moramo iz modula RTC prebrati trenutni čas in datum, to lahko storimo tako, da pokličemo spodnjo funkcijo.
Update_Current_Date_Time (); // Preberite trenutni datum in uro iz modula RTC
Če prikličete zgornjo funkcijo, boste spremenljivke sek, min in uro posodobili s trenutno vrednostjo. Če jih želimo prikazati na LCD zaslonu, jih moramo s spodnjo kodo razdeliti na posamezne znake.
// Razdelimo na char za prikaz na lcd char sec_0 = sec% 10; char sec_1 = (sec / 10); char min_0 = min% 10; char min_1 = min / 10; char ura_0 = ura% 10; char ura_1 = ura / 10;
Nato vrednosti posodobimo na LCD zaslonu. V prvi vrstici bo prikazan trenutni čas, v drugi vrstici pa nastavljeni čas, v katerem mora biti alarm sprožen. Koda, ki počne enako, je prikazana spodaj.
// Prikaz trenutnega časa na LCD zaslonu Lcd_Clear (); Lcd_Set_Cursor (1, 1); Lcd_Print_String ("TIME:"); Lcd_Print_Char (ura_1 + '0'); Lcd_Print_Char (ura_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'); // Prikaz datuma na LCD zaslonu Lcd_Set_Cursor (2, 1); Lcd_Print_String ("Alarm:"); 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');
Zdaj smo na LCD-prikazovalniku prikazali čas in čas, ki ga moramo preveriti, ali uporabnik poskuša nastaviti čas alarma. Za to mora uporabnik pritisniti srednji gumb, zato bomo preverili, ali je pritisnjen srednji gumb, in preklopili spremenljivko, da vstopi v način nastavitve alarma. Ponovno bomo pritisnili isti gumb, da potrdimo, da so vrednosti nastavljene in v tem primeru moramo izstopiti iz načina nastavitve alarma. Torej s spodnjo vrstico kode spremenimo stanje spremenljivke set_alarm .
// S srednjim gumbom preverimo, ali je treba nastaviti alarm , če je (MB == 0 && set_alarm == 0) {// Če pritisnemo srednji gumb in alarm ni vklopljen, medtem ko (! MB); // Počakajte, da se gumb sprosti set_alarm = 1; // začnite nastavljati vrednost alarma } if (MB == 0 && set_alarm == 1) {// Če pritisnete srednji gumb in alarm ni izklopljen, medtem ko (! MB); // Počakajte, da se gumb sprosti set_alarm = 0; // ustavitev nastavitve vrednosti alarma }
Če je uporabnik pritisnil srednji gumb, to pomeni, da poskuša nastaviti čas alarma. V tem primeru program vstopi v način nastavitve alarma s pomočjo zgornje kode. Če uporabnik pritisne levi ali desni gumb v načinu nastavitve alarma, pomeni, da moramo kazalec premakniti levo ali desno. Da bi to naredili, preprosto povečamo za pomanjšavo vrednost položaja, na katerega moramo postaviti kurzor
if (LB == 0) {// Če pritisnete levi gumb, medtem ko (! LB); // Počakajte, da se gumb sprosti pos--; // Nato premaknite kurzor v levo } if (RB == 0) {// Če pritisnete desni gumb, medtem ko (! RB); // Počakajte, da se gumb sprosti pos ++; // Premakni kurzor v desno }
Med uporabo gumba z mikrokrmilnikom ali mikroprocesorjem se je treba lotiti ene pogoste težave. Ta težava se imenuje odbijanje stikala. Takrat, ko pritisnete gumb, lahko oddaja hrupne impulze MCU / MPU, kar lahko ponaredi MCU za več vnosov. To težavo lahko rešite z dodajanjem kondenzatorja čez stikalo ali z uporabo funkcije zakasnitve takoj, ko zaznate pritisk gumba. Ta vrsta rešitve se imenuje odbijanje. Tukaj smo uporabili zanko while, da program držimo na mestu, dokler se gumb ne sprosti. To ni najboljša rešitev za odbijanje, a za nas bo delovala v redu.
medtem ko (! RB);
Podobno kot levi in desni gumb imamo tudi zgornji in spodnji gumb, s katerimi lahko povečate ali zmanjšate vrednost časa alarma. Koda za enako dejanje je prikazana spodaj. Upoštevajte, da je vsak znak nastavljenega časa alarma naslovljen z vrednostjo indeksa polja. Tako lahko enostavno dostopamo do zahtevanega znaka, katerega vrednosti je treba spremeniti.
if (UB == 0) {// Če pritisnete zgornji gumb, medtem ko (! UB); // Počakajte, da se gumb sprosti alarm_val ++; // Povečajte to posebno vrednost znaka } if (BB == 0) {// Če pritisnete spodnji gumb, medtem ko (! UB); // Počakajte, da se gumb sprosti alarm_val--; // Zmanjšaj to vrednost char }
Ko je nastavljen čas alarma, bo uporabnik znova pritisnil srednji gumb. Potem lahko začnemo primerjati trenutni čas z nastavljenim časom. Primerjava s preverjanjem, ali je vsak posamezen znak trenutnega časa enak znaku nastavljenega časa. Če so vrednosti enake, sprožimo alarm tako, da nastavimo spremenljivko trigger_alarm, sicer primerjamo, dokler ne postane enak.
// ČE je alarm nastavljen Preverite, ali je nastavljena vrednost enaka trenutni vrednosti, če (set_alarm == 0 && alarm_val == hour_1 && alarm_val == hour_0 && alarm_val == min_1 && alarm_val == min_0) trigger_alarm = 1; // Vklopi sprožilec, če se vrednost ujema
Če je alarm nastavljen, moramo zvočni signal opozoriti uporabnika na alarm. To lahko storite s preprostim preklapljanjem zvočnega signala v rednih intervalih, kot je prikazano spodaj.
if (trigger_alarm) {// Če se sproži alarm // Zvočni signal BUZZ = 1; __zakasnitev_ms (500); BUZZ = 0; __zakasnitev_ms (500); }
Simulacija:
Ta program lahko simulirate tudi s programsko opremo proteus. Samo znova ustvarite zgoraj prikazano vezje in naložite šestnajstiško datoteko v PIC. Šestnajstiško kodo za ta projekt najdete v datoteki ZIP, ki je tu povezana. Posnetek zaslona, posnet med simulacijo, je prikazan spodaj
Simulacija postane zelo uporabna, ko skušate projektu dodati nove funkcije. Z modulom za razhroščevanje I2C lahko tudi preverite, kateri podatki vstopajo in prihajajo skozi vodilo I2C. Lahko poskusite pritisniti gumbe in nastavite tudi čas alarma. Ko je nastavljeni čas enak trenutnemu času, se bo zvočni signal zvišal.
Delovanje digitalne budilke z uporabo PIC16F877A:
Zgradite vezje na plošči, pridobite kodo s povezave za prenos in jo prevedite s pomočjo prevajalnika MplabX in XC8. Če ste kodo prenesli iz datoteke ZIP, ki je tukaj, potem ne bi smeli imeti težav z njeno sestavo, saj so datoteke z glavo že priložene.
Po prevajanju naložite program na strojno opremo s programatorjem PicKit3. Povezava za priključitev izbirnega programerja na PIC IC je prikazana tudi v vezju. Po nalaganju programa bi morali videti uvodni zaslon in nato prikazan čas lahko s pritiskom na gumbe nastavite čas alarma. Moja nastavitev strojne opreme pri napajanju je videti spodaj.
Ko se čas alarma ujema s trenutnim časom, začne zvočni signal piskati, da opozori uporabnika. Celotno delo najdete na spodnjem videoposnetku. Projekt ima na voljo številne možnosti za nadgradnjo. Modul RTC lahko spremlja kateri koli čas in datum, tako da lahko kadar koli / datum izvedete načrtovano nalogo. Napravo AC lahko priključite tudi na ventilator ali luč in jo po potrebi vključite ali izključite. Na tem projektu lahko nadgradite še veliko več, sporočite mi, katera ideja vam pade na pamet kot nadgradnja tega projekta, in z veseljem vas bom slišal.
Upam, da ste projekt razumeli in se iz procesa naučili kaj koristnega. Če dvomite o tem projektu, jih objavite v razdelku za komentarje ali pa za kakršno koli tehnično pomoč uporabite forume.
Popolno kodo PIC z datotekami z glavo najdete tukaj