当前位置:网站首页>Ambient light and micro distance detection system based on stm32f1
Ambient light and micro distance detection system based on stm32f1
2022-06-30 18:59:00 【Hua Weiyun】
Ambient light and distance detection
One 、 Project requirements
1. Development board : STM32F103ZET6 Development board
2. Project requirement :
(1). When the ambient light intensity reaches a certain value , Buzzer alarm prompt ;
(2). When the distance sensor detects that there is a block before a certain distance, it will start to alarm constantly ;
(3). Design Android mobile phone APP, Display ambient light information .
(4). WIFI Using a punctual atom ESP8266 modular ,WIFI This side is set to AP Pattern , establish TCP The server , Mobile connection ESP8266 Of WIFI, Open mobile phone APP Connect WIFI Created TCP The server , receive WIFI The transmitted light intensity is displayed in real time .
(5). OLED display Real time display of ambient light and distance sensor values , Press the key to switch the display page
Two 、Android mobile phone APP Compilation instructions
Android mobile phone APP use C++ And QT framework design .
Core code :
#include "widget.h"#include "ui_widget.h"Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget){ ui->setupUi(this); this->setWindowTitle(" Ambient light display "); SetStyle(":/CarControl.qss"); /*1. Instantiation QNetworkAccessManager*/ manager = new QNetworkAccessManager(this); // Set up and open the database if (QSqlDatabase::contains(LOG_IN_DATABASE_CONNECT_NAME)) { database = QSqlDatabase::database(LOG_IN_DATABASE_CONNECT_NAME); } else { // Database type database = QSqlDatabase::addDatabase("QSQLITE",LOG_IN_DATABASE_CONNECT_NAME); database.setDatabaseName(LOG_IN_DATABASE_NAME); // Database name database.setUserName("xl"); // user name database.setPassword("123456"); // password } // Open database , Open the database if it exists , Create automatically if it doesn't exist if(database.open()==false) { Log_Text_Display(" Database open failed . Please check the program running path and permissions .\n"); } else { Log_Text_Display(" Successfully connected to database .\n"); } // database : Build table , If it exists, it is not created , Create... If it doesn't exist QSqlQuery sql_query(database); // The query name of the following statement is CarData Whether the table exists . sql_query.exec(QString("select count(*) from sqlite_master where type='table' and name='%1'").arg("CarData")); if(sql_query.next()) { if(sql_query.value(0).toInt()==0) { Log_Text_Display(" Database tables do not exist . Ready to create .\n"); // Create a table Create a table statement :create table <table_name> (f1 type1, f2 type2,…); /* CREATE TABLE Is a keyword that tells the database system to create a new table . * CREATE TABLE Statement followed by the unique name of the table * Or identification */ /* The following statement : Create a name CarData Table of , The fields are respectively stored Time 、 temperature 、 humidity 、 longitude 、 latitude */ QString create_sql = "create table CarData(id int primary key, time varchar(100),light varchar(100))"; sql_query.prepare(create_sql); if(!sql_query.exec()) { Log_Text_Display(" Database table creation failed .\n"); } else { Log_Text_Display(" Database table created successfully .\n"); } } else { Log_Text_Display(" Database tables exist . No need to create .\n"); } } ui->stackedWidget->setCurrentIndex(0);}Widget::~Widget(){ delete ui;}// Set the specified style void Widget::SetStyle(const QString &qssFile) { QFile file(qssFile); if (file.open(QFile::ReadOnly)) { QString qss = QLatin1String(file.readAll()); qApp->setStyleSheet(qss); QString PaletteColor = qss.mid(20, 7); qApp->setPalette(QPalette(QColor(PaletteColor))); file.close(); }}/* engineering : SmartHome date : 2021-04-26 author : DS Brother Bruce Lee's environment : win10 QT5.12.6 MinGW32 function : The log shows */void Widget::Log_Text_Display(QString text){ QPlainTextEdit *plainTextEdit_log=ui->plainTextEdit_log; // Set the cursor to the end of the text plainTextEdit_log->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); // When the number of text exceeds a certain range, it is cleared if(plainTextEdit_log->toPlainText().size()>1024*4) { plainTextEdit_log->clear(); } plainTextEdit_log->insertPlainText(text); // Move the scroll bar to the bottom QScrollBar *scrollbar = plainTextEdit_log->verticalScrollBar(); if(scrollbar) { scrollbar->setSliderPosition(scrollbar->maximum()); }}/* engineering : CarControl date : 2021-04-27 author : DS Brother Bruce Lee's environment : win10 QT5.12.6 MinGW32 function : Connect to server */void Widget::on_pushButton_connect_clicked(){ if(ui->pushButton_connect->text()==" Connect "){ // Start connecting to server NewClinet(); } else { if(LocalTcpClientSocket) { LocalTcpClientSocket->close(); } }}// Client mode : Create client void Widget::NewClinet(){ if(LocalTcpClientSocket) { LocalTcpClientSocket->close(); delete LocalTcpClientSocket; LocalTcpClientSocket=nullptr; } /*1. Create a local client TCP Socket */ LocalTcpClientSocket = new QTcpSocket; /*2. Setup server IP Address */ QString Ipaddr=ui->lineEdit_ip->text(); QHostAddress FarServerAddr(Ipaddr); /*3. Connect the signal slot of the client */ connect(LocalTcpClientSocket,SIGNAL(connected()),this,SLOT(LocalTcpClientConnectedSlot())); connect(LocalTcpClientSocket,SIGNAL(disconnected()),this,SLOT(LocalTcpClientDisconnectedSlot())); connect(LocalTcpClientSocket,SIGNAL(readyRead()),this,SLOT(LocalTcpClientReadDtatSlot())); /*4. Try connecting to the server host */ int prot=ui->lineEdit_port->text().toInt(); LocalTcpClientSocket->connectToHost(FarServerAddr,prot);}// Client mode : Respond to actions after connecting to the server void Widget::LocalTcpClientConnectedSlot(){ ui->pushButton_connect->setText(" To break off "); Log_Text_Display(" Successfully connected to the server ...\n");}// Client mode : Disconnect the server void Widget::LocalTcpClientDisconnectedSlot(){ ui->pushButton_connect->setText(" Connect "); Log_Text_Display(" Disconnect from the server ...\n");}// Client mode : Read the data sent by the server // Temperature and humidity : #123.66void Widget::LocalTcpClientReadDtatSlot(){ QString array=LocalTcpClientSocket->readAll(); QDateTime time = QDateTime::currentDateTime(); // Get the current time of the system QString time_str = time.toString("yyyy-MM-dd hh:mm:ss"); // Set the display format QString text; text +=array; text +="\n"; Log_Text_Display(text); // Parsing data if(array.at(0)=='#') { array.remove('#'); QString T_str=array; ui->label_light->setFont(QFont("Times", 60, QFont::Bold)); ui->label_light->setAlignment(Qt::AlignHCenter); // Horizontal center ui->label_light->setText(T_str+"%"); // Save data to database QSqlQuery sql_query(database); // The most inquired ID QString select_max_sql = "select max(id) from CarData"; int max_id = 0; sql_query.prepare(select_max_sql); if(!sql_query.exec()) { Log_Text_Display(" Database maximum ID To find the failure .\n"); } else { while(sql_query.next()) { max_id = sql_query.value(0).toInt(); } Log_Text_Display(QString("data base max id:%1\n").arg(max_id)); // Add data // insert data Insert statement :insert into <table_name> values (value1, value2,…); QString insert_sql = tr("insert into CarData values(?,?,?)"); sql_query.prepare(insert_sql); sql_query.addBindValue(max_id+1); //id sql_query.addBindValue(time_str); // Time sql_query.addBindValue(T_str); // The ambient light if(!sql_query.exec()) { Log_Text_Display(" Data insertion failed .\n"); } } }}/* engineering : AmbientLightDisplay date : 2021-05-03 author : DS Brother Bruce Lee's environment : win10 QT5.12.6 MinGW32 function : Historical ambient page */void Widget::on_pushButton_history_clicked(){ ui->stackedWidget->setCurrentIndex(1);}/* engineering : AmbientLightDisplay date : 2021-05-03 author : DS Brother Bruce Lee's environment : win10 QT5.12.6 MinGW32 function : Current ambient page */void Widget::on_pushButton_current_clicked(){ ui->stackedWidget->setCurrentIndex(0);}/* engineering : AmbientLightDisplay date : 2021-05-03 author : DS Brother Bruce Lee's environment : win10 QT5.12.6 MinGW32 function : Delete all */void Widget::on_pushButton_del_all_clicked(){ QString cmd; cmd = QString("delete from CarData"); QSqlQuery sql_query(database); if(!sql_query.exec(cmd)) { Log_Text_Display("delete table Error.\n"); }}/* engineering : AmbientLightDisplay date : 2021-05-03 author : DS Brother Bruce Lee's environment : win10 QT5.12.6 MinGW32 function : Look at historical data */void Widget::on_pushButton_ViewHistory_clicked(){ // Specify the database for the operation QSqlQuery sql_query(database); // Query all data sql_query.prepare("select * from CarData"); if(!sql_query.exec()) { Log_Text_Display(" Database query error .\n"); } else { while(sql_query.next()) { // int id = sql_query.value(0).toInt(); //ID QString time = sql_query.value(1).toString(); // Time QString T_str = sql_query.value(2).toString(); // light QString show_text=QString("%1,%2%\n").arg(time).arg(T_str); QPlainTextEdit *plainTextEdit_log=ui->plainTextEdit_log; // Set the cursor to the end of the text plainTextEdit_log->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); plainTextEdit_log->insertPlainText(show_text); // Move the scroll bar to the bottom QScrollBar *scrollbar = plainTextEdit_log->verticalScrollBar(); if(scrollbar) { scrollbar->setSliderPosition(scrollbar->maximum()); } } }}
3、 ... and 、Android mobile phone APP effect
Four 、 Introduction to required hardware
4.1 STM32F103ZET6 Development board
STM32 Series is designed for high performance 、 Low cost 、 Low power embedded application design ARM Cortex-M0,M0+,M3, M4 and M7 kernel (ST's product portfolio contains a comprehensive range of microcontrollers, from robust, low-cost 8-bit MCUs up to 32-bit ARM-based Cortex-M0 and M0+, Cortex-M3, Cortex-M4 Flash microcontrollers with a great choice of peripherals. ST has also extended this range to include an ultra-low-power MCU platform) [1] .
It is divided into different products according to the kernel architecture :
Mainstream products (STM32F0、STM32F1、STM32F3)、 Ultra low power products (STM32L0、STM32L1、STM32L4、STM32L4+)、 High performance products (STM32F2、STM32F4、STM32F7、STM32H7)
4.2 0.96 " OLED display —SPI Interface
OLED The display screen is made of electromechanical self light emitting diodes . Due to the self luminous organic electroluminescent diode at the same time , No backlight 、 High contrast 、 Thin 、 A wide range of perspectives 、 Quick reaction 、 Can be used for flexible panels 、 It has a wide temperature range 、 Excellent properties such as simple structure and process , It is considered to be the next generation of flat panel display emerging application technology .
4.3 Ambient light sensor
This kind of BH1750 The ambient light sensor is built-in 16 Bit analog-to-digital converter , It can directly output a digital signal , No more complicated calculations are needed . This is a more sophisticated and easy to use version of a simple resistor , By calculating the voltage , To get valid data . This ambient light sensor can be directly measured by photometer . The unit of light intensity is lumen "lx". When an object is illuminated in uniform light, it can obtain... Per square meter 1lx Luminous flux of , Their light intensity is 1lx. Sometimes in order to make full use of the light source , You can add a light source reflector . In that way, more luminous flux can be obtained in some directions , To increase the brightness of the illuminated surface .
application
This sensor mainly measures light intensity :
Car headlights
Flashlight
Photographic lighting
Portable game console
Digital camera
Adjust the phone LCD Backlight in the screen and key area, etc
technical specifications
Supply voltage :+3-5V
Interface :I2C
Range and accuracy :1~65535 lx
You can choose I2C Two forms of address
Small measurement changes (+/-20%)
Size :0.85x0.63x0.13"(21x16x3.3mm)
Brightness data reference :
evening : 0.001-0.02;
moonlit night : 0.02-0.3;
Cloudy indoor : 5-50;
Cloudy outdoor : 50-500;
Sunny day indoor : 100-1000;
At noon in summer : about 10*6 energy ;
Illumination when reading books : 50-60;
Standard illumination of home video :1400
4.4 ESP8266 A serial port WIFI
ESP8266 Is a serial port WiFi modular , Internal integration MCU It can realize the same communication between the serial ports of single-chip computers ; This module is easy to learn , Small volume , Easy for embedded development .
According to the schematic diagram , Connect the modules to the development board , By configuring the serial port of the development board, you can send ESP8366 Write instructions , Different working modes of configuration module ; It can also be used directly USB turn TTL Module connection , Send the corresponding instructions through the serial assistant , You can also configure ESP8266 Information and working mode of , Of course, you can also read product information .
ESP8266 Module we can understand as a single chip with WiFi function , When we use our own microcontroller for control , Just let the two microcontrollers communicate with each other , The same instruction , Perform the corresponding operation --------- You have to know what the instructions are , After we know the format, we can read out the correct information and send instructions ESP8266 The module can correctly identify , Only in this way can we get the data we want and realize the corresponding functions .
Stable performance :ESP8266EX Wide operating temperature range , And can maintain stable performance , Can adapt to various operating environments .
Highly integrated :ESP8266EX Integrated 32 position Tensilica processor 、 Standard digital peripheral interface 、 Antenna switch 、 radio frequency balun、 power amplifier 、 Low noise amplifier 、 Filter and power management module, etc , Only a few peripheral circuits are needed , Can be occupied by PCB Space reduction .
low power consumption :ESP8266EX Designed for mobile devices 、 Designed for wearable electronics and Internet of things applications , Through a number of proprietary technologies to achieve ultra-low power consumption .ESP8266EX The power-saving mode is suitable for various low-power application scenarios .
32 position Tensilica processor :ESP8266EX Built in ultra low power consumption Tensilica L106 32 position RISC processor ,CPU The clock speed is up to 160 MHz, Support real time operating system (RTOS) and Wi-Fi Protocol stack , Can be as high as 80% The processing power is left to application programming and development .
4.5 Active buzzer
Active buzzer is an electronic buzzer with integrated structure , Using DC voltage supply , It's widely used in computers 、 The printer 、 The photocopier 、 a burglar alarm 、 electronic toy 、 Automotive electronics 、 telephone 、 Timers and other electronic products as voice components . The buzzer is mainly divided into two types: piezoelectric buzzer and electromagnetic buzzer . The buzzer uses letters in the circuit “H” or “HA”( Old standard “FM”、“LB”、“JD” etc. ) Express .
A simple method to distinguish active buzzer from passive buzzer
The fundamental difference between active buzzer and passive buzzer is that the product requires different input signals ; The ideal signal of active buzzer is DC , Usually marked as VDC、VDD etc. . Because there is a simple oscillation circuit inside the buzzer , It can convert constant direct current into pulse signal of a certain frequency , So as to realize the alternating magnetic field , Drive the aluminum plate to vibrate . However, some active Buzzers can also work under certain AC signals , It only requires high voltage and frequency of AC signal , This kind of working mode generally does not adopt .
The passive buzzer has no internal drive circuit , Some companies and factories are called loudspeakers , It is called a sounder in the national standard . The ideal signal square wave of passive buzzer . If a DC signal is given, the buzzer does not respond , Because the magnetic circuit is constant , The molybdenum sheet cannot vibrate .
4.6 ATK-VL53L0X Laser ranging module
VL53L0X It is based on the Italian French semiconductor patent FlightSense Technology of the second generation laser ranging sensor .
VL53L0X Fully integrated and embedded with a laser sensor for human safety , Advanced filter and ultrafast photon detection array .
It can pass fast 、 accuracy 、 Reliable solutions for longer distance measurements , Open the door for new applications , Further refined ST FlightSense Product line .
The main advantage :
[1] Less than 30ms Can provide the longest 2 Read the absolute distance of meters ( Unit is mm)
[2] Fast mode :50 Hz Fast ranging operation
[3] High precision
[4] low power consumption
[5] 4.4×2.4×1 mm Reflow package
[6] Advanced design of ambient light suppression
[7] use 940nm Invisible light
[8] Optical cover support is required
Target application :
[1] Camera assisted ( Ultra fast auto focus and depth of field )
[2] Smart phone or laptop energy-saving detection
[3] Gesture control
[4] Unmanned aerial vehicle (uav)
[5] Robotics and industrial control
[6] IoT
[7] Household appliances
technology
VL53L0X The inclusion is based on a SPAD( Single photon avalanche diode ) The sensors are displayed and one that conforms to the first-class safety regulations of the human body VCSEL( Vertical cavity surface emitting lasers ) Integration of 940nm The light source , When used with algorithms running on embedded microcontrollers , The distance of the target object in mm can be directly determined , Even in challenging working conditions , And it has nothing to do with the target reflectivity .VL53L0X Adopt an ultra-low power system architecture , Ideal for wireless and IoT application .VL53L0X Complete documentation package , Such as source code and software API( Application programming interface ), It is compatible with the microcontrollers and processors of GF .
Module design
By virtue of it 4.4×2.4×1 mm Small size and reflow soldering compatibility ,VL53L0X Easy to integrate into the main product PCB Or on a soft board , It can be hidden under various cover materials . at present VL53L0X Is the only integrated 940nm wavelength VCSEL Products , Is invisible light , It is not easily affected by the background lighting .
System diagram
5、 ... and 、 Device code
5.1 STM32 Module wiring instructions
The wiring instructions are in main It's already written in the function , Follow .
Be careful : Because there are many external modules , clear The marked power interface may not be enough , But the development board has a row of connections LCD Of IO mouth And a row Jlink Interface of downloader , Inside all There are power supply pins , Just find the pin wiring of the power supply according to the schematic diagram .
5.2 Equipment operation effect
APP Yes Android Mobile version and Windows System version , I'm going to use Windows Test version ,Android It's the same effect .
1. Connect all module wires , Make sure there are no problems ( Don't connect the power supply incorrectly , Wiring is clearly visible ).
2. compiler , Again Download program to device .
3. Open the serial port to see if the program initialization is normal .
The correct print information is as follows : The server IP The address is 192.168.4.1
At the moment OLED The measured distance and current light intensity can be seen on the small screen .
4. Turn on your computer or mobile phone WIFI Search for ESP8266 The hot Connect
then APP The received ambient light information will be displayed on the .
Pay attention :IP The address should be changed to 192.168.4.1 Port number : 8080
If you run for a period of time and find that the ambient light is not updated , Just disconnect the server and connect again .
5.3 STM32 Of mian.c Code
#include "stm32f10x.h"#include "led.h"#include "delay.h"#include "key.h"#include "usart.h"#include <string.h>#include "timer.h"#include "esp8266.h"#include "oled.h"#include "fontdata.h"#include "bh1750.h"#include "iic.h"#include "vl53l0x.h"/* Hardware connection mode :ESP8266 A serial port WIFI modular :PB10--RXD Module receiving pin PB11--TXD Module sending pin GND---GND The earth VCC---VCC Power Supply (3.3V~5.0V)OLED Display wiring :D0----SCK-----PB14D1----MOSI----PB13RES— Reset ( Low level active )—PB12DC--- Data and command control pins —PB1CS--- Chip selection pin -----PA7GND---GND The earth VCC---VCC Power Supply (3.3V) Buzzer : PA6 ( High level response )GND---GND The earth VCC---VCC Power Supply (5.0V)IO----PA6BH1750 Ambient light detection module :SDA-----PB7SCL-----PB6GND---GND The earth VCC---VCC Power Supply (3.3V~5.0V)ATK-VL53L0X Laser ranging module :XSH----PA15INT---- Break the foot ( Not used )SCL---PC11SDA---PC10GND---GND The earth VCC---VCC Power Supply (3.3V~5.0V) Onboard equipment :LED Hardware connection : PB5 PE5KEY Hardware connection :PE3 PE4*/#define ESP8266_WIFI_AP_SSID "ESP8266_STM32" // Created hotspot name -- Do not appear in Chinese 、 Special characters such as spaces #define ESP8266_AP_PASSWORD "12345678" // Create a new hotspot password char esp8266_message[200];// Upload data buffer char OLED_ShowBuff[100];u8 ESP8266_Stat=0;/* The functionality : Displays the light intensity 、 Measuring distance */void ShowLightDistance(float light,vu16 distance){ sprintf(OLED_ShowBuff,"L: %.2f%%",light); OLED_ShowString(20,16*1,16,OLED_ShowBuff); sprintf(OLED_ShowBuff,"D: %dMM",distance); OLED_ShowString(20,16*2,16,OLED_ShowBuff); }/* The functionality : ESP8266 Display page */void ESP8266_ShowPageTable(void){ if(ESP8266_Stat)OLED_ShowString(0,16*0,16,"WIFI STAT:ERROR"); else OLED_ShowString(0,16*0,16,"WIFI STAT:OK"); // display string sprintf((char*)OLED_ShowBuff,"%s",ESP8266_WIFI_AP_SSID); OLED_ShowString(0,16*1,16,OLED_ShowBuff); sprintf((char*)OLED_ShowBuff,"%s",ESP8266_AP_PASSWORD); OLED_ShowString(0,16*2,16,OLED_ShowBuff); }int main(){ u32 time_cnt=0; u8 key; u8 page=0; float light=0; // The ambient light vu16 Distance_data=0;// distance delay_ms(1000); delay_ms(1000); LED_Init(); KEY_Init(); IIC_Init(); BEEP_Init(); // Distance sensor vl53l0x_init(&vl53l0x_dev);//vl53l0x initialization vl53l0x_adjust(&vl53l0x_dev); // calibration vl53l0x_set_mode(&vl53l0x_dev,Default_Mode);// Configure the measurement mode //OLED initialization OLED_Init(0xc8,0xa1); //OLED Display initialization -- Normal display ; // Clear the screen OLED_Clear(0); USART1_Init(115200); TIMER1_Init(72,20000); // Timeout time 20ms USART3_Init(115200);// A serial port -WIFI TIMER3_Init(72,20000); // Timeout time 20ms USART1_Printf(" Initializing WIFI One moment please .\n"); if(ESP8266_Init()) { ESP8266_Stat=1; USART1_Printf("ESP8266 Hardware detection error .\n"); } else { ESP8266_Stat=ESP8266_AP_TCP_Server_Mode(ESP8266_WIFI_AP_SSID,ESP8266_AP_PASSWORD,8080); if(ESP8266_Stat) { USART1_Printf("WIFI Configuration error , Status code :%d\r\n",ESP8266_Stat); } else { USART1_Printf("WIFI Configuration is successful .\r\n"); } } while(1) { // Key key=KEY_Scan(0); if(key==1) { // Clear the screen OLED_Clear(0); // Page turning if(page>=1) { page=0; } else { page++; } LED1=!LED1; //LEd Status light } else if(key==2) { LED1=!LED1; //LEd Status light time_cnt=0; } // receive WIFI Returned data if(USART3_RX_FLAG) { USART3_RX_BUFFER[USART3_RX_CNT]='\0'; //USART1_Printf("USART3_RX_BUFFER:%s\n",USART3_RX_BUFFER); USART3_RX_CNT=0; USART3_RX_FLAG=0; } // Regularly transmit to app Upper computer delay_ms(10); time_cnt++; if(time_cnt==30) { time_cnt=0; // Status light -- Indicates that the program is still alive LED2=!LED2; // Read the light intensity light=Read_BH1750_Data(); // #123.66 sprintf(esp8266_message,"#%0.2f",light); // To the cell phone APP Upload data ESP8266_ServerSendData(0,(u8*)esp8266_message,strlen((char*)esp8266_message)); Distance_data=vl53l0x_general_start(&vl53l0x_dev);// Perform a measurement printf("d: %4imm\r\n",Distance_data);// Print measured distance // When the distance is less than 100mm when , Turn on the buzzer Otherwise closed if(Distance_data<100) { BEEP=1; } else { BEEP=0; } // When the light intensity is greater than the specified value , Buzzer ring Otherwise closed if(light>2000) { BEEP=1; } else { BEEP=0; } } //OLED display if(page==0) { ShowLightDistance(light,Distance_data); } else if(page==1) { ESP8266_ShowPageTable(); } }}
边栏推荐
- 视频内容生产与消费创新
- Detailed single case mode
- NFT technology for gamefi chain game system development
- 煤炭行业数智化供应商管理系统解决方案:数据驱动,供应商智慧平台助力企业降本增效
- TiDB Dashboard里面可以写sql执行吗
- Classic problem of leetcode dynamic programming (I)
- LeetCode动态规划经典题(一)
- Coding officially entered Tencent conference application market!
- Dlib library for face key point detection (openCV Implementation)
- 金融服务行业SaaS项目管理系统解决方案,助力企业挖掘更广阔的增长服务空间
猜你喜欢
领导:谁再用 Redis 过期监听实现关闭订单,立马滚蛋!
How to use AI technology to optimize the independent station customer service system? Listen to the experts!
英飞凌--GTM架构-Generic Timer Module
联想YOGA 27 2022,超强配置全面升级
删除排序链表中的重复元素 II[链表节点统一操作--dummyHead]
Apple Watch无法开机怎么办?苹果手表不能开机解决方法!
Troubleshooting MySQL for update deadlock
云上“视界” 创新无限 | 2022阿里云直播峰会正式上线
Coding officially entered Tencent conference application market!
教你30分钟快速搭建直播间
随机推荐
Volcano engine was selected into the first "panorama of edge computing industry" in China
《被讨厌的勇气:“自我启发之父”阿德勒的哲学课》
Geoffrey Hinton:我的五十年深度学习生涯与研究心法
iCloud照片无法上传或同步怎么办?
手机股票账号开户安全吗?是靠谱的吗?
Tide - 基于 async-std 的 Rust-web 框架
C WinForm program interface optimization example
详解单例模式
System integration project management engineer certification high frequency examination site: prepare project scope management plan
How to solve the lock-in read-only alarm of AutoCAD Chinese language?
小程序容器技术,促进园区运营效率提升
Redis入门到精通01
ONEFLOW source code parsing: automatic inference of operator signature
CODING 正式入驻腾讯会议应用市场!
服务器之间传文件夹,文件夹内容为空
3.10 haas506 2.0开发教程-example-TFT
金融服务行业SaaS项目管理系统解决方案,助力企业挖掘更广阔的增长服务空间
SaaS project management system solution for the financial service industry helps enterprises tap a broader growth service space
torch.roll
Openlayers roller shutter map