目前分類:ESP32(Arduino) (97)

瀏覽方式: 標題列表 簡短摘要

各位讀者大家好,自從開始認真寫ESP32教學資料後,發現瀏覽量逐步上升,也代表ESP32逐漸成為Arduino系列的主流產品,在教學資料越來越豐富之後,也越來越難分類、整理,因此衍生將網站的資料彙整成書籍的想法,最終「台科大」圖書願意提供本人機會,讓我將書籍整理完成,並且在2021/6/8日上架博客來,歡迎各位朋友選購

博客來網址:https://www.books.com.tw/products/0010901195

書內程式範例下載:https://t.ly/wed6(作者本人的Google網路空間)

IoT物聯網應用:使用ESP32開發版與Arduino C程式語言
作者: 尤濬哲  
出版社:台科大  
出版日期:2021/06/08
語言:繁體中文
定價:420元
優惠價:9折378元

本書採用全彩印書,頁數300頁卻不到400元,是因為筆者沒有收取任何稿費,會這樣的原因是大部分的讀者本來就是看我的網頁學習,網站就是公開的就沒收錢,所以出版書籍當然也就沒必要收費,不過雖然是整理網站的資料出版,但是內容是更加詳細,附圖也是更加精美,也不會像網站資料跳來跳去,書籍編排依照筆者多年教學經驗編排,並採用專題式教學,能夠充分引起學生興趣來完成專案作品,因此非常適合高中職、大學的物聯網課程。


本書的特點如下

  • 1.相容平台:教學採用傳統ArduinoIDE平台,語法與UNO相同易上手
  • 2.專題教學:以專題方式教學,每章節為實際完成的專案。
  • 3.圖示清楚:全書彩色印刷,晶片圖解接線清楚,容易操作。
  • 4.物聯應用:搭配知名網路服務,串連ThingSpeak、Line、Google、MQTT等各種物聯網應用。
  • 5.影像專題:對於ESP32CAM進行解說,讓Arduino也可以傳輸影像。

內容目錄

Chapter 1 認識物聯網與 Arduino  
1-1  Arduino歷史與物聯網
1-2  常見晶片比較
1-3  ESP32腳位編號及用途

Chapter 2 ESP32開發環境架設  
2-1  ESP32環境設定
2-2  Hello World!   

Chapter 3 數位寫入及數位讀取  
3-1  數位寫入(digitalWrite):路口紅綠燈
3-2  數位讀取(digitalRead):來客報知機  

Chapter 4 類比讀取與類比寫入  
4-1  類比讀取(analogRead):多段小夜燈  
4-2  類比寫入(analogWrite):空氣品質指示燈

Chapter 5 超音波與蜂鳴器  
5-1  超音波距離感測
5-2  倒車雷達

Chapter 6 溫濕度與 1602LCD  
6-1  溫濕度感測(DHT11)
6-2  1602LCD顯示器

Chapter 7 藍牙應用
7-1  簡易藍牙傳輸
7-2  藍牙雙向傳輸
7-3  藍牙指令與語音辨識
 
Chapter 8 無線網路  
8-1  網路連線  
8-2  HTTPClient抓取 PM2.5資訊  
8-3  JSON資料解析
 
Chapter 9 雲端資料庫  
9-1  ThingSpeak雲端圖表
9-2  ESP32自動更新圖表

Chapter 10 LINE通知:倉庫溫度異常機器人
10-1 開啟 LINE Notify服務
10-2 倉庫異常通知機器人  

Chapter 11 Google Sheet資料庫
11-1 IFTTT
11-2 ESP32傳送到 Google Sheet

Chapter 12 網站伺服器
12-1 網站伺服器
12-2 繼電器

Chapter 13 BEACON與室內定位
13-1 ESP32 BLE掃描
13-2 Beacon點名系統

Chapter 14 MQTT互動
14-1 MQTT協定
14-2 MQTT遠端飼料機

Chapter 15雙核心執行
15-1 多核心概念
15-2 雙核心執行

EChapter 16 SP32CAM影像串流
16-1 CameraWebServer視訊串流
16-2 臉部辨識

Chapter 17 ESP32CAM應用
17-1 人體感測拍照存檔
17-2 使用 Line傳遞照片
17-3 MQTT直播


書籍快照






文章標籤

夜市 小霸王 發表在 痞客邦 留言(1) 人氣()

我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


最近開發專案時,需要取得裝置的唯一編號,用來區別是資料是從哪裡送出來的

Arduino範例有一個CPUID,但是取得資料內容是u_int64_t格式,很難處理,我當然還是希望能用字串格式,網路又找到一個範例是WiFiMacID,發現這個所抓取的值是CPUID的前後相反而已,所以其實可以直接使用WIFIMAC來作為設備的專屬ID,語法如下


#include <WiFi.h>
void setup() {
  Serial.begin(115200);
}

void loop() {
  String wifiMacString = WiFi.macAddress();
  Serial.print("WiFi Mac ID: "); Serial.println(wifiMacString);
  delay(3000);
}


 


夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


今天(2021/05/15)一大早就聽到老婆在鬼叫鬼叫,原來是確疹人數竟然有180,實在太令人害怕了,不過記者會現場介紹了一個APP「台灣社交距離APP」,說可以紀錄「人與人的連接」,我仔細看了一下這個APP的介紹,發現這個構想我以前也想過,但是沒空動手做,反正做了也沒人理我,不過這個原理就是我一直在研究的BLE Beacon,我認為這個APP應該就是利用手機同時模擬Beacon Central(中央)及Peripheral(週邊),也就是手機會廣播自己的藍芽裝置,並同時掃描附近的藍芽裝置,利用RSSI與TX來計算大概距離,這個機制我經常在使用,有些人會害怕個資外洩,但我覺得不會,主要是因為紀錄的是「去識別化」的代號,另外也去中心化,沒有中央伺服器,所以也不會因為使用者太多而導致當機之類。

關於Beacon原理可以參閱筆者的以前的文章:ESP32 Arduino Beacon簡易Bluetooth室內定位

為了驗證APP是採用Beacon廣播模式,我利用老婆與妮妮的手機進行測試,當安裝好APP後,開啟藍芽我就可以馬上偵測到一個新的Beacon裝置,開啟該裝置後,查看基本資訊如下圖

Screenshot_20210515-191615

 

檢查多隻手機後確認,「台灣社交距離APP」使用的UUID應該是「0000fd6f-0000-1000-8000-00805f9b34fb」,沒有Name,而且發現Mac Address會一直變,以往如果我要用Beacon偵測使用者是誰的時候用的就是Mac Address(可以參閱:我那狗子在家嗎?),不過這次APP每次開關藍芽都會變更Mac,我想應該是為了保護使用者不會被我們這種每天想圖謀不軌的人監測能夠想到這個問題要幫開發者按個讚

也因為這樣,我們就沒辦法利用這個APP辨識個人嘍,不過呢?我們還是可以算現場人數,計算人數的程式可以寫在ESP32中,不過總不能透過Serial來查看人數吧。我們總是需要一個圖表可以呈現給管理者查看,可以使用的方案有兩個:

1.Nodered+MQTT:這個我還沒製作教學,目前只有PPT講義:https://t.ly/LLH9

2.ThingSpeak:可以參考ThingSpeak教學:ESP32 資料庫存取ThingSpeak圖表製作

由於第1個方法較為複雜,一天寫不完,所以這個範例就利用ESP32及ThingSpeak來計算人數,並且當使用者人數超過範圍時發出Line通知。


一、開發平台

關於ESP32開發平台可以參考本篇:ESP32 Arduino開發環境架設(取代Arduino UNO及ESP8266首選)

假設讀者們已經完成Arduino ESP32的開發平台設定,這裡要注意的是ESP32核心目前最新版是1.0.6,而我比較習慣的是1.0.4,這兩個版本在Beacon Scan的差異是1.0.6會重複掃描同一個裝置,而1.0.4則是同一個裝置只會紀錄一次,使用1.0.4的好處是我們就不用自己篩選,但是我覺得像1.0.6這樣重複掃描應該是ESP32核心未來的常態,所以這次我就使用1.0.6的重複掃描的方式來修改程式。

二、程式撰寫

本次我使用的是AI-Thinker的NodeMCU ESP32,對於本次任務還是很容易的,小事情還用不到RPi出馬。程式流程如下

Image1.png

讀者在上述的圖中可以發現,「掃描到藍芽裝置」是一個很重要的程序,而在ESP32中是以MyAdvertisedDeviceCallbacks來實做,因此我們必須在該程序中完成所有的判斷,然後在一次掃描結束後,就可以計算人數並上傳網站,然後再下一輪的掃描。

原始程式請參考Github:https://github.com/youjunjer/ESP32SocialDisCount

文章標籤

夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


使用者若需使用背面的I2C LCD腳位,請參閱下面說明

PXL_20210513_153317940

背面的I2C為附加的PCF85741 I2C晶片,因此使用的腳位是26,27而非21,22,程式請參閱下方說明


#include <Wire.h> 
#include <LiquidCrystal_I2C.h> //請安裝LiquidCrystal_I2C(Frank)

LiquidCrystal_I2C lcd(0x27,16,2);//每個LCD位址可能不同,請先用I2C掃描
void setup(){
  Wire.begin (26, 27);//使用Matrix外加PCF85741 I2C晶片
  lcd.init();//初始化
  lcd.backlight();//開啟背光
  lcd.setCursor(3,0);//移動游標到第0行第3個字
  lcd.print("Hello, world!");//印出文字
  lcd.setCursor(2,1);//移動游標到第1行第2個字
  lcd.print("Ywrobot Arduino!");//印出文字
}

void loop(){

}


 

夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


今天順豐小哥送來一個奇怪的包裹,之所以奇怪是因為我大部分左岸的商品都是透過一路發,怎麼會有順豐直發給我的呢?我領了以後就關門上樓想馬上查看一下,沒想到小哥卻又一直按門鈴,是還有其他包裹沒領嗎?

一開門小哥就說要收140元運費,原來對方竟然沒付運費。

打開包裹一看,一顆沒看過得晶片,竟然是安信可送來的第一手產品訊息「ESP32-C3F2M」

首先我們來看看正面有什麼,採用CH340接口,PCB板載天線,內建PowerLed及一顆RGB LED燈

PXL_20210512_064055638

背面則是標注腳位,這裡可以發現腳位大概有15根可用,當然啦,有些ADC、DAC、SPI、I2C、I2S、UART這些是一定有的

PXL_20210512_072623237

讀者會在意的是WiFi、BLE都在嗎?沒錯喔WiFi、BLE都在,而且BLE還升級到BLE5了

讀者需要詳細規格書的話,可以參考安信可原廠網站

C3F規格表:https://docs.ai-thinker.com/_media/esp32/docs/esp32-c3f_specification.pdf

C3S規格表:https://docs.ai-thinker.com/_media/esp32/docs/esp32-c3s_specification.pdf

C3U規格表:https://docs.ai-thinker.com/_media/esp32/docs/esp32-c3u_specification.pdf

各種ESP32比較表,可以參考這張圖:https://www.cnx-software.com/wp-content/uploads/2021/04/ESP32-C3-ESP8266-modules.jpg

另外一個讀者會在意的則是拿掉一顆核心,剩下160MHz的單核心,記憶體也只剩下2M,腳位又變少了,那一定得便宜吧,這大家不用擔心,價格肯定漂亮,小弟獲得的代理價是16 rmb,對的,你沒聽錯是16,以今天匯率換算大約在70台幣,加上運費、關稅、營業稅金、保固服務等費用,我想屆時台灣賣家會落在120~150左右,也就是說,最低120元就可以拿到具有WiFi、BLE的Arduino了喔


二、Arduino開發環境安裝

由於C3F是最新的產品,目前Arduino的ESP32 1.0.6核心並未支援,因此必須安裝2.0.0 Alpha1版本,請將檔案/偏好設定/額外開發板管理員改為以下網址

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json

image

文章標籤

夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


ESP32的類比輸出較為麻煩,採用的是ledcWrite指令,一般來說沒特別需要直接使用ESP32Servo即可。以下是採用ledcWrite的SG90指令。

一、設定頻道
ledcSetup(7, 50, 8);
ESP32一共有16個類比輸出頻道(0~15),我們在這裡使用頻道7,而50則是50 Hz輸出頻率也就是1秒/50=20ms寬度,8則是解析度,代表2的8次方=256。

二、附加頻道到腳位
ledcAttachPin(2, 7); 
將上述設定好的頻道7附加在GPIO 2腳位,而GPIO 2則是我們連接SG90的腳位,也就是代表後續我們只需要指定頻道7的輸出數值,就是輸出在GPIO 2上。

三、寫入數值
ledcWrite(7, 18.56);
在頻道7輸出18.56的脈衝,代表將SG90轉到90度的位置,至於18.56代表90度是如何算出的呢?
首先頻道設定為50Hz,也就是1秒/50=20ms週期,20ms週期又被分為2的8次方=256個等級,因此一個PWM單位是20/256。
另一方面SG90的脈衝為500us~2400us,也就是0.5ms~2.4ms,因此換算為PWM範圍就是0.5/(20/256)~2.4/(20/256)=6.4~30.72之間,而6.4及30.72就分別代表0及180度了,因此90度就是(6.4+30.72)/2=18.56。

以下則為SG90從0~180度的測試程式
int value=map(angle,0,180,6.4,30.72);
map是一個很方便的取比例函數,參數分別是   轉換後數值=map(數值,數值最小值,數值最大值,轉換最小時,轉換最大值)
例如90度的計算方式:map(90,0,180,6.4,30.72)得到18.56,就是ledcWrite要寫入的數值了

image


void setup()

文章標籤

夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


最近要搞BLE WiFi Gateway,想說搞一個流行的RPi來玩,不過我是Windows使用者,對於Linux系統不熟,所以每次安裝系統都很累,查詢資料,測試,安裝然後做筆記,做錯又要重來。

一開始朋友送我一個Zero W,覺得很輕巧,所以拿來玩看看,可是光是安裝系統速度就讓我頭很痛,後來拿到一片RPi,果然速度快很多,Zero W雖然已經有WiFi BLE了,但是沒辦法跑我最熟悉的VSCode。

那麼分享的RPi(For RPi 3 only)有哪些內容呢?

  1. Update to date(20210506)
  2. 設定好遠端桌面VNC、SSH
  3. 開啟並加大交換記憶體=2048
  4. 安裝Jupyter-notebook,並設定可遠端登入
  5. 安裝OpenCV
  6. 安裝VSCode
  7. 安裝最流行的Node-red

其實老實說,對RPi熟悉的朋友可能會覺這不是很基礎的東西,打打命令而已,但是如果對於RPi新手,或者你趕時間不想搞,嫌麻煩,可以下載我的img檔,直接用Win32DiskImager寫入即可,安裝好直接開桌面的VSCode就可以開寫了。

當然您也可以參考我自己做的筆記,大概會花半天的時間。

系統帳號:pi
密碼:Abc123(系統內只要有密碼的,都是Abc123,A是大寫,如果要用,請記得自行修改密碼)

壓縮img檔案下載:https://t.ly/aJVj

雖然檔案有7G大小,但是我覺得下載所花的時間肯定比你自己做系統來的快

當然您也可以參考我下面的筆記自己操作看看

樹莓派Python環境建構:https://t.ly/9uM8

這裡要推薦一個東西:假HDMI,為什麼需要這個東西,因為如果RPi沒配螢幕,這時你用VNC連進去,就會發現畫面超級小的,裝了這個就可以騙過RPi我們有給他螢幕,讓他能保持較高的解析度。

hdmi假負載- 優惠推薦- 2021年5月| 蝦皮購物台灣

PS:小弟是RPi初學者,如果有什麼不足,請再告知


文章標籤

夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


經常有朋友跟我抱怨ESP32的WiFi效果不好,經常斷線之類,雖然WiFi已經是IoT的主流了,但是如果有一些服務希望能更加穩定,那還是得回到有線網路。

應廠商的需求開始尋找帶RJ45網路口的,價格也希望不要太貴

找到這款:WT32-ETH01,內建乙太網路接口(露天拍賣:https://www.ruten.com.tw/item/show?22118190035901

104093196-a9f3e100-5291-11eb-9bde-dd20aa31352c

 

核心是ESP32,除了乙太網路之外,WiFi、BLE還是有內建,Arduino的開發環境請參考:https://youyouyou.pixnet.net/blog/post/119410732

不過程式上傳到是有點麻煩,由於沒有usb接口,所以需要usbttl線上傳,且這款沒有一鍵上傳,也沒有RTS按鈕,所以上傳程式比ESP32CAM還複雜,ESP32CAM至少還有RTS按鈕

先將CP2102接上,可參考下圖

IO0+GND(藍色)是模式切換用

EN+GND(棕色)是當作RTS用

image

程式上傳時,請依照以下步驟

  1. IO0+GND(上圖藍色)對接
  2. 將EN+GND(上圖棕色)對接,然後斷開(重開機)
  3. 檢查序列視窗:Waiting for download
  4. 按Arduino上傳按鈕
  5. 等候程式上傳完畢後
  6. 將IO0+GND(上圖藍色)斷開
  7. 將EN+GND(上圖棕色)對接,然後斷開(重開機)

程式部份的差異則是在於宣告乙太網路,並啟動連線,一旦連線成功,就與原本的WiFi無差別,例如HttpClient、WiFiClient等等的,宣告部份主要是腳位設定

#define ETH_ADDR        1
#define ETH_POWER_PIN  16
#define ETH_MDC_PIN    23
#define ETH_MDIO_PIN   18
#define ETH_TYPE       ETH_PHY_LAN8720

文章標籤

夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


最近經常要教學如何用ESP32CAM的影像做AI辨識,之前用web的mjpeg串流感覺速度很慢,比較過後改用rtsp串流似乎較為穩定

以下為使用Python讀取ESP32CAM的rtsp串流,感覺效能不錯


from cv2 import cv2
vcap  = cv2.VideoCapture('rtsp://192.168.1.103/mjpeg/1')
while(1): 
    try:
        ret, frame = vcap.read()
        sframe=cv2.resize(frame,(800,600))
        cv2.imshow('VIDEO', sframe)
        #cv2.resizeWindow('VIDEO',800,600)
    except Exception as e:
        print("Error:" + str(e))
        vcap  = cv2.VideoCapture('rtsp://192.168.1.103/mjpeg/1')
        continue
    k=cv2.waitKey(1)
    # 按a拍照存檔
    if k & 0xFF == ord('a'):
        cv2.imwrite('test.jpg', frame)        
    # 按q離開
    if k & 0xFF == ord('q'):
        break
cv2.destroyAllWindows()

文章標籤

夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


依據本文:https://youyouyou.pixnet.net/blog/post/119383183,Arduino內的範例可以轉水平翻轉,也可以垂直翻轉,但就是沒有90度翻轉

如果要90度翻轉,有三個方法,第一個就是直接採購翻轉好的鏡頭,ov系列都是可以訂製翻轉角度、廣角、焦距等,跟賣家講好即可。

第二個是在ESP32送出影像前翻轉,這部份嘗試過,發現效率會降低

第三個方式就是收到影像的人自己想辦法轉,舉例來說,你用Python收的,那你在Python內用

#水平垂直鏡像翻轉:filp(影像,參數) 參數,1:Y軸翻,0:x軸翻,-1:XY軸
newimg = cv2.flip(img,1)

#90度翻轉:transpose(影像)
newimg = cv2.transpose(img)

如果你是JS收影像,那你在JS內自己寫程式翻,因為本人對JS不熟,剛好有位老友分享一篇文章,提供這個功能,分享一下

網址:https://github.com/easytarget/esp32-cam-webserver

下面這張是朋友測試的照片,可以發現功能多了一個Rotate in Browser,也代表說影像確實是在瀏覽器翻轉的沒錯,畢竟PC或手機運算速度都比ESP32快多了。

image

 

 

 


夜市 小霸王 發表在 痞客邦 留言(2) 人氣()

我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


JTAG全名為Joint Test Action Group,是一種國際標準測試協議(相容IEEE 1149.1),用於驗證設計與測試生產出的印刷電路板功能,而本章所介紹的ESP-PROG支援JTAG可以對ESP32/ESP8266系列產品進行除錯,ESP-PROG外觀如下圖(a),本次我們將會使用的是右下角的JTAG區,其腳位定義則如下圖(b)。

image

(a) ESP-PROG模組外觀

image

(b) ESP-PROG JTAG PIN腳位定義

首先我們先將ESP-PROG用USB與電腦連接,並開啟電腦的裝置管理員(本機/右鍵/管理/裝置管理員),由於沒有安裝驅動程式,此時會裝置管理員應該會顯示有兩組其他裝置,一般是Dual RS232-HS及USB Serial Port,不過實際名稱可能會因為電腦版本不同而異。
image

接下來我們透過Zadig工具來安裝正確的驅動程式,先到Zadig的首頁https://zadig.akeo.ie/,並在下方的Download處點選Zadig 2.5下載後直接開啟。
image

Zadig開啟後,在上面的Option處點選「List All Devices」,將電腦中所有的USB裝置都顯示在下方的列表中。
image

接著在下方的裝置列表找到我們需要更新的驅動的裝置「Dual RS232-HS (Interface 0)」,請讀者注意這裡列表會有兩組USB裝置名稱都是「Dual RS232-HS」,請務必要挑選(Interface 0)這組。
image

確定挑選的是「Dual RS232-HS (Interface 0)」後,點選下方的Replace Driver按鈕,並稍後一陣子就會完成更新。
image

 

此時再開啟裝置管理員就可以看到安裝正確時的狀態(如下圖),一組為「Dual RS232-HS」,另外一組為「USB Serial Port (COM XX)」,就代表驅動程式安裝正確。
image

夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


對於以往有寫過其他類型程式的人來說,Arduino IDE其實並非是完整的開發工具,以筆者常在使用的微軟.net系列開發工具「Visual Studio」來說,先不論專案管理、資源管理等大型專案需要用到的工具,還有設計階段需要用到的程式碼自動提示(autocompletion)之外,就先以程式執行過程所需的除錯(Debug)工具來說則是完全缺乏,對於程式設計師最需要用到的除錯工具包括中斷點(Breakpoint)、步進執行(Step Into)、變數監看(Watcher)等三大工具,這三大工具可以讓設計師完全掌握程式走向,「中斷點」可以在重要的地方暫停,然後用「步進執行」一步一步查看程式的動態,最後「變數監看」則可以知道數值目前狀態,了解變數變化的過程,因為缺少這些除錯工具,導致Arduino撰寫大型程式時非常艱難,大部分都是透過Serial拋出訊息來查看程式執行狀態,而程式中過多的Serial print導致結構過於混亂,也會影響程式執行效能。

image

不過其實這是可以解決的,Arduino架構也是可以像其他開發環境一樣,有程式碼自動提示、中斷點、步進執行、變數監看這些工具的,只是還需要兩項工具的支援,一個是改用有支援除錯的開發工具VSCode及PlatformIO,另外就是需要一組能支援JTAG除錯的工具ESP-PROG模組,其架構如下圖,本章將介紹如何建立具有除錯功能的Arduino開發環境。

image

如前面所述,Arduino IDE缺少了許多工具,因此本節我們先介紹如何安裝VSCode及PlatformIO開發工具,讀者會覺得比較奇怪的是,當本書說開發工具是VSCode及PlatformIO時,那到底是指VSCode?還是用PlatformIO呢?

應該這樣說比較精確:「是用VSCode底下的一個延伸模組名稱是PlatformIO來開發Arduino的應用」,有點像是Chrome瀏覽器底下可以安裝很多小工具,而PlatformIO就是VSCode底下的工具,所以我們先來簡介VSCode及他的安裝過程。


一、VSCode安裝

VSCode是微軟提供的開發工具,屬於.net系列開發工具Visual Studio .net(簡稱為VS.net)的簡易版,兩者最大的差異在於VS.net只支援微軟自己的開發語言例如C#、VB、ASP等,而VSCode則可以透過外掛模組來編輯多種程式語言,由於VSCode的穩定性及擴充性受到非常多開發者的愛用,本節我們會先安裝VSCode後,再安裝PlatformIO延伸模組。

安裝VSCode非常簡單,先到微軟的網站直接下載安裝檔。

VSCode下載網址:https://code.visualstudio.com/download
image

然後依照讀者使用的作業系統下載符合的安裝檔,如果讀者也是Windows的話,可以跟筆者一樣點選上圖紅圈部份:System Installer 64 bit。下載後,依照下面的步驟完成安裝。

1.確認同意授權條款
image

2.安裝選項:勾選「建立桌面圖示」及「加入PATH中」兩個選項即可
image

3.點選安裝按鈕,進入程式安裝過程

image

文章標籤

夜市 小霸王 發表在 痞客邦 留言(2) 人氣()

本篇是完全複製作者漢亞科技,原始連結:https://han-ya.blogspot.com/2021/02/ld3320-esp32.html

實驗說明

        使用離線語音辨識晶片 LD3320,獲得辨識結果後透過 ESP32S 無線模組傳輸到另一塊無線模組上顯示出結果,如下圖一所示。
 

無線模組 ESP32

        無線模組 ESP 系列是上海樂鑫所開發,經由安信可二次開發後推廣,模組提供 AT command (UART) 的方式進行控制,但這種方式使用起來總是覺得隔了一層紗,有層距離感,操控上反應或速度不夠即時。幸運的是,隨著這塊模組的生態系越來越成熟,使用者也越多了,ESP 模組已經能像 Arduino 一樣,可以在 Arduino IDE 環境下開發編譯並下載,同時不少開發者也分享各類無線模組的案例,方便我們拿來參考 [1][2]。
        研究過程中,發現 ESP32S 上面的 FLASH 所屬的接腳不能直接拿來當作 GPIO 使用,因為這樣會影響到 IDE 燒錄,FLASH D0-D3 + CMD + SCK 正好對應到 GPIO 6-11,電路規劃時得避開使用這幾根 I/O。另外,這塊 ESP32S 模組有提供 3.3V 和 5V 輸出,正好 LCD_I2C 模組需要吃 5V 電壓,而語音辨識晶片吃 3.3V 電壓,能同時滿足開發的需求。
圖一:以無線傳輸語音辨識的結果

 

        ESP32S 是同時具有 WiFi 和藍芽功能的模組,實驗中,我們使用模組的藍芽傳輸功能,並參考範例中的 BluetoothSerial 程式,通訊的一端代碼是 Bluetooth Master,另一端為 Bluetooth Slave,下圖二是兩邊代碼的說明。將 Slave 端設定藍芽名稱 (ESP32-ASR) 後,等待 Master 來連接,在 Master 端則對名稱 (ESP32-ASR) 發出連線請求,接著雙方就會自動連接成功。
 
圖二:藍芽通訊雙方的原始碼

 

離線語音辨識

        LD3320 是十年前的語音辨識晶片 [3],主要辨識中文,已不是新鮮貨。它不需要連上雲端,只要設定好辨識的字句儲存到晶片的暫存器內,它就能進行離線辨識。優點是辨識過程很快,而且是不特定人的辨識方式,對於設定後的字句,其辨識準確率算不錯的 (在無噪音干擾環境下)。然而,其缺點是針對不特定語句的辨識,如果講了一段不是一開始設定給晶片的字句,晶片辨識後,通常會給出不正確的結果。比如,我們設定給晶片的字句是 "打開" "關閉"...之類,但是我們講了一句 "你好" 這類無關的字句,它可能會給出 "打開" 的結果,這可能會造成嚴重的操作。當然,現在已經有不少雲端的語音辨識服務,也許借助大公司的服務是更好的選擇。
        開發 LD3320 時,我們要把欲辨識的中文語句建立成表,再寫入晶片內,如下圖所示。C++ 語法的編譯過程不可能接受中文字,所以程式碼的中文語句是以漢語拼音為基準,每個語句則對應一個 ID 編號,晶片將辨識出的結果以編號方式告知我們,例如:"二十五" 和 "二五" 都代表數值 25,那我們就會將這兩個語句定義同一個 ID 編號。
圖三:建立辨識的語句表

 

        將 LD3320 驅動程式寫在 ESP32S 模組上,測試的結果錄製成底下影片,請參考。說完一句話後,辨識的結果很快地顯示在 LCD 模組上。
 


文章標籤

夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


資料來源:https://www.fernandok.com/2018/08/esp32-voce-sabe-o-que-e-dac.html(本文只是翻譯該文)

ESP32:您知道什麼是DAC嗎?

今天,我們將討論兩個主題。第一個是DAC,來自英文數模轉換器,將其翻譯成葡萄牙語將是模擬數字轉換器我認為這非常重要,例如,通過它在ESP32上進行音頻輸出。今天我們要處理的第二個問題是示波器然後,我們將在ESP32上編譯基本的DAC代碼,並通過示波器將此類微控制器生成的波形模擬信號可視化。

今天的設置非常簡單,以至於我什至沒有錄製演示,因為這可能就是我在這裡留下的印象。基本上,我們有一個ESP32,它可以通過程序生成各種類型的波形。
我們使用GPIO25作為輸出,並使用GND作為參考。

使用的針腳

在此示例中,我們將使用 與DAC_1對應的GPIO 25
可以使用的另一個是與DAC_2對應的GPIO 26
 

代碼ESP32-波矩陣

我們有一個源代碼,它將生成四種類型的波形。
首先,我們建立一個二維矩陣。

 

夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


~注意使用OV5640會產生高熱,請注意散熱處理,本人不新手推薦使用OV5640~

ESP32CAM雖然最高能支援OV2460的兩百萬畫素鏡頭,但是感覺畫質不是很好,無法滿足朋友想要製作一些品質檢測的應用,去年有嘗試安裝OV5640,卻發現無法支援,所以作罷。

後來在網路上發現有人安裝OV5640測試成功,就Google一篇文章說ESP32CAM可以支援OV5640:Framerates on ov5640 camera using 1.05rc1,這篇的大意是說安裝上OV5640後,要如何提昇FPS,其中下面那張表引起我的興趣,看起來是可以支援OV5640的,只是FPS會下降到4.5。

image

於是我馬上到賣場買一個OV5640 AF自動對焦來測試看看,結果還真的可以支援,以下就簡單說明要如何安裝OV5640鏡頭,以及比較OV2640在畫質上的差異。

image


一、安裝測試(RC)版Arduino ESP32相容性套件

開啟Arduino IDE後,功能表/檔案/偏好設定,在額外開發板管理員位置,貼上下面這個網址(取代掉原來的ESP32網址)

網址:https://github.com/espressif/arduino-esp32/releases/download/1.0.5-rc6/package_esp32_dev_index.json

(20210416更新:最新板相容套件為1.0.6即可直接支援,不需要再使用上述的網址)

(本RC板會影響到Serial2,一般使用者不會用到這個,如果你知道Serial2,先告訴你這個功能會在105RC版失效)

image

接著進入功能表/工具/開發板管理員,關鍵字處輸入ESP32後,此時最新版本就是1.0.5-rc6,點選安裝此版本

image

最後選擇ESP32 Wrover開發板,並修改Partition Scheme為Huge APP(主要是等等範例程式較大,需要用到3M空間)

image


二、修改範例程式

完成步驟一之後,ESP32就可以支援最高500萬畫素解析度的鏡頭,此時我們開啟範例程式,檔案/範例/ESP32/Camera/CameraWebServer

文章標籤

夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


我家那狗子在家嗎?不知道有沒有趁我加班溜出去鬼混?

我想每一個人都會想知道另外一半有沒有乖乖在家,除了打電話查勤、請鄰居(閨蜜!)看管,或者安裝監視器隨時遠端查看之外,還有另外一個選擇,就是藍芽掃描,不過這得他有戴著狗環,歐不,是手環才行。

現在的手環為了能時時與手機連線或者其他(機密)功能都會做藍芽Beacon廣播,那麼我們就可以利用這個特性,偷偷在背後收集藍芽廣播,如果找不到他的手環廣播,就可以確定他不在家了,至於出去鬼混,還是只是去巷口711買杯咖啡這就是你們之間的問題,科技只能解決問題,你才是那個能解決有問題的人。

本篇我們透過ESP32做BLE掃描,如果掃描到你家狗子的手環,且RSSI超過-80的話,就判定為在家,否則就判定不在家,然後再將訊號傳送到ThingSpeak製作成圖表,這樣你就可以監視這狗子的行蹤了。

beacon

1.當然你必須先取得你家狗子手環的Mac address

手機APP安裝一下Lightblue就可以掃描,他的畫面如下,紅色圈圈就是我的手環,下方的「E0:E2:0A:25:FE:2F」就是我的Mac address,不過到時候要用小寫喔「e0:e2:0a:25:fe:2f」

image

2.到ThingSpeak開啟一個channel來收資料,這部份請參閱:第十四篇 ESP32 資料庫存取ThingSpeak圖表製作

3.將程式燒錄到ESP32中,並修改相關設定即可。程式在最下方

4.這時你就可以查看你家狗子是不是在家了。

image

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>
#include <WiFi.h>
#include <HTTPClient.h>
char ssid[] = "SSID"; //無線網路SSID
char password[] = "PASSWORD"; //無線網路密碼
String url = "http://api.thingspeak.com/update?api_key=你的ThingSpeak Key";
String Myaddress = "Beacon Address"; //Beacon或手錶MAC address: xx:xx:xx:xx (小寫字母)
int RSSIThreshold =-80;//以RSSI強度做簡易測距
int scanTime = 20; //設定20秒掃描一次

BLEScan* pBLEScan;
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
    void onResult(BLEAdvertisedDevice advertisedDevice) {
      //列出Beacon所有資訊
      //Serial.printf("Advertised Device: %s \n", advertisedDevice.toString().c_str());
      //取得address
      String BeaconAddress = advertisedDevice.getAddress().toString().c_str();
      Serial.print("Address:");Serial.print(BeaconAddress);
      //取得RSSI
      int BeaconRSSI = advertisedDevice.getRSSI();
      Serial.print(",RSSI:");Serial.println(BeaconRSSI);

      if (BeaconAddress == Myaddress) {
        if ( BeaconRSSI >= RSSIThreshold) {
          Serial.println("在家");
          HTTPClient http;
          String url1 = url + "&field1=1";
          //http client取得網頁內容
          http.begin(url1);
          int httpCode = http.GET();
          if (httpCode == HTTP_CODE_OK)      {
            //讀取網頁內容到payload
            String payload = http.getString();
            //將內容顯示出來
            Serial.print("網頁內容=");
            Serial.println(payload);
          } else {
            //讀取失敗
            Serial.println("網路傳送失敗");
          }
          http.end();
        }
        else {
          Serial.println("不在家");
          HTTPClient http;
          String url1 = url + "&field1=0";
          //http client取得網頁內容
          http.begin(url1);
          int httpCode = http.GET();
          if (httpCode == HTTP_CODE_OK)      {
            //讀取網頁內容到payload
            String payload = http.getString();
            //將內容顯示出來
            Serial.print("網頁內容=");
            Serial.println(payload);
          } else {
            //讀取失敗
            Serial.println("網路傳送失敗");
          }
        }
      }
    }
};

void setup() {
  Serial.begin(115200);
  Serial.println("開始連線WiFi網路");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(1000);
  }
  Serial.println("WiFi連線完成");
  //設定BLE掃描
  BLEDevice::init("");
  pBLEScan = BLEDevice::getScan(); //create new scan
  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
  pBLEScan->setInterval(100);
  pBLEScan->setWindow(99);  // less or equal setInterval value
}

void loop() {
  Serial.print("BLE掃描開始....");
  BLEScanResults foundDevices = pBLEScan->start(scanTime, false);
  Serial.print("一共找到裝置: ");
  Serial.println(foundDevices.getCount());
  pBLEScan->clearResults();   // delete results fromBLEScan buffer to release memory
  delay(100);
}





文章標籤

夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


ESP32還能做什麼呢?

這次來讀取智慧手錶內的訊息,並送到後端資料庫呈現,未來希望能用在幼兒院、銀髮院,能了解學員的運動狀況。

可以讀取到的資訊包括:心跳、體溫、運動量、步行、跑步、睡眠,並利用beacon協定計算最新位置,目前也還在研究跌倒偵測等資訊。

這些技術文件後續都會「免費」公開給大家使用,有需要的可以與我聯繫

以下內容都是模擬的喔

1609907564302
中心管理中心資訊列表

1609907567043
須注意人員

 

1609907568356
即時位置

ESP32讀取方式,先用BLE掃描,取得資訊,並依據手錶格式進行解碼,完成後,將資訊以WifiClient上傳至DB
手錶都是採用GATT模式,ESP32很快就能取得資訊,解碼方式則需要參考不同手錶的技術文件了

Screenshot_20210112-112141

image

PXL_20210112_053815153


文章標籤

夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


最近執行某專案,由於裝置沒有地方可以接線,所以只能改用電池方案,有找過18650方案,但是體積太大了,我們專案必須小於10cm大小,後來找到Lolin32+鋰聚合物103450 這個方案。

價格
1.LolinESP32大約:215
2.鋰聚合2000mAh:300

優點:說實在還滿方便的,插上USB除了可以讓ESP32運作之外,也可以直接充電,充電時會亮CHS燈號,燈號熄滅就是充好電,但是缺點是沒有電量指示,也不知道還有多少電。我用BLE廣播做電池測試,目前測試24hr都還正常,多放個幾天看看,到時候再回報。

缺點:沒有電量指示燈


文章標籤

夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


以前都說在玩ESP32的藍芽,其實都是BT Serial 屬於BT2.0,最近有一個新案子,要改用BLE,網路找到資源,測試正常可用,可以用手機不用配對直接連線,然後收資料送資料都OK。

手機收送資料,請用Lightblue APP(https://play.google.com/store/apps/details?id=com.punchthrough.lightblueexplorer&hl=zh_TW&gl=US)

先紀錄一下,晚點再補教學

image

image

 

//https://www.instructables.com/ESP32-Bluetooth-Low-Energy/
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>

BLECharacteristic *characteristicTX; //através desse objeto iremos enviar dados para o client

//objeto responsável pela comunicação com o sensor de temperatura infravermelho

bool deviceConnected = false; //controle de dispositivo conectado

const int LED = 2; //LED interno do ESP32 (esse pino pode variar de placa para placa) // Could be different depending on the dev board. I used the DOIT ESP32 dev board.
const int BUZZER = 23; //pino d BUZZER

// See the following for generating UUIDs:
// https://www.uuidgenerator.net/

#define SERVICE_UUID           "ab0828b1-198e-4351-b779-901fa0e0371e" // UART service UUID
#define CHARACTERISTIC_UUID_RX "4ac8a682-9736-4e5d-932b-e9b31405049c"
#define CHARACTERISTIC_UUID_TX "0972EF8C-7613-4075-AD52-756F33D4DA91"


//callback para receber os eventos de conexão de dispositivos
class ServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      deviceConnected = true;
    };

    void onDisconnect(BLEServer* pServer) {
      deviceConnected = false;
    }
};

//callback  para envendos das características
class CharacteristicCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *characteristic) {
      //retorna ponteiro para o registrador contendo o valor atual da caracteristica
      std::string rxValue = characteristic->getValue(); 
      //verifica se existe dados (tamanho maior que zero)
      if (rxValue.length() > 0) {
        Serial.println("*********");
        Serial.print("Received Value: ");

        for (int i = 0; i < rxValue.length(); i++) {
          Serial.print(rxValue[i]);
        }

        Serial.println();

        // Do stuff based on the command received
        if (rxValue.find("L1") != -1) { 
          Serial.print("Turning LED ON!");
          digitalWrite(LED, HIGH);
        }
        else if (rxValue.find("L0") != -1) {
          Serial.print("Turning LED OFF!");
          digitalWrite(LED, LOW);
        }
        // Do stuff based on the command received from the app
        else if (rxValue.find("B1") != -1) { 
          Serial.print("Turning Buzzer ON!");
          digitalWrite(BUZZER, HIGH);
        }
        else if (rxValue.find("B0") != -1) {
          Serial.print("Turning Buzzer OFF!");
          digitalWrite(BUZZER, LOW);
        }

        Serial.println();
        Serial.println("*********");
      }
    }
};

void setup() {
  Serial.begin(115200);

  pinMode(LED, OUTPUT);
  pinMode(BUZZER, OUTPUT);

  // Create the BLE Device
  BLEDevice::init("ESP32-BLE"); // nome do dispositivo bluetooth
  // Create the BLE Server
  BLEServer *server = BLEDevice::createServer(); //cria um BLE server 
  server->setCallbacks(new ServerCallbacks()); //seta o callback do server
  // Create the BLE Service
  BLEService *service = server->createService(SERVICE_UUID);
  // Create a BLE Characteristic para envio de dados
  characteristicTX = service->createCharacteristic(
                      CHARACTERISTIC_UUID_TX,
                      BLECharacteristic::PROPERTY_NOTIFY
                    );
                      
  characteristicTX->addDescriptor(new BLE2902());

  // Create a BLE Characteristic para recebimento de dados
  BLECharacteristic *characteristic = service->createCharacteristic(
                                         CHARACTERISTIC_UUID_RX,
                                         BLECharacteristic::PROPERTY_WRITE
                                       );

  characteristic->setCallbacks(new CharacteristicCallbacks());
  // Start the service
  service->start();
  // Start advertising (descoberta do ESP32)
  server->getAdvertising()->start();
  Serial.println("Waiting a client connection to notify...");

}

void loop() {
     //se existe algum dispositivo conectado
    if (deviceConnected) {
      //chamamos o método "read" do sensor para realizar a leitura da temperatura
      //read retornará 1 caso consiga realizar a leitura, ou 0 caso contrário 
      if (1)
      {         
          char txString[8]="555"; // make sure this is big enuffz         
          characteristicTX->setValue(txString); //seta o valor que a caracteristica notificará (enviar)       
          characteristicTX->notify(); // Envia o valor para o smartphone
          Serial.print("*** Sent Value: ");
          Serial.print(txString);
          Serial.println(" ***");
      }
  
/*
    delay(1000);



    characteristicTX2->setValue("Hello!"); // Sending a test message
    characteristicTX2->notify(); // Send the value to the app!*/

  }
  delay(1000);

}

資料來源:https://www.instructables.com/ESP32-Bluetooth-Low-Energy/


文章標籤

夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


這篇沒什麼,只是把上一篇的TFT及之前的CameraWebServer傳輸連起來而已,程式太長,直接下載附件吧:http://t.ly/cyeH

1.請先設定你的ESP32CAM開發環境:https://youyouyou.pixnet.net/blog/post/119383183

2.請先完成TFT連線及測試:https://youyouyou.pixnet.net/blog/post/120886475

然後,我只是把1.複製到2.而已,還沒再優化,目前發現的問題有兩個

1.畫質不能調整維持240*320,這個可以理解,應該是取一個畫面給CameraWebServer及TFT端共用。我有嘗試調整,結果就導致TFT只能看到一個小角落,畫質並沒有提昇,這裡應該可以在拍照時暫停TFT,然後改畫質,拍照,然後改回240*320給TFT用。

2.目前TFT顯示還是放在主LOOP中,如果以後有新的程序(例如拍照)就必須跟TFT共用LOOP,不過想想似乎也是正常,雖然想說用雙核心把他移出去,但是又想到CameraWebServer那個模組好像已經拿一個核心去用了。

暫時先這樣吧。

程式下載:http://t.ly/cyeH

PXL_20201214_175241317


夜市 小霸王 發表在 痞客邦 留言(0) 人氣()