1397| 0
|
[ESP8266/ESP32] 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 * * @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) * @licence The MIT License (MIT) * @author [Ivey](Ivey.lu@dfrobot.com) * @maintainer [Fary](feng.yang@dfrobot.com) * @version V1.0 * @maintainer [Fary](feng.yang@dfrobot.com) * @version V1.0 * @date 2019-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 *@param Just connect the CS pin (pins are optional) *@param Just connect the DC pin (pins are optional) * */ #if defined ARDUINO_SAM_ZERO #define OLED_DC 7 #define OLED_CS 5 #define OLED_RST 6 /*ESP32 */ #elif defined(ESP32) #define OLED_DC D2 #define OLED_CS D6 #define OLED_RST D3 /*ESP8266*/ #elif defined(ESP8266) #define OLED_DC D4 #define OLED_CS D6 #define OLED_RST D5 /*AVR series board*/ #else #define OLED_DC 2 #define OLED_CS 3 #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[4][3] = {{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[0][0], tetrahedron[0][2]), OxyzToOv(tetrahedron[0][1], tetrahedron[0][2]), OxyzToOu(tetrahedron[1][0], tetrahedron[1][2]), OxyzToOv(tetrahedron[1][1], tetrahedron[1][2])); u8g2.drawLine(OxyzToOu(tetrahedron[1][0], tetrahedron[1][2]), OxyzToOv(tetrahedron[1][1], tetrahedron[1][2]), OxyzToOu(tetrahedron[2][0], tetrahedron[2][2]), OxyzToOv(tetrahedron[2][1], tetrahedron[2][2])); u8g2.drawLine(OxyzToOu(tetrahedron[0][0], tetrahedron[0][2]), OxyzToOv(tetrahedron[0][1], tetrahedron[0][2]), OxyzToOu(tetrahedron[2][0], tetrahedron[2][2]), OxyzToOv(tetrahedron[2][1], tetrahedron[2][2])); u8g2.drawLine(OxyzToOu(tetrahedron[0][0], tetrahedron[0][2]), OxyzToOv(tetrahedron[0][1], tetrahedron[0][2]), OxyzToOu(tetrahedron[3][0], tetrahedron[3][2]), OxyzToOv(tetrahedron[3][1], tetrahedron[3][2])); u8g2.drawLine(OxyzToOu(tetrahedron[1][0], tetrahedron[1][2]), OxyzToOv(tetrahedron[1][1], tetrahedron[1][2]), OxyzToOu(tetrahedron[3][0], tetrahedron[3][2]), OxyzToOv(tetrahedron[3][1], tetrahedron[3][2])); u8g2.drawLine(OxyzToOu(tetrahedron[2][0], tetrahedron[2][2]), OxyzToOv(tetrahedron[2][1], tetrahedron[2][2]), OxyzToOu(tetrahedron[3][0], tetrahedron[3][2]), OxyzToOv(tetrahedron[3][1], tetrahedron[3][2])); // 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); } /*! * @brief Rotate the coordinates of all points of the entire 3D graphic around the Z axis * @param angle 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[0] * cosa) - (tetrahedron[1] * sina); Yn = (tetrahedron[0] * sina) + (tetrahedron[1] * 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[0] = Xn; tetrahedron[1] = Yn; } } 视频: 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[512]; 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板子里面的一些设置按下图: |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed