崑山科技大學 微處理機應用暨實習(一) 講師:曹永忠 日期:105學年度第二學期 Ameba 8195AM 網路程式開發基本介紹 崑山科技大學 微處理機應用暨實習(一) 講師:曹永忠 日期:105學年度第二學期
大 綱 前言 空氣盒子產品 Arduino 程式介紹 Arduino 程式介面 Arduino架構 程式開發 啟動開發環境 Q&A 關於作者 參考資料 2019/4/27
Arduino 程式介紹 2019/4/27
Arduino 程式架構 2019/4/27 4
Arduino程式的介面 功能表
將程式燒入到 Arduino 開啟舊檔 回傳值 同等於C語言的Rebuild All 儲存檔案 開新檔案
撰寫程式內容 要注意是否連線, 若未連線可以Rebuild但不可燒入
未連線 已連線
Arduino程式架構 (一.)宣告: Arduino宣告方式與C相同,例如:int,float… (二.)初始化 Setup(): 使Arduino板子裝置妥當的指令 EX: int ledPin=7; / 宣告Arduino7號腳為輸入腳/ Setup() { pinMode(ledPin,INPUT); }
(三.)執行Loop(): 為程式的主要內容,這程式內容會一直重複被執行 EX: Loop() { …… }
(四. )函式: 1. pinMode(7,INPUT) //將腳位7設定為輸入模式 2 (四.)函式: 1. pinMode(7,INPUT) //將腳位7設定為輸入模式 2. digitalWrite(8,HIGH) (數位腳專用) //將腳位8設定輸出高電位 3. val=digitalRead(7) (數位腳專用) //讀出腳位7的值並指定給 val變數
4. analogWrite(9,128) (數位訊號專用所設計的函式) //將擁有PWM的數位腳位9 設定輸出電位2 4.analogWrite(9,128) (數位訊號專用所設計的函式) //將擁有PWM的數位腳位9 設定輸出電位2.5V對應值大 約為128 5. val=analogRead(0) (類比腳專用) //讀出腳位0的值並指定給 val變數(且analogRead可讀 取範圍0(0V)~1023(5V))
系統開發 2019/4/27 13
啟動開發環境 2019/4/27 14
開啟程式 2019/4/27 15
啟動程式 2019/4/27 16
選擇開發版 2019/4/27 17
確定通訊埠 2019/4/27 18
選擇通訊埠 2019/4/27 19
開啟程式 2019/4/27 20
讀取WIFI MAC資料 2019/4/27 21
開啟程式CheckMac 2019/4/27 22
CheckMac 程式重點解說 #include <WiFi.h> 使用網路必要函數 uint8_t MacData[6]; 儲存 MAC資料 GetWifiMac() 取得MAC函數 WiFi.status(); 顯示WIFI狀態 WiFi.macAddress(MacData); 取得MAC資料 print2HEX() 轉換內容為十六進位碼 2019/4/27 23
檢查AP是否連接的上 2019/4/27 24
開啟程式CheckAP 2019/4/27 25
CheckAP程式重點解說 #include <WiFi.h> 使用網路必要函數 uint8_t MacData[6]; 儲存 MAC資料 IPAddress Meip ,Megateway ,Mesubnet ; 宣告ip、閘道器、子網路遮罩 int status = WL_IDLE_STATUS; 連線網路狀態 GetWifiMac() 取得MAC函數 ShowMac() ; 秀出MAC資料 WiFi.status(); 顯示WIFI狀態 WiFi.macAddress(MacData); 取得MAC資料 initializeWiFi(); 進行連線 printWifiData() ; 列印網路狀態資訊 2019/4/27 26
CheckAP程式重點解說 status = WiFi.begin(ssid); 不使用加密連AP status = WiFi.begin(ssid, pass); 使用加密連AP status == WL_CONNECTED 連AP是否成功 WiFi.status() 連接成功狀態 Meip = WiFi.localIP(); 取得連線IP Megateway = WiFi.gatewayIP();取得連線閘道器 WiFi.subnetMask(); 取得連線子網路遮罩 2019/4/27 27
ScanNetworks(掃描AP) 2019/4/27 28
開啟程式ScanNetworks 2019/4/27 29
ScanNetworks 程式重點解說 #include <WiFi.h> 使用網路必要函數 WiFi.status() == WL_NO_SHIELD 檢查有網路供能否 WiFi.firmwareVersion();檢查網路韌體版本 listNetworks() 列出可連接到的AP(自訂) WiFi.scanNetworks(); 取得可連接到的AP並存入(-1為沒有AP可連接) WiFi.SSID(n) 可連接到的AP(n)的名字 WiFi.RSSI(n) 可連接到的AP(n)的RSSI WiFi.encryptionTypeEx(n)可連接到的AP(n)的加密方式I 2019/4/27 30
WIFIAPMODE(啟動AP模式) 2019/4/27 31
開啟程式WIFIAPMODE 2019/4/27 32
WIFIAPMODE程式重點解說 WiFi.apbegin(ssid, pass, channel); 啟動AP模式 SsidAP名字 PassAP 連線密碼 ChannelAP 連線通道 printWifiData(); 列印網路資訊 WiFi.BSSID(bssid); 列印AP網路資訊 WiFi.encryptionType(); AP加密狀態 2019/4/27 33
WebServerControlRelay 使用Client模式建立網頁伺服器 2019/4/27 34
開啟程式WebServerControlRelay 2019/4/27 35
電路連接 2019/4/27 36
WebServerControlRelay程式重點解說 #include <WiFi.h> 使用網路必要函數 WiFiServer server(80); 啟動PORT 80進行 status = WiFi.begin(ssid); 不使用加密連AP status = WiFi.begin(ssid, pass); 使用加密連AP server.begin(); 開始啟動PORT 80 傾聽 printWifiStatus(); 列印網路資訊 WiFiClient client = server.available(); 有人連接Port 80 client.connected() 有用戶連接中 client.available() 用戶送資料進來 2019/4/27 37
WebServerControlRelay程式重點解說 char c = client.read(); 讀出用戶送的資料(一個位元組) client.println(“HTTP/1.1 200 OK”); …. 送給用戶端一段HTML碼,用瀏覽器方能顯示 currentLine.endsWith(“GET /H”) 判斷是否用/H 結束 currentLine.endsWith(“GET /L”) 判斷是否用/L 結束 client.stop(); 與用戶連線停止傳輸資料 2019/4/27 38
網頁畫面 2019/4/27 39
APMODEControlRelay 使用AP模式建立網頁伺服器 2019/4/27 40
開啟程式APMODEControlRelay 2019/4/27 41
電路連接 2019/4/27 42
APMODEControlRelay程式重點解說 #include <WiFi.h> 使用網路必要函數 WiFiServer server(80); 啟動PORT 80進行 status = WiFi.begin(ssid); 不使用加密連AP status = WiFi.begin(ssid, pass); 使用加密連AP server.begin(); 開始啟動PORT 80 傾聽 printWifiStatus(); 列印網路資訊 WiFiClient client = server.available(); 有人連接Port 80 client.connected() 有用戶連接中 client.available() 用戶送資料進來 2019/4/27 43
APMODEControlRelay程式重點解說 char c = client.read(); 讀出用戶送的資料(一個位元組) client.println(“HTTP/1.1 200 OK”); …. 送給用戶端一段HTML碼,用瀏覽器方能顯示 currentLine.endsWith(“GET /H”) 判斷是否用/H 結束 currentLine.endsWith(“GET /L”) 判斷是否用/L 結束 client.stop(); 與用戶連線停止傳輸資料 2019/4/27 44
網頁畫面 2019/4/27 45
Set_RTC_Data(設定RTC時間) 2019/4/27 46
開啟程式Set_RTC_Data 2019/4/27 47
電路連接 2019/4/27 48
電路連接 2019/4/27 49
Set_RTC_Data程式重點解說 #include <Wire.h> I2C通訊用 #include “RTClib.h“ DS1307 時鐘模組用 RTC_DS1307 RTC; 宣告時鐘物件 initRTC() ; 啟動時鐘物件(自訂) Wire.begin(); 開始I2C通訊 RTC.begin(); 開始時鐘物件通訊 RTC.isrunning() 時鐘物件順利啟動 RTC.adjust(DateTime(mYear,mMonth,mDay,mHour,mMinute,mSecond)); 調整設定DS1307 時鐘模組時間內容 2019/4/27 50
執行畫面 2019/4/27 51
ReadTime(讀取RTC時間) 2019/4/27 52
開啟程式ReadTime 2019/4/27 53
電路連接 2019/4/27 54
電路連接 2019/4/27 55
ReadTime程式重點解說 #include <Wire.h> I2C通訊用 #include “RTClib.h“ DS1307 時鐘模組用 RTC_DS1307 RTC; 宣告時鐘物件 initRTC() ; 啟動時鐘物件(自訂) Wire.begin(); 開始I2C通訊 RTC.begin(); 開始時鐘物件通訊 RTC.isrunning() 時鐘物件順利啟動 ShowDateTime() 顯示DS1307 時鐘內容(自訂) 2019/4/27 56
ReadTime程式重點解說 DateTime now = RTC.now(); 取得RTC時鐘物件 now.hour() 取得小時 now.minute() 取得分 now.second() 取得秒 now.year() 取得年 now.month() 取得月 now.day() 取得日 2019/4/27 57
執行畫面 2019/4/27 58
UdpNtpClient 讀取網路時間資料 2019/4/27 59
開啟程式UdpNtpClient 2019/4/27 60
UdpNtpClient程式重點解說 #include <WiFi.h> 使用網路必要函數 #include <PubSubClient.h>使用網路UDP必要函數 #include <WiFiUdp.h>使用網路UDP必要函數 uint8_t MacData[6]; 儲存 MAC資料 const char ntpServer[] = “pool.ntp.org”; 網路時間伺服器 initializeWiFi(); 啟動網路 ShowNTPDateTime() ; 取得網路時間並顯示 retrieveNtpTime() ;取得網路時間 getCurrentTime(epoch+timeZoneOffset, &NDPyear, &NDPmonth, &NDPday, &NDPhour, &NDPminute, &NDPsecond); 將網路時間存入變數 2019/4/27 61
UdpNtpClient程式重點解說 Udp.beginPacket(ntpServer, 123) 與網路伺服器通訊 Udp.write(nptSendPacket, NTP_PACKET_SIZE); 告訴網路伺服器要取得時間 Udp.endPacket(); 結束通訊 Udp.parsePacket() 得到網路伺服器傳送時間資料通知 Udp.read(ntpRecvBuffer, NTP_PACKET_SIZE) 讀取網路伺服器傳送時間資料 epoch = secsSince1900 - seventyYears ; 計算時間 epochSystem = epoch - millis() / 1000;計算時間(秒) getCurrentTime() 計算網路時間,回傳年、月、日、時、分、秒到變數 2019/4/27 62
執行畫面 2019/4/27 63
SetTime_fromNet 網路校時 2019/4/27 64
開啟程式SetTime_fromNet 2019/4/27 65
SetTime_fromNet程式重點解說 #include <WiFi.h> 使用網路必要函數 uint8_t MacData[6]; 儲存 MAC資料 initRTC() ; 初始化時鐘模組 ShowNTPDateTime() ; 取得網路時間並顯示 retrieveNtpTime() ;取得網路時間 getCurrentTime(epoch+timeZoneOffset, &NDPyear, &NDPmonth, &NDPday, &NDPhour, &NDPminute, &NDPsecond); 將網路時間存入變數 SetRTCTime(NDPyear, NDPmonth, NDPday, NDPhour, NDPminute, NDPsecond); 將取得網路時間調整時鐘模組 2019/4/27 66
執行畫面 2019/4/27 67
WiFiWebClient 讀取網頁資料 2019/4/27 68
開啟程式WiFiWebClient 2019/4/27 69
WiFiWebClient程式重點解說 #include <WiFi.h> 使用網路必要函數 uint8_t MacData[6]; 儲存 MAC資料 GetWifiMac() 取得MAC函數 WiFi.status(); 顯示WIFI狀態 printWifiStatus(); 列印網路狀態 client.connect(server, 80) 連到Server(用port80) client.println(“GET /search?q=ameba HTTP/1.1”); 送給伺服器端資料 client.available() 連線對象要送資料 char c = client.read(); 讀取連線對象要送資料 2019/4/27 70
lcd1602_I2C_mills 顯示資料在LCD上 2019/4/27 71
開啟程式lcd1602_I2C_mills 2019/4/27 72
開啟程式lcd1602_I2C_mills 2019/4/27 73
lcd1602_I2C_mills程式重點解說 #include <I2CIO.h> I2C 函數 #include <LCD.h> LCD函數 #include <LiquidCrystal_I2C.h> I2C版LCD函數 #define I2C_ADDR 0x27 設定LCD I2C位址 lcd.begin (16,2); 設定LCD寬度與高度 lcd.setBacklight(LED_ON); 設定LCD背光 lcd.backlight();啟動LCD背光 lcd.setCursor(0,0); LCD歸零定位 lcd.print(“Hello, world!”); 印出Hello World 2019/4/27 74
DHTx 讀取溫溼度資料 2019/4/27 75
開啟程式DHTx 2019/4/27 76
電路連接 2019/4/27 77
電路連接 2019/4/27 78
DHTx 程式重點解說 #include “DHT.h” 使用溫溼度模組必要函數 #define DHTTYPE DHT22 宣告使用哪種DHT溫溼度模組 DHT dht(DHTSensorPin, DHTTYPE); 取得溫溼度物件 dht.begin(); 溫溼度物件通訊 ShowHumidity() ; 顯示溫溼度資料(自訂) dht.readHumidity(); 讀取濕度 ht.readTemperature(true); 讀取溫度 2019/4/27 79
Q & A 感謝聆聽 恭請指教 2019/4/27