ჭკვიანი მაღვიძარა Magicbit– ის გამოყენებით (Arduino): 10 ნაბიჯი
ჭკვიანი მაღვიძარა Magicbit– ის გამოყენებით (Arduino): 10 ნაბიჯი
Anonim
Image
Image

ეს გაკვეთილი გვიჩვენებს, თუ როგორ უნდა გავაკეთოთ ჭკვიანი მაღვიძარა OLED ეკრანის გამოყენებით Magicbit dev დაფაზე RTC მოდულის გამოყენების გარეშე.

მარაგები

  • მეჯიბბიტი
  • USB-A მიკრო USB კაბელი

ნაბიჯი 1: ისტორია

ამ გაკვეთილში ჩვენ ვისწავლით თუ როგორ უნდა გავაკეთოთ ჭკვიანი მაღვიძარა Magicbit– ის გამოყენებით.

ნაბიჯი 2: HARDWARE SETUP

შეაერთეთ თქვენი Magicbit კომპიუტერთან USB კაბელის გამოყენებით.

ნაბიჯი 3: პროგრამული უზრუნველყოფის დაყენება

გახსენით თქვენი Arduino IDE და დააინსტალირეთ დაფა Arduino IDE– ით. შემდეგი ბმული მიუთითებს იმაზე, თუ როგორ უნდა გავაკეთოთ ეს. ჩვენ გირჩევთ, რომ პირველ რიგში გადადით ბმულზე და გაეცანით Magic bit- ს.

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

ახლა შეარჩიეთ დაფის ტიპი და პორტი. ამ შემთხვევაში დაფის ტიპია Magicbit. ბიბლიოთეკები უკვე დამონტაჟებულია Magicbit ბიბლიოთეკების დროს.

ნაბიჯი 4: თეორია და მეთოდოლოგია

თუ გადახედავთ პირველ ვიდეოს, ხედავთ რომ ეკრანს აქვს 2 ეკრანი.

  • საათის ეკრანი, რომელიც აჩვენებს დროის დეტალებს
  • მაღვიძარა, რომელიც აჩვენებს განგაშის დეტალებს

ამ ორ ეკრანზე გადასატანად ჩვენ გამოვიყენეთ ორი ღილაკი Magicbit– ში. ეს ღილაკები უკავშირდება ESP32– ის 35 (მარცხენა ღილაკს) და 34 (მარჯვენა ღილაკს) Magicbit– ში. დროის და სხვა დეტალების საჩვენებლად ჩვენ გამოვიყენეთ ჩამონტაჟებული OLED ეკრანი მაგბიტში.

მოდით ვისაუბროთ იმაზე, თუ როგორ მუშაობს ეს გრაფიკული ეკრანები.

საათის ეკრანს აქვს ანალოგური საათი, ციფრული საათი, თარიღი, თვე და წელი ტექსტები.

ანალოგური საათის შესაქმნელად ჩვენ ვიყენებთ გრაფიკულ ფუნქციებს, რომლებიც ხელმისაწვდომია გრაფიკულ ბიბლიოთეკაში, სახელწოდებით Adafriut GFX. წრის ფუნქციისა და ხაზის ფუნქციის გამოყენებით ჩვენ ვქმნით საათის ანალოგურ სახეს. მარტივი გეომეტრიული ფუნქციები, სახელწოდებით sin და cos გამოიყენება საათის ხელების პოზიციის დასადგენად. ამრიგად, ჩვენ შევიყვანთ მხოლოდ იმ კუთხეს, რომელიც შეესაბამება ხელების ბრუნვის დროს. ამისათვის ჩვენ პირველად ვაქცევთ დროს კუთხედ შემდეგნაირად.

  • წუთიანი ხელის კუთხე = წუთი*(360/60)
  • საათების კუთხე = საათები*(360/12)

კუთხე, რომელიც იზომება საათის ცენტრის ცენტრსა და ნომრის 12 საათს შორის. Sin და cos ფუნქციების გამოყენებით შეგვიძლია გამოვთვალოთ საათის და წუთის ხაზების ბოლოების x და y კოორდინატები. ქვემოთ მოყვანილი სურათი აღწერს როგორ არის საქმე.

კოორდინატების მიხედვით ჩვენ ვბეჭდავთ საათსა და წუთს ხელით ხაზების დახაზვით. ასევე არსებობს ტექსტის ბეჭდვის ფუნქცია Adafruit GFX ბიბლიოთეკაში. ის ეხმარება ეკრანზე სხვა დეტალების დაბეჭდვას (თარიღი, თვე და დრო ციფრებში აჩვენებს). თქვენ შეგიძლიათ შეცვალოთ ანალოგური საათის და ტექსტის პოზიციები კოდში პარამეტრების შეცვლით.

როგორც საათის ეკრანზე, ჩვენ ვიყენებდით ტექსტის ბეჭდვის ფუნქციას Adafruit GFX ბიბლიოთეკაში OLED ეკრანზე შესაბამისი ადგილების ნომრების დასაბეჭდად.

ნაბიჯი 5: მიიღეთ ადგილობრივი დრო

საათის ყველაზე მნიშვნელოვანი ნაწილია ის, თუ როგორ ვიღებთ ადგილობრივ დროს ზუსტად. ამ მიზნით თქვენ შეგიძლიათ გამოიყენოთ გარე RTC საათის მოდული ან ჩაშენებული RC საათი ESP32– ში Magicbit– ში. ამ პროექტში ჩვენ გამოვიყენეთ მეორე მეთოდი. ამ მეთოდით ჩვენ ვიყენებთ NTP (ქსელის დრო protocall) კლიენტს ადგილობრივი დრო ინტერნეტიდან. ინტერნეტზე წვდომისთვის ჩვენ გამოვიყენეთ ჩაშენებული WIFI მოწყობილობა ESP32– ში. ამიტომ პირველ ეტაპზე ჩვენ ვიყენებთ WIFI– ს ინტერნეტში შესასვლელად SSID– ისა და პაროლის მიწოდებით. შემდეგ ჩვენ უნდა დავაკონფიგურიროთ gmtOffset და daylightOffset ცვლადებში წამებში. ამ ცვლადების მნიშვნელობები განსხვავდება მსოფლიოს რეგიონიდან რეგიონში. gmtOffset ნიშნავს წამის რაოდენობას, რომელიც თქვენ განსხვავდებით GMT– სგან. უმეტესობისთვის დღის სინათლე Offset არის 3600. შეგიძლიათ იპოვოთ ის ინტერნეტში. მას შემდეგ რაც მივიღეთ ამჟამინდელი ადგილობრივი დრო ჩვენ აღარ გამოვიყენეთ WIFI. რადგან ჩვენ გამოვთვლით ადგილობრივ დროს ჩაშენებული RC საათიდან ESP32- ში. ეს ხდება time.h ბიბლიოთეკის გამოყენებით. Arduino– ში არის მარტივი მაგალითი (Arduino> მაგალითები> ESP32> დრო> უბრალო დრო), რომ გაეცნოთ როგორ მუშაობს ეს შემდგომში. ასევე ეს ბმულები შეგიძლიათ გამოიყენოთ NTP კლიენტის შესახებ დამატებითი ცოდნისათვის.

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

მას შემდეგ, რაც ადგილობრივი დრო სწორად მივიღეთ, ჩვენ ვცვლით დროს, რომელიც გვიჩვენებს ტექსტებს და კუთხეს იმ დროის ინფორმაციის მიხედვით, თითოეულ მარყუჟში.

ნაბიჯი 6: სიგნალიზაციის დაყენება

მარცხენა და მარჯვენა ღილაკებზე დაჭერით შეგიძლიათ შეცვალოთ განგაშის თარიღი და დრო. დარწმუნდით, რომ გამორთეთ მაღვიძარა, როდესაც შეცვლით განგაშის თარიღს და დროს. თარიღისა და დროის დაყენების შემდეგ ჩართეთ მაღვიძარა. იმის გამო, რომ თუ სიგნალიზაცია ჩართულია და როდესაც განგაშის დრო უდრის თქვენს ამჟამინდელ დროს მისი შექმნისას, განგაშის ზარი დარეკავს. მთავარ მარყუჟში ყოველთვის ამოწმებს მიმდინარე ადგილობრივ დროს და განგაშის ინფორმაცია თანაბარია. თუ ისინი თანაბარია, მაშინ ზუზუნი და ჩამონტაჟებული მწვანე LED Magicbit– ში იმუშავებს ერთი წუთის განმავლობაში.

ნაბიჯი 7: ბუზერის დაყენება

ჩვენ ვიყენებთ PWM იმპულსს, რათა შევქმნათ ზარის ხმა კოდში analogCwrite () ფუნქციის გამოყენებით. ბიბლიოთეკის ყველა ფუნქციის გამო ESP32 მოქმედებს Magicbit– ისთვის. თქვენ შეგიძლიათ შეცვალოთ ზარის სიგნალის ხმა კოდში მისი სიხშირისა და PWM მნიშვნელობის შეცვლისგან.

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

ეს გვერდი აღწერს თუ როგორ მუშაობს ზუმერი ESP32– ით.

ნაბიჯი 8: ღილაკების დაყენება

ყველა მდგომარეობის შესაცვლელად, ჩვენ გამოვიყენეთ ორი ჩაშენებული ღილაკი Magicbit– ში. მთავარი მარყუჟი ყოველთვის ამოწმებს ორი ღილაკის მდგომარეობას. იმის გამო, რომ ისინი შინაგანად გამოვიდნენ, იქ ნორმალური მდგომარეობა მაღალი სიგნალია. ასე რომ თქვენ ხედავთ ციფრული წაკითხვის იმ ქინძისთავები 1. ნაგულისხმევ ეტაპზე ეკრანი აჩვენებს საათის ინტერფეისს. იმ დროს, როდესაც რომელიმე ორი ღილაკი დაჭერილია, ის ცვლის ეკრანს მაღვიძარაზე. ასევე ჩვენ ვთვლით დროს წამებში ბოლო დროს, როდესაც ღილაკი დაჭერილია. თუ ეს რიცხვი აღემატება განსაზღვრულ ხანგრძლივობას, ეკრანი აჩვენებს საათის ეკრანს.

კოდი იწერება დამწყებთათვის ძირითადი ფუნქციების გამოყენებით. ასე რომ, კოდის გაგება მარტივია და თქვენ შეგიძლიათ გაიგოთ მეთოდი როგორ მუშაობს კოდის მითითებით.

ნაბიჯი 9: პრობლემების მოგვარება

ზოგჯერ საათი იწყება ცოტა მოგვიანებით ან ის არ აჩვენებს გრაფიკას სწორად. შემდეგი რჩევები დაგეხმარებათ სიტუაციის მოგვარებაში.

  • დარწმუნდით, რომ მიუთითეთ სწორი SSID და პაროლი
  • შეცვალეთ NTP სერვერი (შეგიძლიათ იპოვოთ ბევრი სერვერი ინტერნეტიდან, რომელიც ეხება თქვენს რეგიონს).
  • ცვლის ინტერნეტ კავშირს. (შესაძლებელია მობილური ცხელ წერტილსაც).

ასევე თქვენ შეგიძლიათ პრობლემის მოგვარება სერიული მონიტორის გამოყენებით. OLED ეკრანის გარდა სერიული მონიტორი აჩვენებს დროის ინფორმაციას.

ნაბიჯი 10: Arduino კოდი

// ბიბლიოთეკები OLED დისპლეისთვის

#ჩართეთ

#მოიცავს #მოიცავს #განსაზღვრა #OLED_RESET 4 #მოიცავს // wifi ბიბლიოთეკას დასაკავშირებლად #მოიცავს "time.h" // ბიბლიოთეკას RC საათი // განსაზღვრეთ შემავალი და გამომავალი პინების სახელები #განსაზღვრეთ მარჯვენა ღილაკი 34 #განსაზღვრეთ მარცხენა ღილაკი 35 #განსაზღვრეთ მწვანე LED 16 #განსაზღვრეთ Buzzer 25 int წინასწარ დრო = 0; int ითვლის = 0; int currentTime = 0; struct tm timeinfo; const char* ssid = "YOUR SSID"; // wifi დეტალები const char* პაროლი = "YOUUR PASSWORD"; int alarmDateTime [5] = {1, 1, 2020, 0, 0}; // სიგნალიზაციის ცვლადი 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}}; // შერჩევის მართკუთხედი const char* ntpServer = "asia.pool.ntp.org"; // სერვერი arrestis const long gmtOffset_sec = 19800; const int daylightOffset_sec = 0; Adafruit_SSD1306 ჩვენება (128, 64); // OLED ზომა განსაზღვრეთ ბაიტი clockCenterY = (ჩვენება. სიმაღლე () + 16)/2; // ანალოგური საათის სახე დეტალები ბაიტი clockCenterX = (ჩვენება. სიმაღლე () - 16)/2; ბაიტი clockRadius = 23; bool state = 0; // ეკრანის ჩართვა ან გამორთვა ლოგიკური სიგნალიზაცია = 0; // სიგნალიზაციის ამჟამინდელი მდგომარეობა String alarmState = "სიგნალი ჩართულია"; // სიგნალიზაცია ჩართულია ან გამორთული // ცვლადი დროის შენახული მონაცემების char day სახელი [10]; char daynumber [3]; char თვე [10]; char წელი [5]; ნახშირის საათი [3]; char წუთი [3]; char თვის რიცხვი [3]; ნახშირის წამი [3]; // ღილაკის ცვლადი bool RightState = 1; bool LeftState = 1; // buzzer ცვლადები int channel = 0; int სიხშირე = 2000; int PWM = 200; int რეზოლუცია = 8; void setup () {// შეყვანის და ამონაწერების დაყენება pinMode (RightButton, INPUT); pinMode (LeftButton, INPUT); pinMode (GreenLED, OUTPUT); pinMode (Buzzer, OUTPUT); display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // ჩვენების ინტიციალიზაცია. ჩვენება (); დაგვიანება (3000); display.clearDisplay (); ledcSetup (0, სიხშირე, გარჩევადობა); // pwm პარამეტრების კონფიგურაცია ledcAttachPin (Buzzer, 0); Serial.begin (115200); // სერიული კომუნიკაციის ინტილიზაცია // დაკავშირება WiFi Serial.printf (" %s- თან დაკავშირება", ssid); WiFi.begin (ssid, პაროლი); while (WiFi.status ()! = WL_CONNECTED) {დაგვიანებით (500); Serial.print ("."); } Serial.println ("დაკავშირებულია"); // init და მიიღეთ დროის configTime (gmtOffset_sec, daylightOffset_sec, ntpServer); getTime (); // გათიშეთ WiFi, რადგან ის აღარ არის საჭირო WiFi.disconnect (ჭეშმარიტი); WiFi.mode (WIFI_OFF); display.clearDisplay (); } void loop () {getTime (); // მიიღეთ მიმდინარე დრო // შეინახეთ მარჯვენა და მარცხენა ღილაკის მდგომარეობები RightState = digitalRead (RightButton); LeftState = digitalRead (LeftButton); // დააწკაპუნეთ ღილაკებზე დაჭერით თუ (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // როდესაც ღილაკს დააწკაპუნებთ ზუზერის სიგნალის სიგნალის დაგვიანებით (100); თუ (მდგომარეობა == 0) {// შეცვლა განგაშის ეკრანის ჩარჩოს მდგომარეობაში = 1; // მდგომარეობის შეცვლა განგაშის მდგომარეობაში RightState = LeftState = 1; // ჩვენ გვჭირდება მხოლოდ sceern} რიცხვის შეცვლა = 0; // გადატვირთვის მრიცხველი} თუ (მდგომარეობა == 1 && (ითვლის) <5) {// თუ სიგნალიზაციის ეკრანზეა და დროის ამოწურვის გარეშე გაანგარიშებაAlarm (); // გამოთვალეთ სიგნალიზაციის ინფორმაციის მნიშვნელობები showAlarm (); // მნიშვნელობების ჩვენება} სხვა {// თუ საათია ეკრანის მდგომარეობა = 0; display.clearDisplay (); clockFace (); // ანალოგური საათის სახე printLocalTime (); // საათის ბეჭდვა საათის სახეში და სხვა დეტალების დაბეჭდვა} onAlarm (); // შეადარეთ განგაშის დრო ადგილობრივ დროს და ჩართეთ მაღვიძარას დაყოვნება (100); // დაგვიანებით მაღვიძარა ჩართული და გამორთული} void clockFace () {// caalog clock face display.drawCircle (clockCenterX, clockCenterY, clockRadius, WHITE); // საათების ბეჭდვის ბეჭდვა (int ციფრი = 0; ციფრი = 5) {// მხოლოდ 5 selctions.so გადატვირთეთ -1 (-1 = ჩართულია ან გამორთულია) selectIndex = -1; } თარიღი და თარიღი (alarmState == "სიგნალი ჩართულია") {alarmState = "სიგნალი გამორთულია"; } else {alarmState = "მაღვიძარა ჩართულია"; }}} სხვა {if (RightState == 0) {// სხვა სელექციებში მიუთითეთ თარიღი ან დრო მასივში alarmDateTime [index] = alarmDateTime [index] + 1; // ინდექსი არის შერჩევა}} int შედარება [4] = {12, 2030, 23, 59}; // თარიღებისა და წლების ზედა ზღვარი შედარებისთვის [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // თვეების ზედა ლიმი int resetValue [4] = {1, 2020, 0, 0}; // საწყისი მნიშვნელობები (int i = 1; მე ვადარებ [i - 1]) {alarmDateTime = resetValue [i - 1]; }} if (alarmDateTime [0]> შედარების თვე [alarmDateTime [1] - 1]) {// გადატვირთეთ vlaues თუ თვეები აღემატება მათ ზღვრებს alarmDateTime [0] = 1; }} void showAlarm () {// დაბეჭდე განგაშის დეტალები String alarmDateTime0 = სიმებიანი (alarmDateTime [0]); // ნაკეცების გადაკეთება სიმებიანი alarmDateTime1 = სიმებიანი (alarmDateTime [1]); სიმებიანი alarmDateTime2 = სიმებიანი (alarmDateTime [2]); სიმებიანი alarmDateTime3 = სიმებიანი (alarmDateTime [3]); სიმებიანი alarmDateTime4 = სიმებიანი (alarmDateTime [4]); // თუ მნიშვნელობებს აქვთ ერთი 1 ციფრი დაამატეთ "0" მათ. თუ (alarmDateTime [0]

გირჩევთ: