- Potřebné materiály:
- Předpoklady:
- Kruhový diagram:
- Programování budíku:
- Simulace:
- Práce s digitálním budíkem pomocí PIC16F877A:
Digitální revoluce zahájená v roce 1950 mění všechny stávající mechanické a analogové elektronické struktury na digitální počítače. Vzhledem k tomu, že růst digitální elektroniky je exponenciální, je dnes pro člověka téměř nemožné odolat používání jakéhokoli elektronického zařízení. Počínaje budíkem, který vás probudí, a toustovačem, který vám podává snídani, je vše příspěvkem digitální elektroniky. Když přemýšlíme o všech těchto věcech, je opravdu vzrušující programovat naše vlastní věci, které by mohly dělat jednoduché, ale užitečné úkoly, jako je Budík, který v tomto projektu postavíme pomocí mikrokontroléru PIC. Dříve jsme budovali budík s dalšími mikrokontroléry:
- Budík Raspberry Pi pomocí modulu RTC DS1307
- Arduino digitální hodiny s budíkem
- Budík pomocí mikrokontroléru ATmega32
Tento budík bude mít 16x2 LCD displej, který bude zobrazovat aktuální čas a nastavený čas. K nastavení času budíku použijeme několik tlačítek, kdykoli to bude nutné. Aktuální čas bude udržován ve stopě pomocí modulu RTC DS3231 a k získání těchto hodnot z modulu RTC budeme používat komunikaci IIC. Již jsme se dozvěděli o modulu RTC a jeho propojení s PIC. Doporučuje se tedy přečíst si tento tutoriál, přeskočíme většinu informací obsažených v tomto tutoriálu.
Potřebné materiály:
- Chlebová deska - 2 č
- PIC16F877A
- 5V zdroj energie - napájecí modul
- 20 MHz krystal
- Kondenzátor 33pF - 2Nos
- Modul RTC DS3231
- 16 * 2 modul LCD displeje
- 10K POT
- 10k a 1K rezistor
- Tlačítka - 5 č
- Bzučák
- Připojovací vodiče
Předpoklady:
Tento projekt vyžaduje, abyste věděli několik základních informací o mikrokontroléru PIC a jeho programování. Pro tento projekt použijeme GPIO, LCD displej a RTC modul. Je tedy lepší se předem naučit používat tyto moduly. Následující odkazy vám pomohou naučit se totéž
- Psaní prvního programu pomocí mikrokontroléru PIC
- Propojení LCD s PIC
- Komunikace I2C pomocí PIC
- DS3231 RTC rozhraní s PIC
Kruhový diagram:
Schéma zapojení tohoto projektu budíku založené na PIC je uvedeno níže, které bylo vytvořeno pomocí softwaru proteus. V tomto projektu bude dále použita pro simulaci.
Pět tlačítek bude sloužit jako vstup pro nastavení alarmu na požadovanou dobu. Takže jeden konec všech tlačítek je připojen k zemi a druhý konec k pinu PORTB, na tyto piny bude použit interní pull-up rezistor, aby se zabránilo plovoucímu pinu. Bzučák bude fungovat jako výstup a vydá nám pípnutí, když se spustí alarm a je připojen k pinu PORT S. Aktuální čas je vždy sledován modulem DS3231 RTC, ze kterého PIC přijímá data přes sběrnici I2C, takže piny SCL a SDA modulu RTC jsou připojeny ke kolíku SCL a SDA PIC řadiče. K PORTD PIC je připojen LCD displej, který slouží k zobrazení aktuálního času a nastaveného času. Další informace o používání modulu RTC DS3231 s PIC najdete zde.
Celý obvod lze postavit na prkénku. Vzhledem k tomu, že je třeba připojit několik desítek vodičů, mějte trpělivost a ujistěte se, že jsou připojení správná. Moje nastavení hardwaru vypadalo níže asi takhle, jakmile jsem skončil s připojením
K napájení modulu jsem použil nepájivý modul a 12V adaptér. Toto je můj zdroj napájecího napětí + 5V. Také musím použít dva prkénko, abych udržel obvod čistý. Pokud chcete vytvořit robustnější projekt, můžete také celý obvod připájet k desce perf.
Programování budíku:
Kompletní PIC program pro tento projekt budík lze nalézt v dolní části této stránky. Tento projekt také vyžaduje tři knihovny pro používání LCD, I2C a RTC s PIC. Celý kód se soubory záhlaví lze stáhnout ze souboru ZIP zde a po rozbalení jej lze otevřít pomocí MPLABX. Dále níže vysvětluji hlavní soubor c jako malé úryvky. Pokud se chcete dozvědět, jak fungují soubory záhlaví, můžete se vrátit k výše uvedeným výukovým programům.
Než se dostaneme do hlavního programu, musíme definovat piny, které jsme použili se smysluplnějším názvem. Tímto způsobem bude snadné je během programování použít. Níže jsou uvedeny piny definované v našem programu
// Definujte piny LCD #define RS RD2 // Resetujte pin LCD #define EN RD3 // Aktivujte pin LCD #define D4 RD4 // Datový bit 0 LCD #define D5 RD5 // Datový bit 1 LCD #define D6 RD6 // Datový bit 2 na LCD #define D7 RD7 // Datový bit 3 na LCD // Definovat tlačítka #define MB RB1 // Střední tlačítko #define LB RB0 // Levé tlačítko #define RB RB2 // Pravé tlačítko # definovat UB RB3 // horní tlačítko #define BB RB4 // spodní tlačítko // definovat buzz #define BUZZ RD1 // bzučák je připojen k RD1
Uvnitř hlavní funkce začneme deklarováním vstupních a výstupních pinů. V našem projektu se PORTB používá pro tlačítka, což je vstupní zařízení, takže jsme nastavili jejich piny jako vstupy a PORTD se používá pro LCD a bzučák, takže jsme nastavili jejich piny jako výstup. Pin by nikdy neměl zůstat plovoucí, což znamená, že I / O piny by měly být vždy připojeny buď k uzemnění, nebo k napětí + 5V. V našem případě pro tlačítka nebudou piny připojeny k ničemu, když tlačítko není stisknuto, takže používáme interní pull-up rezistor, který nastaví kolík na High, když se nepoužívá. To se provádí pomocí řídicích registrů, jak je znázorněno níže
TRISD = 0x00; // Vytvořte piny Port D jako řešení pro LCD rozhraní TRISB = 0xFF; // Přepínače jsou deklarovány jako vstupní piny OPTION_REG = 0b00000000; // Povolit pull up rezistor na portu B pro přepínače BUZZ = 0; // Zapnutí bzučáku
Protože máme soubor záhlaví LCD a I2C propojený s hlavním programem, můžeme zahájit inicializaci LCD voláním jednoduché funkce. Totéž lze provést i pro inicializaci I2C. Zde začínáme komunikaci I2C na 100kHz, protože modul RTC pracuje se 100kHz.
Lcd_Start (); // Inicializace LCD modulu I2C_Initialize (100); // Inicializujte I2C Master s hodinami 100 KHz
Níže uvedená funkce slouží k nastavení času a data na modulu RTC, jakmile je nastaven čas a datum, odeberte tento řádek. Při každém spuštění programu se čas a datum nastaví znovu a znovu
Jednou čas a datum // Odstraňte pod hranicí je stanovena na poprvé. Set_Time_Date (); // nastavení času a data na modulu RTC
Abychom naznačili, že se program spouští, zobrazíme malou úvodní obrazovku, která zobrazuje název projektu a název webové stránky, jak je uvedeno níže
// Odeslat úvodní zprávu na LCD Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Budík"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("-Circuit Digest"); __delay_ms (1500);
Dále ve smyčce while musíme načíst aktuální čas a datum z modulu RTC, což lze provést pouhým voláním níže uvedené funkce.
Update_Current_Date_Time (); // Načte aktuální datum a čas z modulu RTC
Volání výše uvedené funkce aktualizuje proměnné sec, min a hodinu aktuální hodnotou. Abychom je mohli zobrazit na LCD obrazovce, musíme je rozdělit na jednotlivé znaky pomocí níže uvedeného kódu.
// Rozdělte na char, aby se zobrazily na lcd char sec_0 = sec% 10; char sec_1 = (s / 10); char min_0 = min% 10; char min_1 = min / 10; char hour_0 = hodina% 10; char hour_1 = hodina / 10;
Dále aktualizujeme hodnoty na obrazovce LCD. Aktuální čas se zobrazí v prvním řádku a nastavený čas, ve kterém musí být spuštěn alarm, se zobrazí na druhém řádku. Kód, který dělá totéž, je uveden níže.
// Zobrazení aktuálního času na LCD obrazovce Lcd_Clear (); Lcd_Set_Cursor (1, 1); Lcd_Print_String ("TIME:"); Lcd_Print_Char (hour_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'); // Zobrazení data na LCD obrazovce 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');
Nyní jsme na LCD zobrazili čas a nastavili čas, který musíme zkontrolovat, zda se uživatel pokouší nastavit čas alarmu. Za tímto účelem musí uživatel stisknout prostřední tlačítko, takže zkontrolujeme, zda je stisknuto prostřední tlačítko, a přepneme proměnnou, aby se dostal do režimu nastavení alarmu. Stejné tlačítko bude stisknuto znovu, aby se potvrdilo, že hodnoty jsou nastaveny, a v takovém případě musíme vyjít z režimu nastavení alarmu. Níže uvedený řádek kódu tedy použijeme ke změně stavu proměnné set_alarm .
// Pomocí prostředního tlačítka zkontrolujte, zda je třeba nastavit budík if (MB == 0 && set_alarm == 0) {// Je-li stisknuto prostřední tlačítko a budík není zapnutý, zatímco (! MB); // Počkejte, až se uvolní tlačítko set_alarm = 1; // začněte nastavovat hodnotu alarmu } if (MB == 0 && set_alarm == 1) {// Pokud je stisknuto prostřední tlačítko a alarm není vypnut, zatímco (! MB); // Počkejte, až se uvolní tlačítko set_alarm = 0; // přestat nastavovat hodnotu alarmu }
Pokud uživatel stiskl prostřední tlačítko, znamená to, že se pokouší nastavit čas alarmu. V tomto případě program vstoupí do režimu nastavení alarmu pomocí výše uvedeného kódu. Pokud uživatel v režimu nastavení budíku stiskne levé nebo pravé tlačítko, znamená to, že musíme pohybovat kurzorem doleva nebo doprava. K tomu jednoduše zvýšíme zmenšení hodnoty polohy, na kterou musí být kurzor umístěn
if (LB == 0) {// Pokud stisknete levé tlačítko, zatímco (! LB); // Počkejte, až se uvolní tlačítko pos--; // Poté posuňte kurzor doleva } if (RB == 0) {// Pokud stisknete pravé tlačítko, zatímco (! RB); // Počkejte, až se uvolní tlačítko pos ++; // Přesuňte kurzor doprava }
Při použití tlačítka s mikrokontrolérem nebo mikroprocesorem existuje jeden společný problém, který je třeba vyřešit. Tento problém se nazývá odskakování přepínače. To znamená, že když je tlačítko stisknuto, mohlo by to vydat hlučné impulsy do MCU / MPU, které by mohly falešné MCU pro více záznamů. Tento problém lze vyřešit přidáním kondenzátoru přes spínač nebo použitím funkce zpoždění, jakmile je detekováno stisknutí tlačítka. Tento typ řešení se nazývá odskakování. Tady jsme použili while smyčku, abychom udrželi program na místě, dokud se tlačítko neuvolní. Toto není nejlepší řešení pro odskakování, ale pro nás to bude fungovat dobře.
while (! RB);
Podobně jako levé a pravé tlačítko máme také horní a dolní tlačítko, které lze použít ke zvýšení nebo snížení hodnoty času alarmu. Níže uvedený kód je stejný. Všimněte si, že každý znak nastaveného času alarmu je adresován hodnotou indexu pole. To bylo, že můžeme snadno přistupovat k požadovanému znaku, jehož hodnoty je třeba změnit.
if (UB == 0) {// Pokud je stisknuto horní tlačítko, zatímco (! UB); // Počkejte, až se uvolní tlačítko alarm_val ++; // Zvyšte konkrétní hodnotu znaku } if (BB == 0) {// Pokud stisknete spodní tlačítko, zatímco (! UB); // Počkejte, až se uvolní tlačítko alarm_val--; // Snížit konkrétní hodnotu znaku }
Jakmile je nastaven čas budíku, uživatel znovu stiskne prostřední tlačítko. Pak můžeme začít porovnávat aktuální čas s nastaveným časem. Porovnání kontrolou, zda se každý znak aktuálního času rovná znaku nastaveného času. Pokud jsou hodnoty stejné, spustíme alarm nastavením proměnné trigger_alarm, jinak budeme jen porovnávat, dokud se nerovná.
// IF alarm is set Check if the set value is equal to current value if (set_alarm == 0 && alarm_val == hour_1 && alarm_val == hour_0 && alarm_val == min_1 && alarm_val == min_0) trigger_alarm = 1; // Zapne spoušť, pokud se hodnota shoduje
Pokud je nastaven alarm, musíme pípnout bzučák, abychom uživatele upozornili na alarm. Toho lze dosáhnout jednoduchým přepínáním bzučáku v pravidelných intervalech, jak je znázorněno níže.
if (trigger_alarm) {// Pokud je spuštěn alarm // Pípnutí bzučáku BUZZ = 1; __delay_ms (500); BUZZ = 0; __delay_ms (500); }
Simulace:
Tento program lze také simulovat pomocí softwaru proteus. Stačí znovu vytvořit obvod zobrazený výše a načíst hexadecimální soubor do PIC. Hex kód pro tento projekt najdete v souboru ZIP, který je propojen zde. Níže je uveden snímek obrazovky pořízený během simulace
Simulace se stává velmi užitečnou, když se pokoušíte přidat do projektu nové funkce. Můžete také použít debuggerový modul I2C ke kontrole, která data vstupují a vystupují přes sběrnici I2C. Můžete zkusit stisknout tlačítka a také nastavit čas budíku. Když se nastavený čas rovná aktuálnímu času, bzučák se nastaví vysoko.
Práce s digitálním budíkem pomocí PIC16F877A:
Vytvořte obvod na prkénku, získejte kód z odkazu ke stažení a zkompilujte jej pomocí kompilátoru MplabX a XC8. Pokud jste si stáhli kód ze zde poskytnutého souboru ZIP, neměli byste mít problém s jeho kompilací, protože soubory záhlaví jsou již připojeny.
Po kompilaci nahrajte program na hardware pomocí programátoru PicKit3. Připojení k připojení pickit programátoru k PIC IC je také znázorněno na schématu zapojení. Po nahrání programu byste měli vidět úvodní obrazovku a poté zobrazený čas, poté můžete pomocí tlačítek nastavit čas budíku. Moje nastavení hardwaru při napájení vypadá takto níže.
Když se čas alarmu shoduje s aktuálním časem, začne bzučák pípat, aby uživatele varoval. Kompletní práci najdete na videu níže. Projekt má celou řadu možností, na nichž lze stavět. Modul RTC může sledovat jakýkoli čas a datum, takže můžete provést naplánovaný úkol v libovolném požadovaném čase / datu. Můžete také připojit střídavý spotřebič, jako je ventilátor nebo světlo, a podle potřeby naplánovat zapnutí nebo vypnutí. Na tomto projektu můžete stále stavět mnohem víc, dejte mi vědět, jaký nápad vás napadne jako upgrade tohoto projektu, a já vás rád slyším.
Doufám, že jste pochopili projekt a naučili se z procesu něco užitečného. Pokud máte pochybnosti o tomto projektu, použijte sekci komentářů k jejich zveřejnění nebo použijte fóra pro technickou pomoc.
Kompletní PIC kód s hlavičkovými soubory najdete zde