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

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

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


以往使用ESP32CAM都要透過網路傳輸影像,不然就是拍照放在SD卡,之前有教過拍照然後送到Azure做臉部辨識,但是發現學生總是把照片拍了上下顛倒,或者歪歪扭扭,導致辨識不出來,抱怨說,沒辦法先預覽對準,所以不知道拍到什麼。

網路找了一些範例,主要有兩種,一種是I2C的OLED,不過畫質很差,主要OLED只有兩色,所以顯示效果類似黑白照片,例如:https://blog.csdn.net/qq_28877125/article/details/99687985

image

另外一種就是SPI TFT,畫面較為流暢,還可以觸控(本文沒有用到),畫面就漂亮多了,本文主要參考這篇:https://blog.xuite.net/iamleon/blog/589421027,然後做了小小修改

一、材料準備

  • ESP32CAM+USBTTL(或ESP32CAM CH340)
  • SPI TFT,型號:TJCTM24028-SPI
  • 杜邦線若干

環境設定請參考這篇:https://youyouyou.pixnet.net/blog/post/119383183,也請先使用範例程式進行測試。

二、接線

請依照下表完成接線

TFT ESP32CAM
SDO(MISO) 12
LED 3.3V (VCC)
SCK 14
SDI(MOSI) 13
D/C 2
RESET 16
CS 15
GND GND
VCC 3.3V (VCC)

 

image

原本的文章RESET是接在4,導致閃光亮到眼睛睜不開,所以這裡改用16

三、安裝程式庫:一共有兩個程式庫要安裝

  • TFT程式庫:關鍵字輸入"TFT_eSPI",然後找到作者是"Bodmer"的這個,點安裝。
    image
  • TJpg_Decoder解碼器:關鍵字輸入"TJpg_Decoder",然後找到作者是"Bodmer"的這個,點安裝。
    image

安裝完畢之後,需要修改一下程式庫內的User_Setup.h,主要是因為程式庫內設計是給ESP32而不是ESP32CAM用的,所以要補上一些腳位定義

避免麻煩大家補錯,可以直接下載這個檔案:https://bit.ly/3oRCcyj,並覆蓋掉程式庫內的User_Setup.h,User_Setup.h一般是在「C:\Users\你的帳號\Documents\Arduino\libraries\TFT_eSPI

四、燒錄程式碼

文章標籤

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

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


ESP32CAM預設是透過WIFI傳遞mjpeg影像,同網域監看視訊影像很簡單,但是如果跨網域就要利用NAT的IP轉送,設定有點麻煩。

其他的方式,例如將照片上傳到Google空間,或者把照片上傳到Line等。不過都較為複雜

這次則是使用現在最流行的MQTT轉送照片,並用手機觀看,設定VGA品質每5秒一張,測試幾個小時都很正常。

本次感謝網友楊老師,主內容是他的程式,他還有寫一個車牌辨識,改天請他分享

(不過要記得的是我這次用的MQTT沒有安全性,只要有人訂閱同一個Topic就可以觀看你的照片喔)

步驟:

一、材料準備
1.手機,安裝好MQTT APP:MQTT Dash(https://play.google.com/store/apps/details?id=net.routix.mqttdash&hl=zh_TW)

2.ESP32CAM

二、ESP32CAM燒錄以下程式
要先安裝程式庫,請利用功能表/草稿碼/匯入程式庫/管理程式庫,輸入關鍵字:PubSubClient,作者為Nick O'Leary這個
image


#include <esp_camera.h>
#include <WiFi.h>
#include <PubSubClient.h>
// ------ 以下修改成你自己的WiFi帳號密碼 ------
const char* ssid = "You";
const char* password = "0933932774";

// ------ 以下修改成你MQTT設定 ------
const char* mqtt_server = "mqtt.eclipseprojects.io";//免註冊MQTT伺服器
const unsigned int mqtt_port = 1883;
#define MQTT_USER               "my_name"             //本案例未使用
#define MQTT_PASSWORD           "my_password"         //本案例未使用
#define MQTT_PUBLISH_Monitor    "yourTopic/esp32cam/pic"  // 放置Binary JPG Image的Topoc,記得要改成自己的


 
// ------ OV2640相機設定 ------------
#define CAMERA_MODEL_AI_THINKER
#define PWDN_GPIO_NUM     32
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27
#define Y9_GPIO_NUM       35
#define Y8_GPIO_NUM       34
#define Y7_GPIO_NUM       39
#define Y6_GPIO_NUM       36
#define Y5_GPIO_NUM       21
#define Y4_GPIO_NUM       19
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM        5
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22


 
char clientId[50];
void mqtt_callback(char* topic, byte* payload, unsigned int msgLength);
WiFiClient wifiClient;
PubSubClient mqttClient(mqtt_server, mqtt_port, mqtt_callback, wifiClient);

//啟動WIFI連線
void setup_wifi() {
  Serial.printf("\nConnecting to %s", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.print("\nWiFi Connected.  IP Address: ");
  Serial.println(WiFi.localIP());
}


 
//MQTT callback,本案例沒使用
void mqtt_callback(char* topic, byte* payload, unsigned int msgLength) {

}

//重新連線MQTT Server
boolean mqtt_nonblock_reconnect() {
  boolean doConn = false;
  if (! mqttClient.connected()) {
    boolean isConn = mqttClient.connect(clientId);
    //boolean isConn = mqttClient.connect(clientId, MQTT_USER, MQTT_PASSWORD);
    char logConnected[100];
    sprintf(logConnected, "MQTT Client [%s] Connect %s !", clientId, (isConn ? "Successful" : "Failed"));
    Serial.println(logConnected);
  }
  return doConn;
}

//MQTT傳遞照片
void MQTT_picture() {
  //camera_fb_t * fb;    // camera frame buffer.
  camera_fb_t * fb = NULL;
  fb = esp_camera_fb_get();
  if (!fb) {
    delay(100);
    Serial.println("Camera capture failed, Reset");
    ESP.restart();
  }

  char* logIsPublished;

  if (! mqttClient.connected()) {
    // client loses its connection
    Serial.printf("MQTT Client [%s] Connection LOST !\n", clientId);
    mqtt_nonblock_reconnect();
  }

  if (! mqttClient.connected())
    logIsPublished = "  No MQTT Connection, Photo NOT Published !";
  else {
    int imgSize = fb->len;
    int ps = MQTT_MAX_PACKET_SIZE;
    // start to publish the picture
    mqttClient.beginPublish(MQTT_PUBLISH_Monitor, imgSize, false);
    for (int i = 0; i < imgSize; i += ps) {
      int s = (imgSize - i < s) ? (imgSize - i) : ps;
      mqttClient.write((uint8_t *)(fb->buf) + i, s);
    }


 
    boolean isPublished = mqttClient.endPublish();
    if (isPublished)
      logIsPublished = "  Publishing Photo to MQTT Successfully !";
    else
      logIsPublished = "  Publishing Photo to MQTT Failed !";
  }
  Serial.println(logIsPublished);
 esp_camera_fb_return(fb);//清除緩衝區
}


void setup() {
  Serial.begin(115200);
  //相機設定
  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = Y2_GPIO_NUM;
  config.pin_d1 = Y3_GPIO_NUM;
  config.pin_d2 = Y4_GPIO_NUM;
  config.pin_d3 = Y5_GPIO_NUM;
  config.pin_d4 = Y6_GPIO_NUM;
  config.pin_d5 = Y7_GPIO_NUM;
  config.pin_d6 = Y8_GPIO_NUM;
  config.pin_d7 = Y9_GPIO_NUM;
  config.pin_xclk = XCLK_GPIO_NUM;
  config.pin_pclk = PCLK_GPIO_NUM;
  config.pin_vsync = VSYNC_GPIO_NUM;
  config.pin_href = HREF_GPIO_NUM;
  config.pin_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;
  config.jpeg_quality = 10;  //10-63 lower number means higher quality
  config.fb_count = 2;
  //設定照片品質
  config.frame_size = FRAMESIZE_QVGA ;// FRAMESIZE_ + UXGA|SXGA|XGA|SVGA|VGA|CIF|QVGA|HQVGA|QQVGA
  esp_err_t err = esp_camera_init(&config);
  delay(500);
  //啟動WIFI連線
  setup_wifi();
  sprintf(clientId, "ESP32CAM_%04X", random(0xffff));  // Create a random client ID
  //啟動MQTT連線
  mqtt_nonblock_reconnect();  
}


 

void loop() {
  mqtt_nonblock_reconnect(); 
  MQTT_picture();//用MQTT傳照片
  delay(10000);
}

燒錄完成後,如果設定沒問題,就可以從序列視窗看到傳遞成功的畫面

image

接下來就是設定手機的MQTT接收端

三、手機MQTT設定

安裝好APP後,先設定MQTT伺服器

1.點選右上角的 (+) 符號

文章標籤

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

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


前先日子Google宣布Tensorflow將出一版Tensorflow Micro版,比Tensorflow Lite更小要支援arduino系統,尤其標明要給esp32系列,讓人非常驚奇,大家一開始在PC上跑python tensorflow,後來在樹莓派、Jetson nano上跑Keras Tensorflow,沒想到現在竟然可以在ESP32上面跑Tensorflow。

雖然聽到這樣的消息,但也沒時間去研究,直到某天ESP32愛玩的版友詢問esp32cam要怎麼載入Tensorflow模型,我才知道Arduino程式庫竟然已經有範例了,在這裡就先測試ESP32CAM的人體偵測範例。
先放一張我的輪廓圖
image


一、首先你要有一組ESP32CAM以及一條CP2102下載線,或者ESP32CAM CH340接口加一條USB線。

二、Arduino環境設定可以參考本篇:https://youyouyou.pixnet.net/blog/post/119383183,最好先利用 ESP32/Camera/CameraWebServer 測試,確認晶片及鏡頭運作正常。

三、Arduino IDE安裝Tensorflow Lite程式庫

  1. 功能表/程式庫/管理程式庫,開啟程式庫管理員
    image
  2. 輸入關鍵字:Tensorflow,找到名稱為TensorFlowLite_ESP32的程式庫,並點選右側安裝

四、載入範例程式

完成程式庫安裝後,直接載入TensorFlowLite_ESP32的範例程式,位置在功能表/檔案/範例/最下方第三方程式庫的範例/TensorFlow_ESP32/person_detection_ESP32-Camera

image

載入後,點選頁簽config.h,將第12行的#define CONFIG_CAMERA_MODEL_AI_THINKER 1前方註解刪除,若您使用別種裝置,請自行選擇型號。

image

完成上述動作後,點選上傳程式碼

五、人體偵測結果

我先照著電腦螢幕看看,分數看得出來,是沒人得分比較多,中間一圈圓圓的應該是很亮的螢幕
image

把螢幕開一個空白的記事本,並放在螢幕上半部,可以看到結果

文章標籤

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

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


以往利用ESP32CAM都只是短時間測試一下,主要是因為是Webserver,要自己開瀏覽器連進去才能看,最近有一位ESP32愛玩群組的網友PO了一篇把ESP32改監視器常用的RTSP協定,這樣就可以接上我家的QNAP做長期監視錄影了,那就來測試看看。

首先連線到函式庫網址:https://github.com/geeksville/Micro-RTSP

下載打包zip後,利用arduino內的功能表/草稿碼/匯入函式庫/加入.zip檔案方式安裝本函式庫。

在github中的範例程式包含LCD等配件,我都先刪除,精簡後的程式如下


#include <WiFi.h>
#include <WebServer.h>
#include <WiFiClient.h>
#include "OV2640.h"
#include "SimStreamer.h"
#include "OV2640Streamer.h"
#include "CRtspSession.h"

char *ssid = "ssid";        // Put your SSID here
char *password = "password";      // Put your PASSWORD here

WebServer server(80);
WiFiServer rtspServer(554);
OV2640 cam;
CStreamer *streamer;

//mjpeg串流
void handle_jpg_stream(void)
{
  WiFiClient client = server.client();
  String response = "HTTP/1.1 200 OK\r\n";
  response += "Content-Type: multipart/x-mixed-replace; boundary=frame\r\n\r\n";
  server.sendContent(response);

  while (1)
  {
    cam.run();
    if (!client.connected())
      break;
    response = "--frame\r\n";
    response += "Content-Type: image/jpeg\r\n\r\n";
    server.sendContent(response);

    client.write((char *)cam.getfb(), cam.getSize());
    server.sendContent("\r\n");
    if (!client.connected())
      break;
  }
}

//靜態影像
void handle_jpg(void)
{
  WiFiClient client = server.client();
  cam.run();
  if (!client.connected())
  {
    return;
  }
  String response = "HTTP/1.1 200 OK\r\n";
  response += "Content-disposition: inline; filename=capture.jpg\r\n";
  response += "Content-type: image/jpeg\r\n\r\n";
  server.sendContent(response);
  client.write((char *)cam.getfb(), cam.getSize());
}

//錯誤處理
void handleNotFound() {
  String message = "Server is running!\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  server.send(200, "text/plain", message);
}

//WiFi連線
void WifiConnecte() {
  //開始WiFi連線
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi連線成功");
  Serial.print("IP Address:");
  Serial.println(WiFi.localIP());
}

void setup()
{
  Serial.begin(115200);
  //設定影像大小:UXGA(1600x1200),SXGA(1280x1024),XGA(1024x768),SVGA(800x600),VGA(640x480),CIF(400x296),QVGA(320x240),HQVGA(240x176),QQVGA(160x120)
  esp32cam_aithinker_config.frame_size = FRAMESIZE_UXGA;
  esp32cam_aithinker_config.jpeg_quality = 10;
  cam.init(esp32cam_aithinker_config);
  //開始WiFi連線
  WifiConnecte();
  
  server.on("/", HTTP_GET, handle_jpg_stream);
  server.on("/jpg", HTTP_GET, handle_jpg);
  server.onNotFound(handleNotFound);
  server.begin();
  rtspServer.begin();
  streamer = new OV2640Streamer(cam);//啟動服務
  Serial.println("WiFi connected");
  Serial.print("Use 'http://");
  Serial.print(WiFi.localIP());
  Serial.println("/' to watch mjpeg stream");
  Serial.print("Use 'http://");
  Serial.print(WiFi.localIP());
  Serial.println("/jpg' to see still jpg");
  Serial.print("Use RTSP:'");
  Serial.print(WiFi.localIP());
  Serial.println("', URL:'/mjpeg/1' and port:554 to start rtsp stream");
}

void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    WifiConnecte();
  }
  server.handleClient();
  uint32_t msecPerFrame = 100;
  static uint32_t lastimage = millis();
  // If we have an active client connection, just service that until gone
  streamer->handleRequests(0); // we don't use a timeout here,
  // instead we send only if we have new enough frames
  uint32_t now = millis();
  if (streamer->anySessions()) {
    if (now > lastimage + msecPerFrame || now < lastimage) { // handle clock rollover
      streamer->streamImage(now);
      lastimage = now;

      // check if we are overrunning our max frame rate
      now = millis();
      if (now > lastimage + msecPerFrame) {
        printf("warning exceeding max frame rate of %d ms\n", now - lastimage);
      }
    }
  }
  WiFiClient rtspClient = rtspServer.accept();
  if (rtspClient) {
    Serial.print("client: ");
    Serial.print(rtspClient.remoteIP());
    Serial.println();
    streamer->addSession(rtspClient);
  }
}




程式燒錄完畢之後,就開通兩個功能1.web mjpeg串流 及 2.RTSP串流,目前的程式兩者同時只能有一個連入,使用web連上後,rtsp會自己斷掉,當web關閉後,rtsp會重新啟動。

程式啟動後,序列埠的訊息如下,會通知您的ESP32取得的IP,還有指示要如何查看stream及設定RTSP

image

我們可以先用WEB連看看畫面正不正常,內容不像預設的CameraWebServer範例那麼多功能,就只有一個畫面做串流而已。

image

那麼如果你有synology或qnap這類的機器該如何設定錄影功能呢?

我這裡以qnap的Surveillance Station為例

image

1.開啟Surveillance Station

2.新增一台攝影機,選擇以下參數
廠牌:Generic Model
機型:Generic JPEG
URL:/mjpeg/1
名稱:任意輸入,例如倉庫、書房
網路位置:取得的IP
埠號:554

image

觀察連線狀況正常
image

利用qnap的播放器也很正常
image

文章標籤

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

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


最近常用Python去接ESP32CAM影像回來辨識,例如算一下幾個人、幾台車經過這類的問題,不過ESP32CAM傳輸透過網路,總是偶爾會斷線,之前寫的程式只要一段時間就會出錯,導致三不五時就要去自己重新按啟動。

python我算是新手,有些基礎語法到是沒那麼熟,其實只要加入我在.net程式中一定會用到的try catch就可以解決了。

1.ESP32CAM請安裝範例程式:Camerawebserver,這部份請參考:https://youyouyou.pixnet.net/blog/post/119383183

2.執行後,在序列視窗查看取得的IP

3.執行本python程式

完整程式碼可以在這裡下載:https://github.com/youjunjer/Python-Read-ESP32CAM


#ESP32CAM請使用CamerawebServer範例程式
import cv2 as cv
import numpy as np
from urllib.request import urlopen

#change to your ESP32-CAM ip
url="http://192.168.1.102:81/stream"
CAMERA_BUFFRER_SIZE=2048
stream=urlopen(url)
bts=b''
i=0
while True:    
    try:

文章標籤

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

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


使用者玩ESP32常遇到ESP32 「Brownout detector was triggered」然後不斷重新開機,主要原因是USB供電不足的原因,可能是USB線品質差,或者USB孔提供的電源不夠力等等,但是如果使用者目前手邊沒有其他電腦或線材可以替換,也可以強迫ESP32忽略此問題,方法很簡單,如下:


#include "soc/soc.h"
#include "soc/rtc_cntl_reg.h"

void setup(){
    WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
}


 

 

 


文章標籤

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

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


目前要看ESP32CAM的影像,主要還是透過瀏覽器打上IP,然後按下方的啟動串流Start Stream,就可以在ESP32的網頁中看到影像視窗

不過朋友問能不能透過軟體直接擷取ESP32cam的影像,當然可以,只要了解ESP32CAM傳輸的方式是mjpeg,然後找支援的mjpeg的軟體即可,不論是Android, iOS, Linux還是windows都可以找到。

在此先介紹一個windows的軟體:

IPCam 監控器:https://www.microsoft.com/zh-tw/p/ipcam-monitor/9wzdncrdprrd?activetab=pivot:overviewtab

安裝好上述的軟體後,並在ESP32CAM安裝好預設的CameraWebServer範例程式後(請參考本篇:https://youyouyou.pixnet.net/blog/post/119383183),點選+符號新增一個網路攝影機,並選擇Generic MJPEG cameras

image

輸入ESP32CAM的參數後,按下方存檔

  1. Camera name:隨便給一個名字,例如「ESP32CAM」
  2.  IP address:輸入從Arduino 序列監控視窗取得的IP,本人的IP是192.168.1.209
  3. Port number:輸入81
  4. MJPEG stream URL:輸入http://你的IP:81/stream
  5. username及password:省略留空白

image

按下存檔後,即可看到多一隻攝影機,此時直接點開即可看到畫面。

image

如果覺得畫面有點模糊,則是因為目前開啟的是預設值320*240,可以進入ESP32CAM的設定頁面修改一下影像品質就可以了。

image

不過就我的了解,這篇應該沒有解決朋友的問題~哈哈


文章標籤

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

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


以往在ESP32CAM教學時,偶爾會遇到學生問說,為什麼只有一個人能看,我都會說這是單晶片的限制,心裡想說,一顆兩三百的單晶片能做Stream Webserver已經很厲害了,還要多人連線,會不會太強人所難。

不過有一次一位很好學的學生問:「老師,您說ESP32有雙核心,還能跑多執行緒,現在不能多人連線看影像是不是有點說不過去」。

心想似乎也是,我每次上課都會強調這顆晶片可以跑多執行緒,竟然如此應該來研究一下如何將單人連線程式改寫成多人連線。

不過在研究之前,先Google看看,哲學家都說:「不用重複造輪子」,就發現了這篇:https://www.hackster.io/anatoli-arkhipenko/multi-client-mjpeg-streaming-from-esp32-47768f沒想到真的有大神已經寫好了,馬上把網址傳給那位好問的學生去測試看看,誰叫你愛問,沒想到一測試就成功了,太棒了。

後來又經過我們多次改寫及精簡,現在把輪子程式附上給大家。

image

三個客戶端同時連線:PCx2,手機x1,連線狀況非常好,多人連線也幾乎沒有延遲。


#include <WiFi.h>
#include <WebServer.h>
#include <WiFiClient.h>
#include <Arduino.h>
#include <pgmspace.h>
#include <stdio.h>
#include "esp_log.h"
#include "esp_attr.h"
#include "esp_camera.h"
#include <esp_bt.h>
#include <esp_wifi.h>

文章標籤

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

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


ESP32是Arduino相容,能完全適用Arduino生態系,套用Arduino的感測器及程式開發,不過ESP32有一個小小的缺點,就是他的腳位寫在背面,如果插入麵包版時,就看不到腳位編號,必須對照圖才能插到正確的腳位,這對初學的學生來說較為麻煩。

在教學上遇到的一些問題,因此我們設計了ESP32教學版ESPro Matrix版,除了將腳位編號寫在正面之外,附帶兩個USB Power Port可以快速開啟USB裝置,用來模擬智慧家電非常方便。

電路圖下載:https://t.ly/Zn4V

 

總體來說,本教學版有以下優點

  • 1.正面提供腳位號碼(GPIO),不用再邊看圖邊插,手忙腳亂
  • 2.內建多種燈號(使用i2c界面控制,附範例程式: https://youyouyou.pixnet.net/blog/post/120417760 )
  • 3.省下麵包板
  • 4.內建兩組usb power控制器,可快速模擬智慧家電開關(附範例程式)
  • 5.內建usb轉tx rx,可控制usb通訊(附範例程式 :https://youyouyou.pixnet.net/blog/post/120418861
  • 6.內建SD卡槽(附範例程式 )
  • 7.電位輸出可撥Switch轉3.3V或5V

ESP32及開發輔助板
image

正面

image
背面

其中USB UART可以對一些裝置下ATCommand,例如上面圖片中的NBIoT裝置

另外對於USB PowerPort則非常有用,插上USB風扇或者USB燈條,可以用藍芽語音控制,非常有趣。

說明一 燈號:https://youyouyou.pixnet.net/blog/post/120417760
說明二 USB Power:https://youyouyou.pixnet.net/blog/post/120418861
說明三 I2C LCD:https://youyouyou.pixnet.net/blog/post/121069748
說明四 SPI TF卡:https://youyouyou.pixnet.net/blog/post/119643441

關於藍芽語音遙控部份,可以參考本篇

文章標籤

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

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


注意~由於本產品USB接口並未固定,經常無故脫落,因此後續不再推薦及販售~

很多人都用過ESP32CAM,有WIFI藍芽還附帶ov2640鏡頭,不過麻煩的是esp32cam沒有USB接口,都要透過USBTTL線,例如CP2102有四條線黑紅白綠接起來複雜,上傳程式還要對接GND+IO0轉下載模式,對於初學者來說真是有點麻煩。

不過我們已經找到廠商做出整合USBTTL+ESP32CAM的模組了,只要插上Micro USB 就可以上傳程式了,上傳時也不用再對接GND+IO0,我們拉出Flash按鈕,上傳時需要透過RST+Flash就可以切換燒錄及工作模式。

107055429_3816632768352188_8107719808798363870_o

107416995_3816632611685537_3037977642090840672_n

燒錄時,切換下載模式步驟:按住Flash,再按RST,放開RST,放開Flash

完成後,直接按下RST,切換成工作模式

詳細說明,可參考安信可ESP32CAM切換方式: https://youyouyou.pixnet.net/blog/post/119383183

附帶的鏡頭品質也相當優良,效果非常好,另外網路的品質也非常高

106932588_3816632968352168_421216856918979636_o

使用UXGA1600x1200,可以維持5-6fps(PS.測試環境是WiFi AP就在旁邊5m左右)
107670839_3816632795018852_8793873029995165258_o

不過可能要特別注意:USB的頭很脆弱,拔插USB時要非常小心

建議依據以下手勢插入USB,避免USB口脫落

image


文章標籤

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

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


現在有兩個版本 2020舊版與2022新版,寫在擴充版的左下角,例如下面這張就是2020版本。

image
2020版的USB PowerPort使用的腳位是GPIO 1與GPIO 3,而GPIO1與3也是TXRX的Serial序列監控視窗。所以要使用USB PowerPort(IO 1)時,就不能用Serial序列監控視窗,IO 3 則是輸入,一般是可以不必關閉Serial直接可用。

2022版的USB PowerPort使用的腳位是GPIO 2與GPIO 18,已經有修正,所以Serial不會影響這兩個Port。

下面的程式用來測試USB PowerPort,功能是每兩秒切換一次


//Ver.2022版本使用2,18
int UsbPP1 = 2; // P1: GPIO 2
int UsbPP2 = 18; // P1: GPIO 18
//Ver.2020版本使用1,3
//int UsbPP1 = 1; // P1: GPIO 1
//int UsbPP2 = 3; // P1: GPIO 3
void setup() {
  pinMode(UsbPP1, OUTPUT);
  pinMode(UsbPP2, OUTPUT);
}

void loop() {
  //兩秒一次更換開關
  digitalWrite(UsbPP1, HIGH);

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

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


這是ESP32輔助版內建的燈號控制,輔助版內建八個控制燈,包括RGB LED三個燈以及訊號指示燈x5。

8個燈號理論上要使用八個腳位控制,不過我們加裝PCF8574 i2c晶片,所以只用了兩個腳位26,27
也代表你如果要使用板子上的燈號,26, 27請不要使用其他感測器。

以下的範例是說明如何控制三個LED燈及五個訊號指示燈

image

請先下載函式庫zip檔案:https://bit.ly/3qD2lCL

安裝程式庫:功能表/草稿碼/匯入程式庫/加入.ZIP程式庫

image

選擇上面下載的ZIP檔案

image

完成匯入程式庫

image

接下來直接開啟範例檔,或者複製以下程式

image


/*Younger Yang and 夜市小霸王
  本範例說明如何使用本教學輔助板(ESP32 Matrix)的LED
  教學板使用GPIO 26,27連接附加的I2C晶片
  一、依照LED編號開啟或關閉:

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

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


有一個同學要做智慧水壺,我自費買了一個HX711重量感測給他測試看看。

腳位接法:SCK=GPIO14(左8)、DT=GPIO(左7),腳位可在HX711.h修改

程式碼很簡單,直接下載壓縮檔:https://t.ly/EypAp

解壓縮後用Arduino IDE開啟.ino檔即可,因為程式內包.h及.ccp,所以就不貼原始碼在這裡。


文章標籤

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

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


近年來隨著人工智慧及物聯網產業的興起,教育部也越來越重視如何帶領學生實做這類程式教育課程,而Arduino易學易用,能快速開發感測與互動程式,成為程式課程的主流教材。Arduino的特點是所有軟硬體都開源,感測器種類繁多價格便宜,學生在設計程式專題時,能很快的找到合適的元件接線組裝,完成程式撰寫,可以說是初學者學習程式最重要的教材之一。

目前市面上最普遍的是Arduino UNO板,網路售價大概在100~200之間。UNO板最容易取得,可用感測器也多,不過卻缺少了網路及藍牙元件,物聯網課程中「通訊」是非常重要的一環,缺少了網路通訊,只能做本地端感測互動,沒有資料收集、雲端圖表、LINE互動、智慧家庭、語音或圖像分析…等功能,筆者覺得物聯網課程缺少了網路,不能叫做物聯網了。

UNO雖然可以加裝網路、藍牙(HC05)元件,但要另外採購,且接線、通訊設定、AT COMMAND等問題,會打亂教學流程,此時由樂鑫科技(ESPRESSIF)所開發內建WiFi的ESP8266晶片則是承接了這個需求缺口。

ESP8266一樣採用Arduino開放性架構,呼叫內建的ESP8266 WiFi.h函式庫就可以連上網路讀取資料,因此ESP8266曾經風靡一陣子,但後來發現ESP8266只有一組類比感測(analogRead),如果學生在製作專題需要使用到兩組類比感測器時,就必須再回去使用UNO,並沒有改善教學上的問題。

因此樂鑫再次推出ESP32這款殺手級Arduino相容晶片,ESP32不僅內建有WiFi及低功率藍牙BLE,可用腳位也擴增到約26根,大部分腳位同時支援類比及數位,內建霍爾、溫度、觸控感測器,主頻高達260mHz的雙核心CPU,傳輸界面SPI、I2C、UART等強大的功能,而價格上也相當有競爭力,不僅可以演練所有目前現有UNO課程,也可以利用內建的網路及藍牙等通訊元件完成更多的應用專題。

下表整理目前常見物聯網課程所使用的UNO、ESP8266及ESP32等三種開發板的規格比較:

由上表比較可知,ESP32充分改進ESP8266的缺失,加上經濟實惠的價格,足以讓ESP32成為IoT課程最佳的教學工具,且ESP32與UNO所有週邊感測元件完全相容,可以無痛直接升級ESP32。

ESP32有很多不同版本,每種都各有特色,目前市面上常見包括下列幾種:價格便宜的Doit ESP32 Dev Kit、附帶OLED的Lolin ESP32、18650電池座ESP32-TTGO、附帶相機及SD卡槽的ESP32-CAM、附帶光環LED及麥克風的HaloCode、縮小板ESP32-mini…等等,使用者可以依據需求採購合適的ESP32,常見的ESP32版本製表如下。
關於ESP32使用相容Arduino IDE開發環境建立,請參考本篇:第一篇 ESP32 Arduino開發環境架設(取代Arduino UNO及ESP8266首選)

image image
NodeMCU-32s
特點:建議使用,原因將於後一節說明
價格:約250-300

DOIT DEVKIT
特點:價格便宜,但缺少5V輸出
價格:約150-200

image image
TTGO ESP32
特點:附帶18650電池座,搭配深度睡眠(deepsleep),一顆電池可用一個月以上
文章標籤

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

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


一個夥伴傳來一個用esp8266播放mp3的架構,要我幫忙改成ESP32版本,原本我一直以為它是用dfplayer的,沒想到竟然是直接接在esp8266的rx腳位播放,除了SD卡外,沒有外加任何裝置,靠著的是軟體Lib dac做mp3解碼。
查了一下是採用esp8266audio這個lib(這個lib同時適用esp32),在此借花獻佛先提供8266的程式碼及接線方式。
一、材料準備
1.ESP8266任意版本皆可
2.SPI界面SD讀卡機及一片SD卡,像這款: https://goods.ruten.com.tw/item/show?21652913575950

3.內建擴大器喇叭,像是一般的電腦用喇叭即可,主要是因為rx腳位本身沒有電壓輸出,所以不能使用8歐姆那種沒有內建擴大器的speaker
4.各式杜邦線數條
二、硬體接線
1.先將SD讀卡機接在ESP8266的SPI腳位(CS, MISO, MOSI, SCK)
2.將擴大器喇叭的音源正負極同時接在rx上
3.再次提醒,要使用有擴大器的喇叭,將喇叭接上電源

image

三、程式設計

首先至github下載esp8266audio函式庫: https://github.com/earlephilhower/ESP8266Audio

點選右上角Clone or download/Download Zip

文章標籤

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

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


ESP32擁有兩個核心,不過平常都只用到一個核心,這樣是不是很浪費,我們如何善用增加效能呢?或者如何使用平行處理呢?本章分為三個部份解說:
一、    多核心概念
二、    顯示執行核心
三、    雙核心執行

一、多核心概念
我們常聽到說我的手機有4核心,電腦有8核心,所謂的多核心(Multi-core)簡單的說就是CPU能同時處理較多的任務且不會互相干擾,另外一種虛擬的多核心稱為多執行緒(Thread)則是CPU的分時多工,非本篇的討論範圍,由於ESP32有著240/160MHz的雙核心CPU,因此本篇將要說明是能將任務指定給核心執行的「xTaskCreatePinnedToCore」函數。

雙核心執行有什麼好處?例如可以增加效能,或者平行處理,舉例而言,我們有一個工作是要偵測現場溫濕度並上傳資料庫存檔,每20秒感測上傳一次,假定這項規定很嚴格,必須準時上傳不能有延遲,在以往程式的撰寫流程下,感測與網路上傳是寫在同一個程序內,也就是讀取溫濕度→上傳資料庫→等候20秒,但是上傳資料庫須看網路是否擁塞,假設上傳時間花了3秒,再加上等候20秒後,等於是23秒過了,長久下來就會延遲越來越多。

也許你會想說我們可以將等候時間改成17秒,這樣上傳時間3秒加起來剛好20秒,不過你也知道網路不是那麼好預估,有時候鄰居下載迷片,速度就慢了,而半夜時沒人速度又變得飛快,這樣我們總是沒辦法找到一個時間來補回。

而多核心在這裡就非常適用,也就是一個核心負責讀取溫濕度資料,另外一個核心則將資料送到資料庫,平行處理兩者互不相干,就可以固定總時間不變,而這就是雙核心CPU時的好處。
image

二、顯示執行核心
一般我們的程式都僅在ESP32的核心1執行(核心編號1),所以根本沒用到第2個核心(核心編號0),為了證明,我們可以透過xPortGetCoreID()函數來顯示現在使用到哪一個核心,例如我們寫一個簡單的HelloWorld,來測試看看。


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

void loop() {
  Serial.println("HelloWorld!");
  Serial.print("使用核心編號:");

文章標籤

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

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


OTA系列文

1. Basic OTA:https://youyouyou.pixnet.net/blog/post/121228330

在Arduino IDE中形成一個虛擬的Port,選擇該Port即可上傳新的程式,僅能使用在區域網路

2. OTAWebUpload:https://youyouyou.pixnet.net/blog/post/121228586

ESP32會變成一台Webserver,透過ESP32的網頁上傳ArduinoIDE編譯過得bin(binary)檔,須使用者主動上傳程式碼,且公用IP取得不易

3. HTTP Update:https://youyouyou.pixnet.net/blog/post/121228592

將編譯好的bin檔放在一個公開的網站上,讓ESP32主動下載,目前商用環境最常使用的方式

4.Stream Update:透過MQTT將編譯好的bin檔直接上傳到ESP32中

目前筆者尚無實做


文章標籤

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

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


更新中,可先參考本篇: https://youyouyou.pixnet.net/blog/post/119410657https://youyouyou.pixnet.net/blog/post/120080436


文章標籤

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

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


本章將介紹ESP32的藍芽通訊,藍芽與WiFi都是用來通訊,藍芽通常用於近端點對點通訊,WiFi則常用來連入網際網路,所謂的點對點就像是藍芽無線耳機與手機連接,用來播放音樂,或者藍芽滑鼠鍵盤功能是輸入文字,只是一種序列通訊,功能較為簡單,因此不需要像WiFi這樣太複雜的設定,不過藍芽雖然簡單,但是使用上方便,只要配對就可以取用服務,所以也非常流行。
與藍芽同位階的應該算是紅外線,不過紅外線有方向性,是要對準裝置才能傳輸,速度慢不說,距離大概不能超過10公尺,而藍芽則無方向性,因此不用對準,而且傳輸距離遠、速度也比紅外線快很多。
本書將會介紹如何使用ESP32藍芽與手機連線通訊,並透過手機的語音辨識遙控電風扇及檯燈,此外也會介紹最新的ibeacon室內定位裝置原理及實做。本章先簡介ESP32的藍牙通訊設定與使用,由於是藍芽內建的,所以不用接線或設定AT COMMAND,也不用宣告TXRX相關的通訊協定,而且ESP32內建的藍芽是採用低功率藍芽(BLE:Bluetooth Low Energy)耗電量較少,傳輸距離理論可達300公尺遠,實際測試30公尺沒問題,而常見搭配UNO使用的HC-05屬於藍芽2.1,理論傳輸距離只有10公尺,本章將介紹如何的啟動ESP32藍芽裝置,並搭配Android手機進行通訊,以下為本章的架構。

一、藍芽單向傳輸
二、藍芽雙向傳輸
三、藍芽指令與語音辨識

 

一、藍芽單向傳輸
本節說明使用ESP32藍芽將資訊傳遞給藍芽裝置(手機)進行接收,由於bluetooth函式庫iOS手機不相容的原因,後續章節都將使用Android裝置進行解說。
ESP32藍芽的開啟僅需幾個步驟:
1. 使用藍芽函式庫:#include <BluetoothSerial.h>
2. 宣告藍芽序列通訊物件:BluetoothSerial BT;//BT為藍芽通訊物件
3. 在Setup中開啟藍芽:BT.begin("BTName");// BTName為藍芽廣播名稱
4. 當要傳輸資訊時:BT.print("要傳輸的文字");//println則是換行
我們先來一個簡單的測試,就是每秒傳輸一次"Hello World!"到手機中,程式如下


#include <BluetoothSerial.h>
BluetoothSerial BT;//宣告藍芽物件,名稱為BT

void setup() {

文章標籤

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

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


更新中,可先參考本篇: https://youyouyou.pixnet.net/blog/post/120246022


文章標籤

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