一、前言
上回FastBond3阶段1(基础部分)的文档中,介绍了植护助手的框图和功能,也说明了项目中所使用到的活动规定厂家的芯片。
本文之后的内容将展示使用kicad制作的原理图及PCB,成品的功能测试和主要程序的说明。
二、原理图及PCB介绍
如下图所示整个系统由电源、摄像头、电容式湿度传感器、风扇、触摸模块和ESP32主控模块组成,其中电源可以用Typc接口的充电器提供,摄像头使用OV2640模块,风扇采用高转速风扇,湿度传感器使用电容式的,触摸显示模块可以用手机,主控使用ESP32S3模块。采集到的数据由ESP32主控模块上传到手机,手机可以看到采集到的图像数据和湿度数据,手机也可以下发指令到主控模块来控制风扇等。
原理图和PCB设计都是由KICAD绘制,如下图所示
其中原理图中Q3上边用1N4148二极管并联在风扇接口处,使风扇的回馈能够快速流回电源,使电路系统更加稳定。
如下所示是PCB绘制,双层板设计,在IO19引脚接湿度传感器,用于读取湿度数据;用IO20引脚控制风扇排风;摄像头引脚如上图所示。
1N4148器件介绍
电压 - DC 反向 (Vr)(最大值)100 V 不同 If 时电压 - 正向 (Vf) 1 V @ 10 mA
反向恢复时间 (trr) 4 ns 不同 Vr 时电流 - 反向泄漏 5 µA @ 75 V
不同 Vr、F 时电容 4pF @ 0V,1MHz
三、PCB实物及功能测试
如下所示在主板上接上风扇和湿度传感器,即可开始测试。
PCB设计的时候一定要注意PCB三极管的封装,和使用的三极管器件是否对应,在调试这个板子的时候就遇到了这个问题,好在细心排查发现了三极管问题。
以下是风扇停转运行截图
以下是风扇正在转的运行截图
放在水里的湿度数据
放在空气中和土壤里的湿度数据
四、关键代码及说明
如下所示:
1. 湿度传感器要进行标定,1.放在空气中记下测量到的数值,2.放在水里记下测量的值,再进行函数化。
2. MQTT数据的发送和数据接收后判断打开或关闭风扇。
3. 摄像头部分代码。
//土壤湿度传感器需要做一个简单的干湿数据标定
float c_min = 3160.0; //readings in air (例如在空气中测得数值3160)
float c_max = 1760.0; //readings in water(在水里测得数据1760,再使用函数进行运算)
float m_min = 0.0; //min soil moisture
float m_max = 100.0; //max soil moisture
int c_cur=analogRead(ASOI);//读取湿度数值
int m_cur = (c_cur - c_min) * (m_max - m_min) / (c_max - c_min);//使用函数进行比例化运算
sprintf((char*)MQ_data,"%s%d%s",MQ_a,m_cur,MQ_b);//拼接到一个数组里
client.publish(TOPIC_pub, MQ_data);//数据发送到mqtt服务器
//收到OPEN字符串打开风扇,收到CLOS字符串关闭风扇
if (strstr((char*)payload,"OPEN")) {
digitalWrite(JDQ, HIGH);
Serial.print(" 开风扇\n");
}
else if (strstr((char*)payload,"CLOS")) {
digitalWrite(JDQ, LOW);
Serial.print(" 关风扇\n");
}
//摄像头引脚初始化和开启摄像头
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_sccb_sda = SIOD_GPIO_NUM;
config.pin_sccb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000;
config.frame_size = FRAMESIZE_UXGA;
config.pixel_format = PIXFORMAT_JPEG; // for streaming
//config.pixel_format = PIXFORMAT_RGB565; // for face detection/recognition
config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
config.fb_location = CAMERA_FB_IN_PSRAM;
config.jpeg_quality = 12;
config.fb_count = 1;
startCameraServer();//开启摄像头
五、活动总结
很感谢硬禾学堂举办的FastBond3活动,让我有机会通过这个活动做一些很有意义的事情,来挑战自己。这之中虽然遇到了一些难题,比如摄像头部分和自动下载电路部分,但这些都是情理之中的,毕竟第一次摄像头板,这些都是需要经验的。本次项目的成品略显粗糙,实用性还有能改进空间,我将有机会后续开源出来。