Tartalomjegyzék:

Intelligens ébresztőóra a Magicbit használatával (Arduino): 10 lépés
Intelligens ébresztőóra a Magicbit használatával (Arduino): 10 lépés

Videó: Intelligens ébresztőóra a Magicbit használatával (Arduino): 10 lépés

Videó: Intelligens ébresztőóra a Magicbit használatával (Arduino): 10 lépés
Videó: Умный будильник 2024, November
Anonim
Image
Image

Ez az oktatóanyag bemutatja, hogyan lehet intelligens ébresztőórát készíteni a Magicbit fejlesztőtáblán lévő OLED kijelző segítségével RTC modul használata nélkül.

Kellékek

  • Magicbit
  • USB-A-Micro-USB kábel

1. lépés: Történet

Ebben az oktatóanyagban megtudjuk, hogyan lehet intelligens ébresztőórát készíteni a Magicbit segítségével.

2. lépés: HARDVER BEÁLLÍTÁSA

Csatlakoztassa a Magicbit -et a számítógéphez USB -kábel segítségével.

3. lépés: SZOFTVER BEÁLLÍTÁSA

Nyissa meg az Arduino IDE -t, és állítsa be a táblát az Arduino IDE segítségével. Az alábbi link bemutatja, hogyan kell ezt megtenni. Javasoljuk tehát, hogy először lépjen linkre, és ismerkedjen meg a Magic bit -el.

magicbit-arduino.readthedocs.io/en/latest/…

Most válassza ki a megfelelő tábla típusát és portját. Ebben az esetben a kártya típusa Magicbit. A könyvtárak már telepítve vannak a Magicbit könyvtárakban.

4. lépés: Elmélet és módszertan

Ha megnézi az első videót, láthatja, hogy a kijelző két képernyővel rendelkezik.

  • óra képernyő, amely az idő részleteit mutatja
  • riasztó képernyő, amely a riasztás részleteit mutatja

A két képernyő közötti váltáshoz a Magicbit bármelyik két nyomógombját használtuk. Ezek a gombok a Magicbit ESP32 35 (bal gomb) és 34 (jobb gomb) gombjához vannak csatlakoztatva. Az idő és egyéb részletek megjelenítéséhez a beépített OLED kijelzőt használtuk a magicbitben.

Beszéljünk arról, hogyan működnek ezek a grafikus képernyők.

Az óra képernyőn analóg óra, digitális óra, dátum, hónap és év szöveg található.

Az analóg óra létrehozásához néhány grafikus funkciót használunk, amelyek az Adafriut GFX nevű grafikus könyvtárban állnak rendelkezésre. A kör és a vonal függvény használatával analóg órajelet hozunk létre. A bűn és cos nevű egyszerű geometriai függvényeket használják az óramutatók helyzetéhez. Tehát csak azt a szöget írjuk be, amely a forgó kezek idejének felel meg. ehhez először a következőképpen alakítjuk szögre az időt.

  • percmutató szöge = perc*(360/60)
  • óra mutatószög = óra*(360/12)

Az óra számlapja középpontja és az óralap 12 -es száma közötti vonalhoz mért szög. A sin és cos függvények segítségével kiszámíthatjuk az óra- és percvonalak végeinek x és y koordinátáit. Az alábbi kép leírja, hogyan működik.

A koordináták szerint vonalhúzással nyomtatunk óra- és percmutatót. Az Adafruit GFX könyvtárban van szövegnyomtatási funkció is. Segít más részletek nyomtatásában (dátum, hónap és idő számjegyekkel) a kijelzőn. A kód paramétereinek megváltoztatásával megváltoztathatja az analóg óra pozícióját és a szöveges pozíciókat.

Hasonlóan az óra képernyőjéhez, az Adafruit GFX könyvtár szövegnyomtatási funkcióját használtuk az OLED kijelzőn lévő nyomtatási számokhoz a megfelelő helyeken.

5. lépés: A helyi idő beolvasása

Az óra legfontosabb része az, hogy hogyan kapjuk meg pontosan a helyi időt. Ebből a célból használhat külső RTC óra modult vagy beépített RC órát a Magicbit ESP32 -ben. Ebben a projektben a második módszert használtuk. Ebben a módszerben NTP (hálózati időprotokoll) ügyfelet használunk a helyi idő lekéréséhez az internetről. Az internethez való hozzáféréshez az ESP32 beépített WIFI szolgáltatását használtuk. Ezért az első szakaszban WIFI -t használunk az internet eléréséhez SSID és jelszó megadásával. Ezután másodpercek alatt konfigurálnunk kell a gmtOffset és a daylightOffset változókat. Ezeknek a változóknak az értékei világonként eltérőek. A gmtOffset azt jelenti, hogy hány másodperc eltér a GMT -től. Miután megkaptuk a helyi időt, már nem használtuk a WIFI -t. Mert akkor a helyi időt az ESP32 beépített RC órájából számítjuk ki. Ez a time.h könyvtár használatával történik. Van egy egyszerű példa az Arduino -ban (Arduino> Példák> ESP32> Idő> egyszerű idő), hogy megtudja, hogyan működik ez tovább. Ezeket a linkeket is használhatja az NTP kliensről szóló további ismeretekhez.

  • https://dronebotworkshop.com/esp32-intro/
  • https://lastminuteengineers.com/esp32-ntp-server-d…

Miután helyesen kaptuk meg a helyi időt, minden ciklusban megváltoztatjuk az időnket, a szövegeket és a szöget az időinformációknak megfelelően.

6. lépés: A riasztás beállítása

A bal és jobb gombokra kattintva módosíthatja a riasztás dátumát és idejét. A riasztás dátumának és idejének megváltoztatásakor feltétlenül kapcsolja ki a riasztót. A dátum és az idő beállítása után kapcsolja be az ébresztőt. Mert ha a riasztó be van kapcsolva, és amikor az ébresztési idő megegyezik az aktuális idővel, amikor beállítja, akkor a riasztási csengő megszólal. A főkörben mindig ellenőrzi az aktuális helyi időt és a riasztási információk egyenlők. Ha ezek egyenlők, akkor a zümmögő és a Magicbit zöld LED -je egy percen keresztül működik.

7. lépés: A zümmögő beállítása

PWM impulzust használunk a zümmögő hangjának létrehozásához a kódban található analogCwrite () függvény használatával. Az összes könyvtári funkció miatt ESP32 érvényes a Magicbitre. Módosíthatja a zümmögő hangjelzését a frekvencia és a PWM érték megváltoztatásával a kódban.

techtutorialsx.com/2017/06/15/esp32-arduin…

Ez az oldal leírja, hogyan működik a zümmögő az ESP32 rendszerrel.

8. lépés: A gombok beállítása

Az összes állapot megváltoztatásához a Magicbitben két beépített nyomógombot használtunk. A főhurok mindig ellenőrizze két gomb állapotát. Mivel belsőleg húzódtak fel, ott a normál állapot magas jel. Láthatjuk tehát, hogy ezeknek a tűknek a digitális leolvasása 1. Az alapértelmezett szakaszban a kijelző az óra interfészét mutatja. Abban az időben, ha a két gomb bármelyikét megnyomja, akkor a képernyő riasztási képernyőre változik. Ezenkívül másodpercben számoljuk a gombot az utolsó gombnyomás óta. Ha ez a szám nagyobb, mint egy előre meghatározott időtartam, akkor a kijelzőn megjelenik az óra képernyő.

A kódot a kezdők alapvető funkcióinak használatával írják. A kód tehát könnyen érthető, és a módszer segítségével megtudhatja, hogyan működik.

9. lépés: Hibaelhárítás

Néha az óra kicsit később indul, vagy nem megfelelően jeleníti meg a grafikát. Az alábbi tippek segítenek a helyzet megoldásában.

  • Győződjön meg arról, hogy a megfelelő SSID -t és jelszót adta meg
  • Változtassa meg az NTP -kiszolgálót (az interneten számos szerver található, amelyek a régiójához kapcsolódnak).
  • Módosítja az internetkapcsolatot. (Mobil hotspot is lehetséges).

Ezenkívül a soros monitor használatával mindent elháríthat. Az OLED kijelző mellett a soros monitor időinformációkat jelenít meg.

10. lépés: Arduino kód

// könyvtárak OLED kijelzőhöz

#befoglalni

#include #include #define OLED_RESET 4 #include // wifi library for connect #include "time.h" // library for use RC clock // definiálja a bemeneti és kimeneti pin neveket #define RightButton 34 #define LeftButton 35 #define GreenLED 16 #define Buzzer 25 int preTime = 0; int számít = 0; int currentTime = 0; struk tm timeinfo; const char* ssid = "YOUR SSID"; // wifi részletek const char* password = "YOUR JELSZÓ"; int alarmDateTime [5] = {1, 1, 2020, 0, 0}; // alarm varibles int dateIndex = 0; int timeIndex = 0; int selectIndex = -1; bool buzzerOn = 0; int rect [6] [4] = {{5, 0, 118, 16}, {1, 22, 30, 22}, {37, 22, 30, 22}, {73, 22, 55, 22}, {31, 44, 30, 20}, {67, 44, 30, 20}}; // kiválasztási téglalap const char* ntpServer = "asia.pool.ntp.org"; // szerver detais const long gmtOffset_sec = 19800; const int daylightOffset_sec = 0; Adafruit_SSD1306 kijelző (128, 64); // OLED méret meghatározása byte clockCenterY = (display.height () + 16)/2; // analóg óralap részletei byte clockCenterX = (display.height () - 16)/2; byte clockRadius = 23; bool állapot = 0; // képernyő be- vagy kikapcsolása boolean Alarm = 0; // riasztás aktuális állapota String alarmState = "Alarm ON"; // riasztás be vagy ki // változók tárolt időadatok char dayName [10]; char napszám [3]; char hónap [10]; char év [5]; char óra [3]; char perc [3]; char hónapszám [3]; char másodperc [3]; // gombváltozók bool RightState = 1; bool Baloldal = 1; // zümmögő változók int channel = 0; int Frekvencia = 2000; int PWM = 200; int felbontás = 8; void setup () {// bemenet és kimenetek beállítása pinMode (RightButton, INPUT); pinMode (LeftButton, INPUT); pinMode (GreenLED, OUTPUT); pinMode (zümmögő, OUTPUT); display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // intialize display display.display (); késleltetés (3000); display.clearDisplay (); ledcSetup (0, Frekvencia, felbontás); // pwm paraméterek konfigurálása ledcAttachPin (Buzzer, 0); Serial.begin (115200); // soros kommunikáció intilize // csatlakozás a WiFi -hez Serial.printf ("Csatlakozás a %s -hoz", ssid); WiFi.begin (ssid, jelszó); while (WiFi.status ()! = WL_CONNECTED) {delay (500); Soros.nyomtatás ("."); } Serial.println ("CSATLAKOZTATVA"); // init és az idő megszerzése configTime (gmtOffset_sec, daylightOffset_sec, ntpServer); getTime (); // a WiFi leválasztása, mivel már nincs rá szükség WiFi.disconnect (true); WiFi.mód (WIFI_OFF); display.clearDisplay (); } void loop () {getTime (); // kapja meg az aktuális időt // tárolja a jobb és a bal nyomógomb állapotát RightState = digitalRead (RightButton); LeftState = digitalRead (LeftButton); // chaeck a gombokat megnyomják, ha (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // gomb megnyomásakor a csengő hangjelzést ad (100); if (állapot == 0) {// váltás riasztási képernyő keretállapotára = 1; // állapot megváltoztatása riasztási állapotra RightState = LeftState = 1; // csak a változás szükséges} számok = számok = 0; // számláló visszaállítása}, ha (állapot == 1 && (számok) <5) {// ha riasztási képernyőn van, és nincs időtúllépés kiszámításaAlarm (); // kiszámítja a riasztási információ időértékeit showAlarm (); // értékek megjelenítése} else {// ha az órában képernyő állapota = 0; display.clearDisplay (); clockFace (); // analóg órajel nyomtatásLocalTime (); // nyomtatási idő az óralapon és egyéb részletek nyomtatása} onAlarm (); // hasonlítsa össze az ébresztési időt a helyi idővel, és kapcsolja be a riasztási késleltetést (100); // késleltetés riasztás be- és kikapcsolása} void clockFace () {// caalog clock face display.drawCircle (clockCenterX, clockCenterY, clockRadius, WHITE); // órakör nyomtatása (int számjegy = 0; számjegy = 5) {// csak 5 selctions.so visszaállítás -1 -re (-1 = be vagy ki riasztás) selectIndex = -1; } dateAndTimeSelection (selectIndex); // change selction} void dateAndTimeSelection (int index) {if (index == -1) {// riasztás be- vagy kikapcsolása, ha (RightState == 0) {// vált a be- és kikapcsolási riasztás között, ha (alarmState == "Alarm ON") {alarmState = "Alarm OFF"; } else {alarmState = "Riasztás BE"; }}} else {if (RightState == 0) {// más részekben icrement a relátum dátuma vagy ideje a tömb alarmDateTime [index] = alarmDateTime [index] + 1; // index a kiválasztás}} int összehasonlítás [4] = {12, 2030, 23, 59}; // a dátumok és évek felső határai a hónapban [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // a hónap felső határa int resetValue [4] = {1, 2020, 0, 0}; // kezdőértékek (int i = 1; i összehasonlítani [i - 1]) {alarmDateTime = resetValue [i - 1]; }} if (alarmDateTime [0]> comparemonth [alarmDateTime [1] - 1]) {// alapértelmezett értékek visszaállítása, ha a hónapok meghaladják a határértékeket alarmDateTime [0] = 1; }} void showAlarm () {// riasztás részleteinek nyomtatása String alarmDateTime0 = String (alarmDateTime [0]); // karakterláncok konvertálása String alarmDateTime1 = String (alarmDateTime [1]); String alarmDateTime2 = Karakterlánc (alarmDateTime [2]); String alarmDateTime3 = Karakterlánc (alarmDateTime [3]); String alarmDateTime4 = Karakterlánc (alarmDateTime [4]); // ha az értékek egy 1 -es számjegyűek, akkor a "0" értéket kell hozzáadni. if (alarmDateTime [0]

Ajánlott: