Anders项勇 发表于 2023-9-6 23:20:37

FireBeetle 2 ESP32-S3 测试1--连接透明显示屏、测试摄像头

本帖最后由 Anders项勇 于 2023-9-6 23:24 编辑

这次幸运抽取到试用FireBeetle 2 ESP32-S3,先测试其基本功能:
1.arduino环境:
arduino先安装ESP32-S3板子,但是连接国外网络原因,经常安装经常容易失败,可以按后面这个方法安装会快很多https://arduino.me/a/esp32
2.连接摄像头、1.51”透明单色OLED显示屏:
这么小的板子能同时连接摄像头和显示屏是不错的,头一次用1.51”透明单色OLED显示屏,显示效果不错。屏幕要安装U8g2_Arduino库文件。
测试当中有时会碰到“上传失败: 上传错误:exit status 2”,只要按下boot键,然后再重新上传就好了。有时刷程序报端口错误,看设备管理器里面端口一下接通一下不通,比较奇怪,换一根数据线好了,然后在换回原来数据线又好了,不知道何原因。

案例测试代码:/*!
* @file Cube.ino
* @brief Rotating 3D stereoscopic graphics
* @n This is a simple rotating tetrahexon
*
* @copyrightCopyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
* @licence   The MIT License (MIT)
* @author (Ivey.lu@dfrobot.com)
* @maintainer (feng.yang@dfrobot.com)
* @versionV1.0
* @maintainer (feng.yang@dfrobot.com)
* @versionV1.0
* @date2019-10-15
* @url https://github.com/DFRobot/U8g2_Arduino
*/


#include <Arduino.h>
#include <U8g2lib.h>


#include <SPI.h>




/*
* Display hardware IIC interface constructor
*@param rotation:U8G2_R0 Not rotate, horizontally, draw direction from left to right
         U8G2_R1 Rotate clockwise 90 degrees, drawing direction from top to bottom
         U8G2_R2 Rotate 180 degrees clockwise, drawing in right-to-left directions
         U8G2_R3 Rotate clockwise 270 degrees, drawing direction from bottom to top
         U8G2_MIRROR Normal display of mirror content (v2.6.x version used above)
         Note: U8G2_MIRROR need to be used with setFlipMode().
*@param reset:U8x8_PIN_NONE Indicates that the pin is empty and no reset pin is used
* Display hardware SPI interface constructor
*@paramJust connect the CS pin (pins are optional)
*@paramJust connect the DC pin (pins are optional)
*
*/
#if defined ARDUINO_SAM_ZERO
#define OLED_DC7
#define OLED_CS5
#define OLED_RST 6
/*ESP32 */
#elif defined(ESP32)
#define OLED_DCD2
#define OLED_CSD6
#define OLED_RST D3
/*ESP8266*/
#elif defined(ESP8266)
#define OLED_DCD4
#define OLED_CSD6
#define OLED_RST D5
/*AVR series board*/
#else
#define OLED_DC2
#define OLED_CS3
#define OLED_RST 4
#endif
U8G2_SSD1309_128X64_NONAME2_1_4W_HW_SPI u8g2(/* rotation=*/U8G2_R0, /* cs=*/ OLED_CS, /* dc=*/ OLED_DC,/* reset=*/OLED_RST);




//2D array: The coordinates of all vertices of the tetrahesome are stored
double tetrahedron = {{0,20,-20},{-20,-20,-20},{20,-20,-20},{0,0,20}};
void setup(void) {
u8g2.begin();
}


void loop(void) {
/*
       * firstPage will change the current page number position to 0
       * When modifications are between firstpage and nextPage, they will be re-rendered at each time.
       * This method consumes less ram space than sendBuffer
   */
u8g2.firstPage();
do {
//Connect the corresponding points inside the tetrahethal together
u8g2.drawLine(OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron), OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron));
u8g2.drawLine(OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron), OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron));
u8g2.drawLine(OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron), OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron));
u8g2.drawLine(OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron), OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron));
u8g2.drawLine(OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron), OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron));
u8g2.drawLine(OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron), OxyzToOu(tetrahedron, tetrahedron), OxyzToOv(tetrahedron, tetrahedron));
// Rotate 0.1°
rotate(0.1);


} while ( u8g2.nextPage() );
//delay(50);
}
/*!
* @brief Convert xz in the three-dimensional coordinate system Oxyz
* into the u coordinate inside the two-dimensional coordinate system Ouv
* @param x in Oxyz
* @param z in Oxyz
* @return u in Ouv
*/
int OxyzToOu(double x,double z){


   return (int)((x + 64) - z*0.35);
}




/*!
* @brief Convert the yz in the three-dimensional coordinate system Oxyz into the v coordinate inside
* the two-dimensional coordinate system Ouv
* @param y in Oxyz
* @param z in Oxyz
* @return v in Ouv
*/
int OxyzToOv(double y,double z){
    return (int)((y + 26) - z*0.35);
}




/*!
* @briefRotate the coordinates of all points of the entire 3D graphic around the Z axis
* @paramangle represents the angle to rotate
*   
*z rotation (z unchanged)
    x3 = x2 * cosb - y1 * sinb
    y3 = y1 * cosb + x2 * sinb
    z3 = z2
*/
void rotate(double angle)
{
double rad, cosa, sina, Xn, Yn;


rad = angle * PI / 180;
cosa = cos(rad);
sina = sin(rad);
for (int i = 0; i < 4; i++)
{
    Xn = (tetrahedron * cosa) - (tetrahedron * sina);
    Yn = (tetrahedron * sina) + (tetrahedron * cosa);


    //Store converted coordinates into an array of coordinates
    //Because it rotates around the Z-axis, the coordinates of the point z-axis remain unchanged
    tetrahedron = Xn;
    tetrahedron = Yn;
}
}


视频:
https://v.qq.com/x/page/e35303y9q8m.html
3.测试摄像头:
在arduino IDE中选择File->Examples->ESP32->Camera->CameraWebServer示例,使用下面的代码替换CameraWebServer中的代码
/* Connect the SD card to the following pins:
* SD Card | ESP32
*    MISO    MISO
*    SCK   SCK   
*    ss      D6
*    MOSI    MOSI
*    GND   GND
*    +5V   VCC
*/
#include "FS.h"
#include "SD.h"
#include "SPI.h"


void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
    Serial.printf("Listing directory: %s\n", dirname);


    File root = fs.open(dirname);
    if(!root){
      Serial.println("Failed to open directory");
      return;
    }
    if(!root.isDirectory()){
      Serial.println("Not a directory");
      return;
    }


    File file = root.openNextFile();
    while(file){
      if(file.isDirectory()){
            Serial.print("DIR : ");
            Serial.println(file.name());
            if(levels){
                listDir(fs, file.path(), levels -1);
            }
      } else {
            Serial.print("FILE: ");
            Serial.print(file.name());
            Serial.print("SIZE: ");
            Serial.println(file.size());
      }
      file = root.openNextFile();
    }
}


void createDir(fs::FS &fs, const char * path){
    Serial.printf("Creating Dir: %s\n", path);
    if(fs.mkdir(path)){
      Serial.println("Dir created");
    } else {
      Serial.println("mkdir failed");
    }
}


void removeDir(fs::FS &fs, const char * path){
    Serial.printf("Removing Dir: %s\n", path);
    if(fs.rmdir(path)){
      Serial.println("Dir removed");
    } else {
      Serial.println("rmdir failed");
    }
}


void readFile(fs::FS &fs, const char * path){
    Serial.printf("Reading file: %s\n", path);


    File file = fs.open(path);
    if(!file){
      Serial.println("Failed to open file for reading");
      return;
    }


    Serial.print("Read from file: ");
    while(file.available()){
      Serial.write(file.read());
    }
    file.close();
}


void writeFile(fs::FS &fs, const char * path, const char * message){
    Serial.printf("Writing file: %s\n", path);


    File file = fs.open(path, FILE_WRITE);
    if(!file){
      Serial.println("Failed to open file for writing");
      return;
    }
    if(file.print(message)){
      Serial.println("File written");
    } else {
      Serial.println("Write failed");
    }
    file.close();
}


void appendFile(fs::FS &fs, const char * path, const char * message){
    Serial.printf("Appending to file: %s\n", path);


    File file = fs.open(path, FILE_APPEND);
    if(!file){
      Serial.println("Failed to open file for appending");
      return;
    }
    if(file.print(message)){
      Serial.println("Message appended");
    } else {
      Serial.println("Append failed");
    }
    file.close();
}


void renameFile(fs::FS &fs, const char * path1, const char * path2){
    Serial.printf("Renaming file %s to %s\n", path1, path2);
    if (fs.rename(path1, path2)) {
      Serial.println("File renamed");
    } else {
      Serial.println("Rename failed");
    }
}


void deleteFile(fs::FS &fs, const char * path){
    Serial.printf("Deleting file: %s\n", path);
    if(fs.remove(path)){
      Serial.println("File deleted");
    } else {
      Serial.println("Delete failed");
    }
}


void testFileIO(fs::FS &fs, const char * path){
    File file = fs.open(path);
    static uint8_t buf;
    size_t len = 0;
    uint32_t start = millis();
    uint32_t end = start;
    if(file){
      len = file.size();
      size_t flen = len;
      start = millis();
      while(len){
            size_t toRead = len;
            if(toRead > 512){
                toRead = 512;
            }
            file.read(buf, toRead);
            len -= toRead;
      }
      end = millis() - start;
      Serial.printf("%u bytes read for %u ms\n", flen, end);
      file.close();
    } else {
      Serial.println("Failed to open file for reading");
    }




    file = fs.open(path, FILE_WRITE);
    if(!file){
      Serial.println("Failed to open file for writing");
      return;
    }


    size_t i;
    start = millis();
    for(i=0; i<2048; i++){
      file.write(buf, 512);
    }
    end = millis() - start;
    Serial.printf("%u bytes written for %u ms\n", 2048 * 512, end);
    file.close();
}


void setup(){
    Serial.begin(115200);
    if(!SD.begin()){
      Serial.println("Card Mount Failed");
      return;
    }
    uint8_t cardType = SD.cardType();


    if(cardType == CARD_NONE){
      Serial.println("No SD card attached");
      return;
    }


    Serial.print("SD Card Type: ");
    if(cardType == CARD_MMC){
      Serial.println("MMC");
    } else if(cardType == CARD_SD){
      Serial.println("SDSC");
    } else if(cardType == CARD_SDHC){
      Serial.println("SDHC");
    } else {
      Serial.println("UNKNOWN");
    }


    uint64_t cardSize = SD.cardSize() / (1024 * 1024);
    Serial.printf("SD Card Size: %lluMB\n", cardSize);


    listDir(SD, "/", 0);
    createDir(SD, "/mydir");
    listDir(SD, "/", 0);
    removeDir(SD, "/mydir");
    listDir(SD, "/", 2);
    writeFile(SD, "/hello.txt", "Hello ");
    appendFile(SD, "/hello.txt", "World!\n");
    readFile(SD, "/hello.txt");
    deleteFile(SD, "/foo.txt");
    renameFile(SD, "/hello.txt", "/foo.txt");
    readFile(SD, "/foo.txt");
    testFileIO(SD, "/test.txt");
    Serial.printf("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024));
    Serial.printf("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024));
}


void loop(){


}
wifi信息改掉,烧录程序。打开串口,查看IP,在浏览器输入ip,就可以看到摄像头画面


注意arduino板子里面的一些设置按下图:






页: [1]
查看完整版本: FireBeetle 2 ESP32-S3 测试1--连接透明显示屏、测试摄像头