FireBeetle Board-ESP32-E

1. FireBeetle BK7252 产品简介

FireBeetle BK7252 是一款使用 Beken BK7252 MCU 作为主控芯片的开发板,它是专为 音视频 IoT 设计。
它支持**WIFI并具有体积小巧超低功耗板载充电电路接口易用等特性。可灵活的用于家庭物联网改装工业物联网改装可穿戴设备**等等。
它的 WIFI 库 完全兼容火爆的 ESP32 网络框架,意味着您可以很轻松的移植 ESP32 平台的应用。

通过和**IFTTT等物联网平台**的连接,你可轻松制作出你独有的特色物联网智能家居系统。

2. FireBeetle系列是什么

FireBeetle是一个高性能且更mini的Arduino开源开发板系列,现在FireBeetle不仅完全兼容arduino的开发环境,并且拥有更丰富的软硬件资源,它将支持makecode、Mind+、pinpong、MicroPython的开发环境(即将完善),无论是图形化编程、C语言、python编程还是JS编程都可以随心所欲的操作硬件。

它是如此的灵活并且开源,我们为您提供了最简单的编程方式!最详细的教程资料!上千种易用的Gravity外设!无论您是学生、电子爱好者、艺术家或者设计师,它都将是您开启电子世界的最佳伙伴,不用再面对复杂的电路、烧脑的程序、五花八门的通信协议,使用FireBeetle别再犹豫!成就您的无限可能!

3. 外观、参数及主要性能描述

  • **板态:**DFRobot FireBeetle V2系列兼容

  • 工作电压:3.3V

  • 输入电压:3.3V~5.5V

  • 支持低功耗:10uA

  • 支持最大放电电流:600mA@3.3V LDO

  • 支持最大充电电流:500mA

  • Type-C: USB接口:4.75v-5.5v,支持 USB 充电

  • PH2.0锂电池接口:3.5-4.2v

  • 工作温度:-40℃~+85℃

  • 模块尺寸:25.4 × 60(mm)

  • 安装孔尺寸:M2安装孔 孔径2.0mm

    • MCU 主频:180MHz

    • RAM:512 KB

    • 片内 Flash:2 MB

    • LED灯:使用 D13 引脚控制的LED灯

    • 充电指示灯:指示充电方式的红色LED,通过三种方式指示充电状态:1、充满电或未充电时熄灭2、充电时常亮3、USB供电,未连接锂电池时高频闪烁

    • RST复位引脚:单击复位按钮,将程序复位

    • 按钮:连接 D4 的按钮

    • WiFi连接:支持 WiFi 协议 802.11 b/g/n,支持 AP 和 STA 两种模式

    • GDI 显示接口:DFRobot专用显示屏接口,详情后文GDI显示接口

    • DVP 摄像头接口:24 Pin DVP 摄像头接口,支持摄像头型号:OV7670

    • nand flash:板载 128MB nand flash,SDIO 接口连接,传输速率高达 350 KB/s、

    • MIC 接口:板载录音电路,连接 MIC 即可录音

    • SPK 接口:板载功放电路,连接 喇叭 即可放音

4. 引脚布局

5. 使用教程

5. 概述

5.1 Power

  • GND:这是所有电源和逻辑的公共接地
  • VCC:这是 USB / 锂电池 输入的正电压(5V-USB 供电时输出USB电压, 3.7V 锂电池供电时输出电池电压)
  • 3V3:这是 3.3V 稳压器的输出,可以提供 500mA 峰值

5.2 Control

  • RST - 与 ESP32 的复位引脚相连,可将程序复位
  • EN - 这是3.3V稳压器的使能引脚。它已上拉,因此接地能够禁用 3.3V 稳压器

5.3 GPIO

  • D2至D13-这些都是通用引脚,通常我们将其当作数字引脚使用,也可以使用其复用功能。
  • A0至A4-这些都是模拟输入引脚,其中A0-A3仅能作为输入引脚使用。
  • SDA -I2C(线)数据引脚。
  • SCL -I2C(线)时钟引脚。
  • SCK / MOSI / MISO-这些是硬件SPI引脚,您可以将它们用作日常的GPIO引脚(但建议使其保持空闲状态,因为它们最适合用于高速SPI硬件)。

5.4 UART

BK7252 有 1 个 UART 端口, 其中UART0用于与PC通信

串口名 Arduino TX RX
UART0 Serial D0 D1

6. 使用教程

6.1 首次使用

当您首次使用 FireBeetle BK7252 开发板,您需要了解以下步骤:

  1. 添加 IDE 中的 json 链接
  2. 下载主控的核心 SDK
  3. 选择开发板以及串口
  4. 打开示例程序并烧录
  5. 了解串口监视器
  • Arduino IDE 编译环境配置

    • 打开Arduino IDE,点击 File -> Preferences,如下图所示:

    • 在新打开的界面中,点击如下图红色圆圈中的按钮


      将如下链接地址复制到新弹出的对话框中:https://downloadcd.dfrobot.com.cn/FireBeetle/package_DFRobot_index.jsonstep 3
      点击 OK

    • 更新板卡,打开 Tools -> Board -> Boards Manager...,如下图所示:

    step 4

    Boards Manager会自动更新板卡,如下图所示:step 5
    更新完成后,会在列表中看到 FireBeetle-BK7252 主板,点击安装:

    安装完成后,列表会显示已经安装 FireBeetle-BK7252 主板,如下图所示:

6.2 连接电脑

FireBeetle-BK7252 支持 USB Host,通过 Type-C 数据线连接在电脑上时,会同时弹出两个设备。分别是:一个串口设备;一个 U 盘。

串口设备与 Arduino 的其他主控板是一样的,主要用来烧录程序和串口通信(比如查看串口打印)。

U 盘作为本开发板的特色,因为其板载的 128MB nand flash,可以弹出大小在 118MB 左右的空 U 盘,可以用来存储数据、音频文件、照片等。U 盘的第一次使用需要对其进行格式化。弹出 U 盘后,同时会弹出格式化串口,点击确定即可对 U 盘格式化。U 盘的传输速率可以达到 350 KB/s。

串口设备的优先级要高于 U 盘,这意味当您在烧录、reset等过程中 U 盘会被强制弹出,等开发板准备就绪后会重新弹出。在烧录过程中请不要读取或写入文件到 U 盘,容易造成数据丢失。串口在使用的过程中,比如在串口打印时,尽量不要使用 U 盘,因为 此时 U 盘的性能会降低很多,也有可能导致数据丢失的情况。

请不要在电脑端和开发板端同时对 U 盘内的同一个文件进行操作,容易造成开发板死机或数据丢失。

6.3 Blink

如果这是您第一次接触 arduino,此例程将是您的第一个程序。

烧录此程序您将看到 LED 规律闪烁,FireBeetle Board-BK7252 默认 Blink 灯连接到 D13。

  • 选择主板与端口

  • 点击 Tools -> Board,选择 FireBeetle-BK7252
  • 点击 Port 选择对应的串口
  • 编写程序

    // the setup function runs once when you press reset or power the board
    void setup() {
      // initialize digital pin LED_BUILTIN as an output.
      pinMode(LED_BUILTIN, OUTPUT);
    }

    // the loop function runs over and over again forever
    void loop() {
      digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(1000);                       // wait for a second
      digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
      delay(1000);                       // wait for a second
    }
  • 将以上程序粘贴到程序框中
  • 点击箭头等待程序编译并烧录至开发板

烧录成功

  • 如图所示及烧录成功

6.4 WiFi 使用示例

FireBeetle-BK7252 具有 WiFi 功能,以下示例使用 BK7252 创建了一个 WiFi 服务器,使用客户端连接到该服务器,遥控 LED 的亮灭

/*
  WiFiAccessPoint.ino 创建了一个wifi热点并提供了一个web服务

  Steps:
  1. 连接到这个wifi "yourAp"
  2. 访问 http://192.168.4.1/H 来开灯或者访问http://192.168.4.1/L 来关灯
     OR
     Run raw TCP "GET /H" and "GET /L" on PuTTY terminal with 192.168.4.1 as IP address and 80 as port
*/

#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiAP.h>


// 设置你的wifi与密码
const char *ssid = "your wifi ssid";
const char *password = "your wifi password";

WiFiServer server(80);

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);//将LED引脚设置为输出模式
  Serial.begin(115200);
  Serial.println();
  Serial.println("Configuring access point...");

  // 配置wifi以及获取IP地址.
  WiFi.softAP(ssid, password);
  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  server.begin();

  Serial.println("Server started");
}

void loop() {
  WiFiClient client = server.available();   // listen for incoming clients

  if (client) {                             // if you get a client,
    Serial.println("New Client.");           // print a message out the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        if (c == '\n') {                    // if the byte is a newline character

          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();

            // the content of the HTTP response follows the header:
            client.print("Click <a href=\"/H\">here</a> to turn ON the LED.<br>");
            client.print("Click <a href=\"/L\">here</a> to turn OFF the LED.<br>");

            // The HTTP response ends with another blank line:
            client.println();
            // break out of the while loop:
            break;
          } else {    // if you got a newline, then clear currentLine:
            currentLine = "";
          }
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }

        // Check to see if the client request was "GET /H" or "GET /L":
        if (currentLine.endsWith("GET /H")) {
          digitalWrite(LED_BUILTIN, HIGH);               // GET /H turns the LED on
        }
        if (currentLine.endsWith("GET /L")) {
          digitalWrite(LED_BUILTIN, LOW);                // GET /L turns the LED off
        }
      }
    }
    // close the connection:
    client.stop();
    Serial.println("Client Disconnected.");
  }
}

结果

使用手机连接该wifi,通过浏览器访问192.168.4.1,如图所示显示ip地址为192.168.4.1,服务已开启


使用浏览器访问该ip地址得到如下图所示



尝试分别点击链接控制LED吧

成员函数

  • begin()

    说明:wifi模块初始化

  • softAP(ssid,password)

    说明:将WiFi配置为AP模式,并设置名称以及密码

    参数:

    • ssid:AP模式的wifi名字
    • password:ap模式的wifi密码
  • disconnect()

    说明:断开客户端连接

  • connect()

    说明:客户端连接

  • read()

    说明:
    读取wifi接受到的数据

  • write()

    说明:通过wifi发送数据

6.5 录音

BK7252 板载录音电路,留出的录音接口引脚为 M_N 和 M_P,无需额外电路,直接连接 mic 即可使用。录音后,录音文件会存放在板载的 nand flash 内部。

#include <SD.h>
#include "DFRobot_Audio.h"

enum Status{
    ePrepare,
    eRecording,
    eStop
}eState=ePrepare;
const char *state[]={
  "ePrepare",
  "eRecording",
  "eStop"
};

DFRobot_Audio audio;

void setup(){
  Serial.begin(115200);
  while(!Serial);
  Serial.print("Initializing SD Card device...");
  if(!SD.begin()){
      Serial.println("initialization failed!");
      return;
  }
  Serial.println("initialization done.");
  Serial.print("Initializing Audio device...");
  if(!audio.begin(SD)){
      Serial.println("initialization failed!");
      return;
  }
  Serial.println("initialization done.");
  
  audio.initRecorder(RECORD_SAMPLERATE_8000_HZ);
  audio.record("/record.wav");
  Serial.println("Ready to record");
}
char cmd;
void loop(){
  while(!Serial.available());
  while(Serial.available()){
      char c = Serial.read();
      if(c == '\r' || c == '\n') continue;
      cmd = c;
  }
  Serial.print("command = ");Serial.println(cmd);
  switch(cmd){
      case 'b':
          if(audio.recorderControl(RECORD_BEGIN) == RECORD_CODE_SUCESS){
              Serial.println("Recording");
          }
          break;
      case 's':
          audio.recorderControl(RECORD_STOP);
          Serial.println("Stop and save data.");
          break;
       case 'p':
       Serial.println("Playing record audio.")
       audio.playMusic("/record.wav");
       break;
  }

}

结果

成员函数

  • DFRobot_Audio audio

    说明:实力化一个音频的对象

  • void initRecorder(uint32_t sampleRate = 8000);

    说明:初始化

  • *void record(const char Filename);

说明:录音,并保存文件

参数:Filename 录音文件名,是wav格式的音乐文件名

  • uint8_t recorderControl(uint8_t cmd);

    说明:录音控制

    参数:cmd 控制命令,RECORD_BEGIN:开始录音;RECORD_STOP:结束录音

6.6 放音

BK7252 板载功放电路,留出的功放接口引脚为 A_N 和 A_P,无需额外电路,直接连接功放喇叭即可使用。可以从板载的 nand flash 内部读取音乐并播放。目前支持的音频格式为 WAV。也可通过 wifi 网络播放流媒体音乐。

/*!
 * @file playmusic.ino
 * @brief Play the music named test.wav,test.mp3,test.pcm
 * @n  运行此demo之前, 需在SD卡的中存放名为test.wav,test.mp3,test.pcm 3首歌曲。
 *
 * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @licence     The MIT License (MIT)
 * @author [Arya](xue.peng@dfrobot.com)
 * @version  V1.0
 * @date  2020-09-16
 * @get from https://www.dfrobot.com
 * @url
 */
#include <SD.h>
#include "DFRobot_Audio.h"

DFRobot_Audio audio;
//打印进度条 0x4033A8----0x403381
void setup(){
  Serial.begin(115200);
  while(!Serial);
  Serial.print("Initializing SD Card device...");
  if(!SD.begin()){
      Serial.println("initialization failed!");
      return;
  }
  Serial.println("initialization done.");
  Serial.print("Initializing Audio device...");
  if(!audio.begin(SD)){
      Serial.println("initialization failed!");
      return;
  }
  Serial.println("initialization done.");

  Serial.println("Set Speakers Volume from 0 to 99: 80");
  audio.setSpeakersVolume(40);

  Serial.println("Play music: test.wav");
  audio.playMusic("test.mp3");
  printMusicInformation();

  Serial.println("Play music: test.mp3");
  audio.playMusic("test.wav");
  printMusicInformation();

  Serial.println("Play music: test.pcm");
  audio.playMusic("test.pcm");
  printMusicInformation();
}


void loop(){

}

void printMusicInformation(){
  const char *state[] ={
        "STOPPED",
        "PLAYING",
        "PAUSED"
  };
  int dur,intel,intel2, i = 0;
  int base = 0, base1 = 0;
  char timeStr[6];
  Serial.println("Dump status:");
  Serial.print("\tStatus: ");Serial.println(state[audio.getPlayerState()]);
  if(audio.getPlayerState() != STOPPED){
      Serial.print("\tUrl: ");Serial.println(audio.getMusicUrl());
      Serial.print("\tvolume: ");Serial.println(audio.getSpeakersVolume());
      dur = audio.getMusicDuration(timeStr);
      intel = dur/100 + (dur%100 ? 1: 0);
      intel2 = dur%100;
      Serial.print("\tDuration: ");Serial.println(timeStr);
      Serial.print("\tPosition: ");
      while(audio.getPlayerState() != STOPPED){
          if((base + (i-base1)*intel) <= audio.getPlayPosition()){
              Serial.write(0x4033A8);Serial.write(0x403381);
              if(i == intel2){
                  //i = 0;
                  base1 = intel2;
                  base = intel2 * intel;
                  intel -= (dur%100 ? 1: 0);
              }
              i++;
          }
      }
      Serial.print(i);
      for(;i < 100; i++){
          Serial.write(0x4033A8);Serial.write(0x403381);
      }
  }
  Serial.println("\n");
}

结果

成员函数

  • void initPlayer();

    说明:初始化

  • *void setPlayListPath(const char dirpath);

    说明:设置播放列表路径

    参数:dirpath 音乐文件名

  • const char getPlayListPath();*

    说明:获取播放列表路径

    返回值:返回播放列表的名字

  • bool updateMusicList();

    说明:更新音乐列表,该操作会清空已有的音乐播放列表

  • **void getMusicListIndexAndNum(uint8_t num, uint8_t index = NULL);

    说明:获取音乐播放列表中index所在的位置的音乐名字

    参数:num 音乐列表中所有音乐的数目

    参数:index 选中音乐所在音乐列表的位置

  • *const char getMusicNameFromMusicList(int index);

    说明:获取音乐播放列表中index所在的位置的音乐名字

    参数:index 音乐列表中某项音乐的位置

  • void setPlayMode(uint8_t mode = SINGLE);

    说明:设置音乐播放模式

    参数:mode 播放模式 ePlayerMode_t

  • uint8_t getPlayMode();

    说明:获取音乐播放模式

  • *void playMusic(const char Filename);

    说明:播放音乐

    参数:Filename 音乐文件名

    • const char * getMusicUrl();

      说明:获取正在播放的音乐的名字路径

      返回值:返回正在播放的音乐的名字路径,没有播放的音乐则返回NULL

    • *int getMusicDuration(char t = NULL);

      • 说明:获取当前播放音乐的时间
      • 参数:t 以00:00的方式显示歌曲时间
      • 返回值:返回音乐播放的时间,单位s
    • *int getPlayPosition(char t = NULL);

      • 说明:获取当前音乐播放位置
      • 参数:t 以00:00的方式显示当前歌曲播放到那个位置
      • 返回值:返回当前播放歌曲的播放位置
    • void setSpeakersVolume(uint8_t volume);

      • 说明:设置扬声器音量
      • 参数:volume 音量,范围0~99
    • uint8_t getSpeakersVolume();

      • 说明:获取扬声器音量
      • 参数:返回扬声器音量
    • void playerControl(ePlayerCmd_t cmd);

      • 说明:播放音乐控制
      • 参数:cmd 控制命令
      • 参数:second 录音多少秒
    • void setPlaybackProgress(uint32_t second);

      • 说明:设置音乐播放进度
      • 参数:second 从第几秒开始播放,单位秒
    • uint8_t getPlayerState();

      • 说明:获取播放器状态
      • 返回值:返回播放器的状态,0-STOPPED,1-PLAYING,2-PAUSED

7.6 GDI显示接口

FireBeetle Board-ESP32 V4.0

此接口为DFRbot专用GDI显示屏接口,使用18pin-FPC线连接,单线材连接屏幕,为您提供最简捷的屏幕使用方式。
以下是GDI接口使用的引脚列表

FPC PINS FireBeetle M0 PINS Description
VCC 3V3 3.3V
BLK(PWM调光) 12/D13 背光
GND GND GND
SCLK 18/SCK SPI时钟
MOSI 23/MOSI 主机输出,从机输入
MISO 19/MISO 主机输入,从机输出

|DC |25/D2 | 数据/命令
|RES |26/D3 | 复位 |
|CS |14/D6 | TFT片选 |
|SDCS |13/D7 |SD卡片选 |
|FCS |0/D5 |字库|
|TCS |4/D12 |触摸|
|SCL |22/SCL |I2C时钟|
|SDA |21/SDA |I2C数据|
|INT |16/D11 |INT|
|BUSY-TE |17/D10 |防撕裂引脚|
|X1 | NC |自定义引脚1|
|X2 | NC |自定义引脚2|

使用FPC链接屏幕时根据GDL demo配置所需对应的引脚号即可,通常只需要根据不同主控配置三个引脚

支持GDI的显示屏:

#elif defined(ESP32) || defined(ESP8266)
#define TFT_DC  25
#define TFT_CS  14
#define TFT_RST 26

具体使用方式请参考,GDL显示屏wiki:https://wiki.dfrobot.com.cn/_SKU_DFR0664_2.0_240x320_LCD

warning_yellow.png NOTE: 请不要重复使用相关引脚

6.7 摄像头

/*!
 * @file camera.ino
 * @brief take a photo and save jpg file in sdio flash.
 * @n  
 *
 * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @licence     The MIT License (MIT)
 * @author [Arya](xue.peng@dfrobot.com)
 * @version  V1.0
 * @date  2021-2-24
 * @get from https://www.dfrobot.com
 * @url
 */
#include <SD.h>
#include "DFRobot_Audio.h"
#include "Webcam.h"

DFRobot_Audio audio;
Webcam camera;
const int buttonPin = 4;
int flag = 0;
//打印进度条 0x4033A8----0x403381
void setup(){
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(115200);
  while(!Serial);
  Serial.print("Initializing SD Card device...");
  if(!SD.begin()){
      Serial.println("initialization failed!");
      return;
  }
  Serial.println("initialization done.");
  
  Serial.print("Initializing camera device...");
  if(camera.begin(SD) < 0){
      Serial.println("initialization failed!");
      return;
  }
  Serial.println("initialization done.");
  
  Serial.print("Initializing Audio device...");
  if(!audio.begin(SD)){
      Serial.println("initialization failed!");
      return;
  }
  Serial.println("initialization done.");
  
  Serial.println("Set Speakers Volume from 0 to 99: 80");
  audio.setSpeakersVolume(60);
  
  Serial.println("Ready to take photo");
}


void loop(){  
  if(!digitalRead(buttonPin)&&flag==0){  //Press user key to take photo
      while((!digitalRead(buttonPin))){  //Eliminate shaking
          delay(10);
      }
      if(camera.snapshot("/photo1.jpg") < 0){
          Serial.println("take photo1 fail.");
      }else{
          Serial.println("take photo1.");
          audio.playMusic("test.mp3");
          flag=1;
      }
  }
  if(!digitalRead(buttonPin)&&flag==1){  //Press user key to take photo
      while((!digitalRead(buttonPin))){  //Eliminate shaking
          delay(10);
      }
      if(camera.snapshot("/photo2.jpg") < 0){
          Serial.println("take photo1 fail.");
      }else{
          Serial.println("take photo2.");
          audio.playMusic("test.mp3");
          flag=0;
      }
  }
}

结果

成员函数

int begin(SDClass &sd);
/**

  • @brief 摄像头注销
    /
    void end();
    /
    *
  • @brief 快照,快速照一张照片
  • @params pictureFilename, 照片文件名,后缀名为.jpg,目前支持.jpg格式的存储
  • @return 初始化成功返回0,否则返回-1
    /
    int snapshot(const char pictureFilename);
    /
  • @brief 设置图片的尺寸
  • @params ppi, 图片尺寸参数,可填PPI_TYPE_QVGA_320_240、PPI_TYPE_QVGA_640_480
    /
    void setPicturePPIType(uint8_t ppi);
    /
    *
  • @brief 设置图片帧传输率
  • @params fps, 帧传输率, 可使用EJPEG_TYPE_5FPS/EJPEG_TYPE_10FPS/EJPEG_TYPE_20FPS
    */
    void setFramePerSeconds(uint8_t fps);

/**

  • @brief 启动网络摄像头
    /
    bool enableWebcam();
    /
    *
  • @brief 启动网络摄像头
    /
    bool disableWebcam();
    /
    *
  • @brief 获取一帧图片的数据
  • @params buf, 存放图像数据
  • @params len, 存放图像数据长度
    */
    void getVideoData(char *buf, char *len);

6.8 sleep模式

在sleep模式下可以将功耗降低至10μA(断开低功耗焊盘),以下demo将演示定时进入sleep模式


成员函数

7. Arduino基础教程

7.1 GPIO

数字IO

  • digitalRead(pin)
    说明:从指定的数字引脚读取值HIGH或LOW
    参数:

    • pin:您要读取的Arduino引脚号
  • digitalWrite(pin,value)
    说明:将HIGH或LOW值写入数字引脚
    参数:

    • pin:Arduino引脚号。
    • value:HIGH或LOW。
  • pinMode(pin, mode)
    说明:将指定的引脚配置为充当输入或输出
    参数

    • pin:用于设置模式的Arduino引脚号。
    • mode:INPUT,OUTPUT,或INPUT_PULLUP。

按键控制LED

模拟IO

  • AnalogRead(pin)
    说明:从指定的模拟引脚读取值。
    参数

    • pin:要读取的模拟输入引脚的名称
  • AnalogReference(type)

    说明:配置用于模拟输入的参考电压

    参数

    • type
  • AnalogWrite(pin,value)

    说明:将模拟值(PWM wave)写入引脚。可用于以不同的亮度点亮LED或以不同的速度驱动电动机。调用之后analogWrite(),该引脚将生成指定占空比的稳 定矩形波,直到同一引脚上的下一次调用analogWrite()(或调用digitalRead()或digitalWrite())为止

    参数:

    • pin:要写入的Arduino引脚。允许的数据类型:int。

    • value:占空比:在0(始终关闭)和255(始终打开)之间。允许的数据类型:int。

7.2 串口

  • Serial.begin(speed)

    说明:设置以每秒比特数(波特)为单位的串行数据传输的数据速率。要与串行监视器通信,请确保使用其屏幕右下角菜单中列出的波特率之一。

    参数

    • speed:以每秒位数(波特)为单位。允许的数据类型:long。
  • Serial.available()
    说明:检测串口是否有数据输入

输入

  • Serial.read()

    说明:读取传入的串行数据。

  • Serial.peek()
    说明:返回传入串行数据的下一个字节(字符),而不将其从内部串行缓冲区中删除。

输出

  • Serial.print()
    说明:串口打印
  • Serial.println()
    说明:串口打印并自动换行

软件串口

  • SoftwareSerial()

运行时间函数

  • micros()

    说明:返回自Arduino开发板开始运行当前程序以来的微秒数
  • millis()

    说明:返回自Arduino开发板开始运行当前程序以来经过的毫秒数

延时函数

  • delay(ms)

    说明

    参数:ms:要暂停的毫秒数。允许的数据类型:unsigned long。

  • delayMicroseconds(us)

    说明:暂停程序一段由参数指定的时间(以微秒为单位)。一毫秒有一千微秒,一秒有一百万微秒。

    参数:us:要暂停的微秒数。允许的数据类型:unsigned int。

7.3 中断

  • attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)

    说明:外部中断

    参数

  • pin:Arduino引脚号。

  • ISR:发生中断时要调用的ISR;此函数必须不带任何参数,并且不返回任何内容。有时将此功能称为中断服务程序。

  • mode:定义何时触发中断。预定义了四个常数作为有效值:

  • detachInterrupt(digitalPinToInterrupt(pin))
    说明:关闭给定的中断。

    参数

    • pin:需要禁用的中断引脚
  • interrupts()

    说明:重新启用中断(在被noInterrupts()禁用之后。中断允许某些重要任务在后台发生并默认启用。当禁用中断时,某些功能将不起作用,并且传入通信可能会被忽略。可能会稍微破坏代码的时序,但是对于特别关键的代码部分可能会被禁用。

  • noInterrupts()

    说明:禁用中断(您可以使用来重新启用它们interrupts())。中断允许某些重要任务在后台发生,并且默认情况下启用。禁用中断时,某些功能将不起作用,并且传入的通信可能会被忽略。但是,中断可能会稍微破坏代码的时序,并且可能会在代码的特别关键的部分将其禁用。

7.4 I2C

I2C主从机与引脚

与串口的一对一通信方式不同,总线通信通常有主机(Master)和从机(Slave)之分。通信时,主机负责启动和终止数据传送,同时还要输出时钟信号;从机会被主机寻址,并且响应主机的通信请求,通信速率的控制由主机完成,主机会通过SCL引脚输出时钟信号供总线上的所有从机使用。同时,I2C是一种半双工通信方式,即总线上的设备通过SDA引脚传输通信数据,数据的发送和接收由主机控制,切换进行。ESP32有两个I2C控制器(也称为端口),负责处理两条I2C总线上的通信。每个I2C控制器都可以作为主机或从机运行。引脚21 默认的SDA, 引脚22是默认的SCL

  • begin(address)

    说明
    初始化I2C连接,并作为主机或者从机设备加入I2C总线。
    参数

  • read()

    说明:在主机中,当使用requestFrom()函数发送数据请求信号后,需要使用read()函数来获取数据;在从机中需要使用该函数读取主机发送来的数据。

    参数

  • available()

    说明:返回接收到的字节数。

    参数

  • write:()

    **说明:**当为主机状态时,主机将要发送的数据加入发送队列;当为从机状态时机发送数据至发起请求的主机。

    参数

    • valuc:以单字节发送。
    • string:以一系列字节发送。
    • data:以字节形式发送数组。
  • requestFrom(address,quantity)

    说明:主机向从机发送数据请求信号,使用requestFrom()后,从机端可以使用onRequest()注册一个事件用以响应主机的请求;主机可以通过available()和 read()函数读取这些数据。

    参数

    • quantity,请求的字节数。
    • address,设备的地址。
  • beginTransmission(address)

    说明:设定传输数据到指定地址的从机设备。随后可以使用write()函数发送数据,并搭配endTransmission(函数结束数据传输。

    参数

    • address:设备的地址
  • endTransmission

    说明:结束数据传输

    参数

    • stop:boolean型值,当其值为true时将发送一个停止信息,释放I2C总线,当没有填写 stop参数时,等效使用true;当为 false时,将发送一个重新开始信息﹐并继续保持I2C 总线的有效连接
  • onReceive()
    说明:8. onReceive()
    功能:该函数可在从机端注册一个事件,当从机收到主机发送的数据时即被触发。
    语法:Wire.onReceive( handler
    参数:

    • handler,当从机接收到数据时可被触发的事件。该事件带有一个int型参数(从主机读到的字节数)且没有返回值,如void myHandler(int numBytes)。
  • onRequest(handler)
    说明:注册一个事件,当从机接收到主机的数据请求时即被触发。语法:Wire.onRequest(handler)
    参数:

    • handler,可被触发的事件。该事件不带参数和返回值,如 void myHandler()。

7.5 SPI

SPI引脚

ESP32有四个SPI外设,分别为SPI0、SPI1、HSPI和VSPI。

SPI0是专用于Flash的缓存,ESP32将连接的SPI Flash设备映射到内存中。

SPI1和SPI0 使用相同的硬件线,SPI1用于写入flash芯片。

HSPI和VSPI可以任意使用。

SPI1、HSPI和VSPI共有三条片选线,因此作为SPI主机允许ESP32 至多驱动三个SPI设备。

  • begin()
    说明:初始化SPI通信,调用该函数后,SCK.MOSI,SS引脚将被设置为输出模式,且 SCK和 MOSI引脚被拉低,SS引脚被拉高。

  • end()
    说明:关闭SPI总线通信。

  • setBitOrder()
    说明:设置传输顺序。

  • setBitOrder()
    说明:设置通信时钟。时钟信号由主机产生,从机不用配置。但主机的SPI 时钟频率应该在从机允许的处理速度范围内。

8.进阶教程

8.1 使用SD库

SD类

  • begin(cspin)
    说明:初始化SD卡库和 SD卡。当使用SD.begin()时﹐默认将Arduino SPI的SS引脚连接到SD卡的CS使能选择端;也可以使用begin(cspin)指定一个引脚连接到SD卡的CS使能选择端,但仍需保证 SPI 的SS引脚为输出模式,否则SD卡库将无法运行。
    参数:cspin:连接到SD 卡CS端的Arduino引脚。
    返回值: boolean型值,为 true表示初始化成功;为 false表示初始化失败。

  • exists()
    说明:检查文件或文件夹是否存在于SD卡中。语法:SD. exists( filename)
    参数:
    filename:需要检测的文件名。其中可以包含路径,路径用“/”分隔。
    返回值: boolean型值,为 true表示文件或文件夹存在;为false表示文件或文件夹不存在。

  • open()
    说明:打开SD卡上的一个文件。如果文件不存在,且以写入方式打开,则Arduino会创建一个指定文件名的文件。(所在路径必须事先存在)
    语法:SD.open( filename)SD.open(filename,mode)
    参数:

    filename:需要打开的文件名。其中可以包含路径,路径用“/”分隔。
    mode(可选):打开文件的方式,默认使用只读方式打开。也可以使用以下两种方式打开文件:
    FILE_READ:只读方式打开文件;FILE_WRITE,写入方式打开文件。
    返回值:返回被打开文件对应的对象﹔如果文件不能打开,则返回false。
    FILE_WRITE,写入方式打开文件。
    返回值:返回被打开文件对应的对象;如果文件不能打开,则返回false。

  • remove()
    说明:从SD卡移除一个文件。如果文件不存在,则函数返回值是不确定的,因此在移除文件之前,最好使用SD. exists(filename)先检测文件是否存在。
    语法:SD. remove( filename)
    参数:
    filename,需要移除的文件名。其中可以包含路径,路径用“!”分隔。
    返回值: boolean型值,为true表示文件移除成功;为false表示文件移除失败。

  • mkdir(filename)
    说明:创建文件夹。
    参数:

    • filename,需要创建的文件夹名。其中可以包含路径,路径用“/”分隔。返回值: boolean型值,为 true表示创建成功;为false表示创建失败。
  • rmdir(filename)
    说明:移除文件夹。被移除的文件夹必须是空的。语法:SD.rmdir( filename)
    参数:

    • filename,需要移除的文件夹名。其中可以包含路径,路径用“/”分隔。
      返回值 : boolean型值,为 true表示移除成功;为false表示移除失败。

File类

File类提供了读/写文件的功能,该类的功能与之前使用的串口相关函数的功能非常类似。其成员函数如下。

  • available()
    说明:检查当前文件中可读数据的字节数。语法:file. available()
    参数:

    • file:一个 File类型的对象。返回值:可用字节数。
  • close()
    说明:关闭文件,并确保数据已经被完全写入SD卡中。语法:file. close()
    参数:

    • file:一个 File类型的对象。返回值:无。
  • flush()
    说明:确保数据已经写入SD卡。当文件被关闭时,flush()会自动运行。语法: file.flush
    参数:

    • file:一个File类型的对象。返回值:无。
  • peek()
    说明:读取当前所在字节,但并不移动到下一个字节。
    参数

    • file:一个 File类型的对象。
      返回值:下一个字节或者下一个字符。如果没有可读数据,则返回一1。
  • position( )
    说明:获取当前在文件中的位置(即下一个被读/写的字节的位置)。语法:file. position()
    参数:

    • file:一个 File类型的对象。返回值:在当前文件中的位置。
  • print()
    说明:输出数据到文件。要写入的文件应该已经被打开,且等待写入。语法:file. print(data)file. print(data,BASE)
    参数:

    • file:一个 File类型的对象。
    • data,要写入的数据(可以是类型char, byte ,int .long 或 String)。
    • BASE(可选),指定数据的输出形式:BIN(二进制);oCT(八进制);DEC(十进制);HEX(十六进制)。
      返回值;发送的字节数。
  • println()
    说明:输出数据到文件,并回车换行。语法:file. println(data)file,println(data,BASE)
    参数:

    • file:一个 File类型的对象。
    • data:要写入的数据(类型可以是char , byte , int , long或String)。
    • BASE(可选),指定数据的输出形式:BIN(二进制>;OCT(八进制);DECK十进制;HEX(十六进制)返回值;发送的宇节数。
  • seek()
    说明;跳转到指定位置。该位置必须在·到该文件大小之间。语法:file. seek( pos)
    参数:

    • file:一个 File类型的对象。pos,需要查找的位置。
      返回值: boolean型值,为 true表示跳转成功;为false表示跳转失败。
  • size()
    说明:获取文件的大小。语法:filue. size()
    参数:

    • file:一个File类型的对象。
      返回值:以字节为单位的文件大小。
  • read()
    说明:读取1B数据。语法:file.read参数:

    • file:一个 File类型的对象。
      返回值:下一个字节或者字符;如果没有可读数据,则返回一1。
  • write()
    说明;写入数据到文件。语法:file. write(data)file. write(buf,len)
    参数:

    • file:一个File类型的对象。
    • data:要写入的数据,类型可以是 byte ,char或字符串(char * ) 。buf,一个字符数组或者宁节数据。
    • len:buf数组的元素个数。
      返回值:发送的字节数。
  • isDirectory()
    说明:判断当前文件是否为目录。语法:file.isDirectory()
    参数:

    • file:一个File类型的对象。
      返回值: boolcan型值;为 true表示是目录;为 false表示不是目录。
  • openNextFile()
    说明:打开下一个文件。语法:file.openNextFile()
    参数:

  • file:一个 File类型的对象。
    返回值:下一个文件对应的对象。

  • rewindDirectory()
    说明:回到当前目录中的第一个文件。语法:file.rewindDirectory()
    参数:
    file,一个File类型的对象。返回值:无。

8.2 WiFi

**BK7252 **同时支持STA以及AP模式的WiFi连接。

  • STA 模式:BK7252 模块通过路由器连接互联网,手机或电脑通过互联网实现对设备的远程控制。
  • AP 模式:BK7252 模块作为热点,实现手机或电脑直接与模块通信,实现局域网无线控制。
  • STA+AP 模式:两种模式的共存模式,即可以通过互联网控制可实现无缝切换,方便操作。
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
HTTPClient http;
const char* ssid="";
const char* password="";
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 28800;
const int daylightOffset_sec = 0;
DynamicJsonDocument doc(1024);
DynamicJsonDocument doc1(1024);

void printLocalTime(){
 struct tm timeinfo;
 if(!getLocalTime(&timeinfo)){
   Serial.println("Failed to obtian time");
   return ;
 }
 Serial.println(&timeinfo,"%A, %B %d %Y %H:%M:%S");
}

void printLocalWeather(){
    http.begin("http://www.weather.com.cn/data/cityinfo/101270101.html");
    int httpCode = http.GET();
    if(httpCode == HTTP_CODE_OK){
      String pageData = http .getString();
      //Serial.println(pageData);
      deserializeJson(doc,pageData);
      JsonObject obj = doc.as<JsonObject>();
      String weatherInfo = obj["weatherinfo"];
      deserializeJson(doc1,weatherInfo);
      JsonObject obj1 = doc1.as<JsonObject>();
      String city = obj1["city"];
      String temp1 = obj1["temp1"];
      String temp2 = obj1["temp2"];
      String weather = obj1["weather"];
      String cityInfo ="地点:"+ city;
      String tempInfo =" 温度: " + temp1 + "~" + temp2;
      String cityWeatherinfo = " 天气状况: " + weather;
      Serial.println("获得天气情况如下:");
      printLocalTime();
      Serial.print(cityInfo);
      Serial.print(tempInfo);
      Serial.println(cityWeatherinfo);
    }else{
      Serial.println("GET ERR");
    }
    http.end();
}

void setup() {
Serial.begin(115200);
  Serial.printf("Connecting to %s",ssid);
  WiFi.begin(ssid,password);
  while(WiFi.status()!=WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }
  Serial.println(" CONNECTED");
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

 // printLocalWeather();  
}

void loop() {
  if(WiFi.status() == WL_CONNECTED){
    printLocalWeather();  
  }else{
    Serial.println("WiFi  Disconnect");
   }
}

说明:本Demo实现了通过WiFi功能获取网络时间以及通过访问国家气象局提供的http://www.weather.com.cn/datalcityinfo/101010100.html来获取天气情况,本接口中“101010100"为城市代码。
注意:该例程需要下载ArduinoJson库,下载方式如下图

结果

WiFiClass

  • begin()
    说明:开启WiFi并连接到指定的无线网络
  • status()
    说明:获取WiFi状态

HTTPClient

  • begin()
    说明:对传入网址信息参数进行解析
  • GET()
    说明:向服务器发送get请求
  • end()
    说明:结束本次连接

DynamicJsonDocument

  • deserializeJson()
    说明:解析Json
  • as()
    说明:获取顶节点,并把它转成T类型

什么是阿里云

阿里云IoT致力于实现万物互联的美好世界,为生态合作伙伴提供基于云端一体化、安全物联网基础平台等,在通过该平台高效连接,管理设备的同时,其开放能力使合作伙伴更高效、低成本地构建各种创新的物联网应用场景。
阿里云物联网平台为设备提供安全可靠的连接通信能力,向下连接海量设备,支撑设备数据采集上云;向上提供云端API,指令数据通过API调用下发至设备端,实现远程控制。
此外阿里云IoT还提供了丰富的开发服务,用户可以直接在该平台上搭建Web可视化、移动应用、服务开发等开发服务,这降低了物联网项目开发的难度,有了它,用户无需任何专业的开发技巧也可开发自己的项目。

智能灯光

图片

  • 所需元件

  • FireBeetle ESP32-E x1

  • FireBeetle Gravity IO扩展板 x1

  • 下载arduino阿里云库

  • 阿里云IOT库文件及样例代码

  • 在阿里云创建产品

    • 创建产品
    • 定义产品功能
    • 为产品添加设备
    • 导入产品
  • 烧录arduino程序

 #include <WiFi.h>
 #include <PubSubClient.h>
 #include <ArduinoJson.h>
 #include "DFRobot_Aliyun.h"
 #define BEDROOD_LIGHT  D2
 /*配置WIFI名和密码*/
 const char * WIFI_SSID     = "WIFI_SSID";
 const char * WIFI_PASSWORD = "WIFI_PASSWORD";

 /*配置设备证书信息*/
 String ProductKey = "you Product Key";
 String ClientId = "12345";/*自定义ID*/
 String DeviceName = "you Device Name";
 String DeviceSecret = "you Device Secret";

 /*配置域名和端口号*/
 String ALIYUN_SERVER = "iot-as-mqtt.cn-shanghai.aliyuncs.com";
 uint16_t PORT = 1883;

 /*需要操作的产品标识符*/
 String Identifier = "you Identifier";

 /*需要上报和订阅的两个TOPIC*/
 const char * subTopic = "you sub Topic";//****set
 const char * pubTopic = "you pub Topic";//******post

 DFRobot_Aliyun myAliyun;
 WiFiClient espClient;
 PubSubClient client(espClient);

 static void openLight(){
   digitalWrite(BEDROOD_LIGHT, HIGH);
 }

 static void closeLight(){
   digitalWrite(BEDROOD_LIGHT, LOW);
 }

 void connectWiFi(){
   Serial.print("Connecting to ");
   Serial.println(WIFI_SSID);
   WiFi.begin(WIFI_SSID,WIFI_PASSWORD);
   while(WiFi.status() != WL_CONNECTED){
     delay(500);
     Serial.print(".");
   }
   Serial.println();
   Serial.println("WiFi connected");
   Serial.print("IP Adderss: ");
   Serial.println(WiFi.localIP()); 
 }

 void callback(char * topic, byte * payload, unsigned int len){
   Serial.print("Recevice [");
   Serial.print(topic);
   Serial.print("] ");
   for (int i = 0; i < len; i++){
     Serial.print((char)payload[i]);
   }
   Serial.println();
   StaticJsonBuffer<300> jsonBuffer;
   JsonObject& root = jsonBuffer.parseObject((const char *)payload);
   if(!root.success()){
     Serial.println("parseObject() failed");
     return;
   }
   const uint16_t LightStatus = root["params"][Identifier];
   if(LightStatus == 1){
     openLight();
   }else{
     closeLight();
   }
   String tempMseg = "{\"id\":"+ClientId+",\"params\":{\""+Identifier+"\":"+(String)LightStatus+"},\"method\":\"thing.event.property.post\"}";
   char sendMseg[tempMseg.length()];
   strcpy(sendMseg,tempMseg.c_str());
   client.publish(pubTopic,sendMseg);
 }

 void ConnectAliyun(){
  while(!client.connected()){
    Serial.print("Attempting MQTT connection...");
    /*根据自动计算的用户名和密码连接到Alinyun的设备,不需要更改*/
    if(client.connect(myAliyun.client_id,myAliyun.username,myAliyun.password)){
      Serial.println("connected");
      client.subscribe(subTopic);
    }else{
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
 }
 void setup(){
  Serial.begin(115200);
  pinMode(BEDROOD_LIGHT,OUTPUT);
  
  /*连接WIFI*/
  connectWiFi();
  
  /*初始化Alinyun的配置,可自动计算用户名和密码*/
  myAliyun.init(ALIYUN_SERVER,ProductKey,ClientId,DeviceName,DeviceSecret);
  
  client.setServer(myAliyun.mqtt_server,PORT);
  
  /*设置回调函数,当收到订阅信息时会执行回调函数*/
  client.setCallback(callback);
  
  /*连接到Aliyun*/
  ConnectAliyun();
  
  /*开机先关灯*/
  closeLight();
  
  /*上报关灯信息*/
  client.publish(pubTopic,("{\"id\":"+ClientId+",\"params\": {\""+Identifier+"\":0},\"method\":\"thing.event.property.post\"}").c_str());
 }

 void loop(){
  if(!client.connected()){
    ConnectAliyun();
  }
  client.loop();
 }

11.IFTTT

什么是IFTTT

IFTTT是If This Then That的缩写,事实上是让你的网络行为能够引发连锁反应、让你使用更为方便,其宗旨是“Put the internet to work for you”(让互联网为你服务)。IFTTT旨在帮助人们利用各网站的开放API,监控用户设置的 Trigger,如果 Trigger 被触发则执行用户设置的 Action ,通常我们可以创建 N 个 Applet ,来满足我们的各种自动化需求。

数据邮件

  • 下载IFTTT库
  • IFTTT IOT库文件及样例代码
  • 配置IFTTT
    • 创建Trigger
    • 登录IFTTT,点击Create创建你的小程序。
    • 点击This创建输入Webhooks

    • 点击进入Webhooks,选择“Receive a web request”。
    • 然后创建我们的Event Name“message”,点击Create trigger完成“this”的设置。
    • 创建Action
    • 设置好触发“this”后,继续添加动作指令“that”
    • 点击“That”创建搜索并点击"Email",然后选择"Send me an email"。

    • 绑定接收邮件的Email,输入邮箱地址,点击"send PIN"。
    • 将邮箱中收到的验证码复制进来,然后点击“connect”
    • Email绑定成功后,就可以编辑邮件内容了,在"subject"中输入邮件主题,在"Body"中输入邮件内容,然后点击"Create action"完成创建。
    • 点击"Continue"后,进行Review,然后点击"Finish"完成创建。

    • 找到IFTTT_Key
    • 点击"My services"-"Webhooks"-"Documentation",在图示位置复制你的密钥




    • 烧录arduino程序
    • 打开内置的例程
	#include <WiFi.h>
	#include <HTTPClient.h>
	//Configure WiFi name and password
	char *WIFI_SSID           = "WIFI_SSID";
	char *WIFI_PASSWORD       = "WIFI_PASSWORD";
	//Configure IFTTT
	char *IFTTT_ENVENT        = "Your_Event";
	char *IFTTT_KEY           = "Your_Key";
	//IFTTT Send Message
	char *IFTTT_VALUE_1       = "Value1";
	char *IFTTT_VALUE_2       = "Value2";
	char *IFTTT_VALUE_3       = "Value3";
	HTTPClient ifttt;
	unsigned long lastTime = 0;
	unsigned long timerDelay = 10000;
	void setup() {
	Serial.begin(115200);
 	WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
 	Serial.println("Connecting");
	while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
	}
  	Serial.println("");
  	Serial.print("Wifi Connect Success");
	}
	void loop() {
  	//Send an HTTP POST request every 10 seconds
  	if ((millis() - lastTime) > timerDelay) {
    //Check WiFi connection status
    	if(WiFi.status()== WL_CONNECTED){
      		ifttt.IFTTTBeging(IFTTT_ENVENT,IFTTT_KEY);
      		int dataSendState = ifttt.IFTTTSend(IFTTT_VALUE_1,IFTTT_VALUE_2,IFTTT_VALUE_3);
       		Serial.println(dataSendState);//Whether the printing data is sent successfully
    		}else {
    		Serial.println("WiFi Disconnected");
    		}
    	lastTime = millis();
  		}
	}
 - 配置arduino程序中的参数
//Configure WiFi name and password
char *WIFI_SSID           = "WIFI_SSID";//输入WiFi名称
char *WIFI_PASSWORD       = "WIFI_PASSWORD";//输入WiFi密码
//Configure IFTTT
char *IFTTT_ENVENT        = "Your_Event";//输入事件名称
char *IFTTT_KEY           = "Your_Key";//输入IFTTT中找到的Key
//IFTTT Send Message
char *IFTTT_VALUE_1       = "Value1";
char *IFTTT_VALUE_2       = "Value2";
char *IFTTT_VALUE_3       = "Value3";//配置在邮件信息中的三个值
  • 结果
    在邮箱中收到由FireBeetle ESP32-E发出的数据

尺寸图

  • pin脚间距:2.54mm
  • 安装孔间距:
  • 安装孔尺寸:2mm
  • 主板尺寸:25.4.00mm×60.00mm
  • 板厚:1.6mm

常见问题

驱动安装

FireBeetle-ESP32采用CH340串口芯片,在绝大部分的设备中,都可以免驱使用。若您发现插上设备,驱动没有自动安装,也可以自行手动安装:点击下载CH340驱动程序
CH340_驱动安装

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。

更多