2022年3月1日 星期二

零基础入门学用Arduino教程-智能应用篇 - 重點整理

零基础入门学用Arduino教程-智能应用篇 - YouTube

2022.02.22
  • 修改一點程式碼,讓時間的顯示更整齊:
      ......
      ......
      前略
      
      //底下讓時:分:秒的格式更整齊
      if (timeClient.getHours() < 10 ){ //當小時的數值為個位數時,前面補 0
        lcd.print("0"); lcd.print(timeClient.getHours()); 
      } else {
      lcd.print(timeClient.getHours());
      }
      
      lcd.print(":");
      
      if (timeClient.getMinutes() < 10 ){//當分的數值為個位數時,前面補 0
        lcd.print("0"); lcd.print(timeClient.getMinutes()); 
      } else {
      lcd.print(timeClient.getMinutes());
      }
      //lcd.print(timeClient.getMinutes());
      
      lcd.print(":");
    
      if (timeClient.getSeconds() < 10 ){//當秒的數值為個位數時,前面補 0
        lcd.print("0"); lcd.print(timeClient.getSeconds()); 
      } else {
      lcd.print(timeClient.getSeconds());
      }
      //lcd.print(timeClient.getSeconds());
      
      lcd.print("   ");//因為更整齊了,只需要加上三個空白。
    
      lcd.setCursor(0,1);//溫度及溼度顯示在第二列
      lcd.print("T:");lcd.print((int)temperature);lcd.print("*C  ");lcd.print("H:");lcd.print((int)humidity);lcd.print("%   ");
      
      delay(950);//原先為delay(1000),顯示秒數時會有跳過的情形,經過幾次的調整,950 算是比較正常
2022.02.22
  • 完工,中間挖孔的部分實在很醜,手不巧,這也是沒辦法的事:

  • 溫溼度感測器 DHT-11 只能外掛(註:先前用的那顆有問題,下雨天測出的溼度竟然只有四十幾%
  • 內部零件使用熱熔膠固定
  • 由於ESP8266是 Micro USB 接頭,家裡有不少早期 SONY 手機的充電器及Micro USB線,剛好拿來物盡其用。
  • 成本估計:總計約 NT$225
    • ESP8266 約 NT$100
    • DHT-11 約 NT$30
    • LCD1602 I2C Module 約 NT$90
    • 七根杜邦線暫且算 5 元
2022.02.21
  • 說到做到,ESP8266+DHT-11+LCD1602 I2C Module,用了七條 F-F 杜邦線,吃完晚餐花了一個多小時搞定:

  • 程式更完善些,加入了啟動時顯示 WI-FI 連接中:

  • 程式碼:
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
    #include <NTPClient.h>
    #include <ESP8266WiFi.h>
    #include <WiFiUdp.h>
    
    #include <SimpleDHT.h>
    int pinDHT11 = D3;
    SimpleDHT11 dht11;
    
    const char *ssid     = "XXX";//此處改為家裡基地台的 SSID
    const char *password = "XXXXXXXXX";//輸入登入基地台的密碼
    
    const long utcOffsetInSeconds = 28800;//台灣在 UTC+08:00 時區,所以 8*60*60 = 28800
    
    char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
    
    // Define NTP Client to get time
    WiFiUDP ntpUDP;
    NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);
    
    void setup()
    {
    lcd.init(); // 初始化 lcd
    lcd.backlight();
    
    WiFi.begin(ssid, password);
    
    lcd.setCursor(0,0);
    lcd.print("Wi-Fi Connecting");
    lcd.setCursor(0,1);
    while ( WiFi.status() != WL_CONNECTED ) {
      delay ( 500 );
      //lcd.setCursor(0,1); 如果擺在 While 迴圈裡,"."會一直顯示在同一位置
      lcd.print ( "." );
    }
    
    timeClient.begin();
    
    }
    void loop()
    {
      byte temperature = 0;
      byte humidity = 0;
      byte data[40] = {0};
      if (dht11.read(pinDHT11, &temperature, &humidity, data)) {
        lcd.print("Read DHT11 failed");
        return;
      }
      
      timeClient.update();
      
      lcd.setCursor(0,0);
      
      lcd.print(daysOfTheWeek[timeClient.getDay()]);
      lcd.print(", ");
      lcd.print(timeClient.getHours());
      lcd.print(":");
      lcd.print(timeClient.getMinutes());
      lcd.print(":");
      lcd.print(timeClient.getSeconds());
      lcd.print("    ");//這四個空白若不加,會顯示前面的"Wi-Fi Connecting"後面"ting"四個字母
    
      lcd.setCursor(0,1);//溫度及溼度顯示在第二列
      lcd.print("T:");lcd.print((int)temperature);lcd.print("*C  ");lcd.print("H:");lcd.print((int)humidity);lcd.print("%   ");
      
      delay(1000);
      
    }
    
  • 這篇文章:Arduino初體驗 - NodeMCU ESP8266 接LCD 說明了接腳如何連接;拷貝了這篇文章:Getting Date & Time From NTP Server With ESP8266 NodeMCU 的程式碼來顯示時間(把 Serial.print() 改成 lcd.print() 就可以了)。
  • 準備裝入 Apple Pencil 的空盒裡......
2022.02.21
  • 天氣冷又溼,繼續驗貨:LCD1602 I2C Module,Kit 附的範例只顯示 Hello World 太無趣,再加上 DHT-11 來顯示溫度與溼度:

  • 程式很簡單,只是再加上 DHT-11 的範例程式碼而已:
    #include <Wire.h>
    
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
    
    #include <SimpleDHT.h>
    int pinDHT11 = 2;
    SimpleDHT11 dht11;
    
    void setup()
    {
      
    lcd.init(); // initialize the lcd
    lcd.backlight();
    
    }
    void loop()
    {
      byte temperature = 0;
      byte humidity = 0;
      byte data[40] = {0};
      if (dht11.read(pinDHT11, &temperature, &humidity, data)) {
        lcd.print("Read DHT11 failed");
        return;
      }
      
      lcd.setCursor(0,0);//地點顯示在第一列
      lcd.print("Taichung : ");//地點
      lcd.setCursor(0,1);//溫度及溼度顯示在第二列
      lcd.print("T:");lcd.print((int)temperature);lcd.print("*C  ");lcd.print("H:");lcd.print((int)humidity);lcd.print("%");
      delay(1000);// DHT11 sampling rate is 1HZ.
    }
    
  • 這只 LCD 應該只能輸入 ASCII 字元而已,因為要顯示度C的 ˚ 會變成亂碼。
  • 截錄維基百科的說明:「I²C(Inter-Integrated Circuit)字面上的意思是積體電路之間,它其實是I²C Bus簡稱,所以中文應該叫積體匯流排電路,它是一種串列通訊匯流排,使用多主從架構,由飛利浦公司在1980年代為了讓主機板嵌入式系統手機用以連接低速週邊裝置而發展。I²C的正確讀法為「I平方C」("I-squared-C")。」I²C的一個優勢在於其接腳數少。通過兩個接腳以及相應的軟體,微控制器就可以控制某一個網路內的裝置,而使用其他技術則需要更多的接腳。
  • 可以來試試配合 ESP 8266 ,利用 NTP 校時,把現在時刻顯示在第一列,溫度、 溼度顯示在第二列。由於前面已做過利用 ESP 8266 Wi-Fi 達成 NTP 校時的時鐘程式,要再來改應該不難---值得試一試。
2022.02.20
  • 天氣冷又溼,教學影片看累了,就繼續購買的Super Starter Kit for Arduino Uno 套裝各項配件驗貨。這次檢查 Active buzzer,附的範例實在太無趣,找到之前下載的 ElegooTutorial,內有 MorseCode Translater 範例,比較有趣:

  • 但都需要從 Serial Monitor 輸入字串,所以想到 Keypad Membrane Switch Module 也順便一起驗貨,確認也沒問題,下次再來修改程式以它輸入,然後產生 MorseCode 。

2022.02.20
  • 先從頭到尾將整個系列影片看過一遍,把需要再購買的配件整理後,等蝦皮免運日時,找個賣場一次買足。

沒有留言:

張貼留言

您可以留下意見,但 Luke 可能無法馬上回覆,尚請見諒。