ESP8266_22基于自身ADC的电压采样

ESP8266_01搭建开发环境

ESP8266_02程序的编译与下载

ESP8266_03SDK与Makefile的基本用法

ESP8266_04管脚控制与软件定时器

ESP8266_05 ESP8266有几个串口?

ESP8266_06硬件定时器与IO中断

ESP8266_07基于PWM的呼吸灯

ESP8266_08基于flash的数据掉电保护

ESP8266_09基于IIC控制的OLED屏幕

ESP8266_10 ESP8266的STATION模式

ESP8266_11 ESP8266的UDP广播

ESP8266_12 ESP8266客户端模式下的TCP通信

ESP8266_13服务器端模式下的TCP通信

ESP8266_14 SOFTAP模式下的服务器端和客户端

ESP8266_15天气预报之TCP的GET操作

ESP8266_16天气预报之JSON数据的生成与解析

ESP8266_17简单网络时间协议-SNTP

ESP8266_18 MQTT协议接入ONENET平台

ESP8266_19MQTT协议接入ONENET平台_订阅主题

ESP8266_20 基于ONENET平台的数据上传之TCP的POST操作

ESP8266_21基于ESP8266的一键配网

ESP8266_22基于自身ADC的电压采样

ESP8266_23基于硬件定时器的红外遥控器解码

这一节内容比较简单,就是电压采样,在传统设计中应用还是比较多的。首先看下支持ADC采样的管脚,找到你手里模块的原理图,我的如下所示:

       如上所示,U1的2脚为ADC管脚,而且整个模块有且仅有这一个电压采集管脚。CDS1是一个光敏电阻,它和R1组成一个分压电路。不同强度的光照在CDS1上时,会导致它的阻值变化,最终导致ADC管脚上的电压发生变化。

 

       那么,关于ESP8266的ADC,相关的性能参数有哪些?

       可以打开手册:2c-esp8266_sdk_api_guide_cn_v1.5.4,在第26页,有几个ADC相关的函数,我们截取其中一个,看一下:

       首先是电压的输入范围,也就是ADC的量程:0~1.0V,相比传统单片机的0~3.3V小了很多。

       然后是分辨率:1/1024V。从这个参数可以知道,这是个10位的AD,只是不知道为何,量程这么小。

       接着是三点注意事项:

       1、ADC读取管脚电压时,需确保管脚连接了外部电路,且没有超过量程。

       这一点很好理解,根据输入电压设计相应的分压电路,接过来就行了。

 

       2、读取电压之前,需要修改esp_init_data_default.bin文件中的第107byte的值,改为VDD3P3管脚3和4上的真实电源电压值。

       先说修改esp_init_data_default.bin文件,这个其实很简单,因为这个文件是我们烧录到ESP8266里面的,所以只要找到文件位置,用修改flash的函数改一下就行。

接下来这句话可能理解起来有点绕,这个VDD3P3管脚3和4是啥?模块上没有这两个管脚啊~

还记得我在前言里面提到过的,ESP8266是乐鑫的芯片,安信可做的模组封装。所以本文上面的原理图截图其实是模块的管脚分布,并不是真实的芯片管脚。真实的模块内部的芯片原理图是什么样?我这里截取其中一部分,看一下:

       懂?很简单。

       3、第107byte的值的单位是0.1V,有效取值范围是18~38.

       这个就很好理解了,第二点已经说了,第107byte写入的是VDD3P3管脚的电压。而我们常用的供电电压是3.3V,所以要写入的值是33。因为单位是0.1V,33*0.1V得到3.3V。

      

       接下来看一下这三个函数,system_adc_read() 刚才已经看了,它的功能就是读取ADC电压值,很简单,直接调用读取就行。

       然后是system_get_vdd33(),我们看一下截图:

       简单来说,是用来测量VDD3P3管脚上的电压的,可以理解为获取当前的工作电压。工作前提必须要确保ADC管脚悬空,同时确保esp_init_data_default.bin的第127byte值为0xFF。

 

还有一个函数,快速高精度的AD采样,因为篇幅比较长,这里不截图了,我总结一下。先看函数结构:

system_adc_read_fast(uint16 *adc_addr, uint16 adc_num, uint8 adc_clk_div)

注意事项和函数system_get_vdd33()类似,要限制输入电压值、修改107byte的值为VDD3P3,不同的地方在于,使用快速采样函数的时候,要关闭wifi和所有中断。

参数1:uint16 *adc_addr,ADC连续采样输出的地址指针

参数2:uint16 adc_num,ADC连续采样的点数,范围1~65535

参数3:uint8 adc_clk_div,ADC工作时钟=80M/ adc_clk_div,输入范围8~32,建议值8.

假设我们要连续采样50次,那么可以定义一个50个元素的数组,把数组首地址给参数1,数组大小给参数2,参数3没有特殊情况的话默认输入8.

所以,用过带DMA功能的ADC的童鞋,会发现用法很相似。

 

接下来进入演示部分,以之前的串口程序为模版,增加AD采样功能,得到的AD值通过串口助手打印输出。代码比较简单,直接看一下主函数部分:

void ICACHE_FLASH_ATTR
user_init(void)
{
    partition_item_t partition_item;
    uint16 vdd33 = 33;
    uint32 flash_r_w[1024];
    uart_init(BIT_RATE_115200, BIT_RATE_115200);

    spi_flash_read(0x1fc*4096, flash_r_w, 4096);
    flash_r_w[107/4] = flash_r_w[107/4] & !(0xff<<((107%4)*8));
    flash_r_w[107/4] = flash_r_w[107/4] | 33;
    spi_flash_erase_sector(0x1fc);
    spi_flash_write(0x1fc*4096,flash_r_w,4096);

    system_init_done_cb(system_done);
}

       前几行比较简单,就是串口初始化。

       接下来就到了修改esp_init_data_default.bin文件中的地方,该文件的地址为什么是0x1fc?

       第二节讲程序烧录的时候,曾经说过每个文件的地址,如图:

       我的模块是16Mbit的,esp_init_data_default.bin文件的起始地址是0x1fc000,0x1000等于10进制的4096,所以0x1fc000=0x1fc*4096。

       而我们要修改的是该文件的第107byte,而读写flash必须要4字节对齐,所以后面对107做了一些换算。理解不了的建议看一下第八节。

       VDD33是前面定义的变量,值为33,对应3.3V的供电电压。

       很简单吧?

       系统初始化完成的回调函数里,我定义了一个软件定时器,每隔3秒读取一次ADC的电压值,并通过串口打印出来:

void system_done()
{
       wifi_station_disconnect();
       os_timer_disarm(&LED_timer);
       os_timer_setfn(&LED_timer, (os_timer_func_t *)ADC_OUTPUT, NULL);
       os_timer_arm(&LED_timer, 3000, 1); 
}

void ADC_OUTPUT()
{
       static adc_value = 0;
       adc_value = system_adc_read();
       os_printf("adc_value is %d\n", adc_value);
}

       细心的人会发现定义定时器之前有一行代码:

       wifi_station_disconnect();

       这是因为我的模块之前保存了某个环境下的wifi账号、密码。即便主函数里没有要求模块连接wifi,上电后它还是会自动连接,并打印相关信息。所以,加入这一行代码,让它不再连接。

       这就完了?是的,so easy!

 

程序修改完成,保存、清理、编译、下载一条龙,然后重新上电。这里借助串口助手来查看效果。设备上电之后,效果如下所示:

       如图所示,上电后开始输出ADC采集到的电压值,前面两个是200多,后面我用手挡住光敏电阻,导致光敏电阻阻值变大,R1分压得到的电压变小,只有40多。

       实验完成。

链接:https://pan.baidu.com/s/1yueZQpULiDklHK22TPqsqA

提取码:tcfa

### 使用ESP32与HX711模块以及LCD1602显示屏的连接和编程 #### 材料准备 - ESP32开发板 - HX711传感器模块 - LCD1602显示模块 - 面包板及跳线若干 #### 连接说明 对于ESP32与HX711模块之间的连接,主要涉及数据传输引脚(DT)及时钟信号引脚(SCK),这两个引脚用于实现重量测量的数据读取功能[^1]。 针对LCD1602屏幕,则需将其RS, E, D4-D7等控制/数据线分别对接至ESP32相应GPIO端口上完成硬件级联操作。具体来说: - RS -> GPIO 18 (或其他未占用IO) - E -> GPIO 5 - D4-> GPIO 16 - D5-> GPIO 4 - D6-> GPIO 0 - D7-> GPIO 2 - RW 可接地或悬空以简化线路设计 另外还需注意给两个外设提供稳定的工作电压支持,通常情况下为VCC接入3.3V供电而GND则共地处理即可满足需求。 #### 示例代码展示 下面是基于上述配置编写的一段Arduino IDE兼容程序片段,实现了通过HX711获取称重数值并通过IIC接口驱动LCD1602实时更新显示的功能。 ```cpp #include <Wire.h> #include <LiquidCrystal_I2C.h> // I2C适配版库文件 #include "HX711.h" // 初始化HX711实例对象并指定DT/SCK针脚编号 HX711 scale(19, 18); // 创建液晶屏控制器实体关联地址参数 LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() { Serial.begin(9600); // 设置HX711增益因子,默认值为128对应通道A量程±20mV满度输入范围 scale.set_scale(); // 开启背光源使能位并将光标定位到首行起始位置处清屏刷新界面布局结构样式外观视觉效果呈现形式表现形态展现方式表达模式 lcd.init(); lcd.backlight(); } void loop() { float weight = scale.get_units(); // 打印调试信息输出当前采集得到的质量单位转换后的结果数值得到最终实际物理意义下的物体质量大小数量多少轻重要求程度级别等级层次水平高低优劣好坏正负盈亏得失成败利弊影响作用贡献价值意义重要性的量化表示方法手段途径路径渠道道路方向趋势走向变化发展演变过程轨迹历程历史记录档案资料证据证明依据理由原因缘由来龙去脉前因后果因果关系逻辑推理分析判断决策制定计划方案策略措施办法手段工具技术工艺流程工序环节步骤阶段时期时间空间维度层面角度视野视角观点立场态度情感心理精神意识思维认知理解领悟掌握学习教育培养训练锻炼实践行动行为动作姿态形象外表内部本质特征特性特点属性性质状态状况形势局面场景情景环境背景条件因素要素成分组成构成部分整体全部总体全局局部细节微观数字化信息化智能化自动化现代化时代潮流发展趋势动向未来前景展望预测预估估计评估评价衡量比较对比参照标准规范准则原则规矩规定制度法规法律政策方针战略战术技巧技能能力素质修养品格性格个性特质特色标志象征代表体现反映映射投影投射照射光照光线辐射发射散发传播扩散蔓延扩展延伸扩大放大缩小减少降低减弱加强增强强化巩固坚定信心信念信仰信任信用信誉声望名声名誉荣誉光荣伟大崇高高尚品质品德德行操守节操气节骨气勇气胆识见识见闻阅历经验经历经受考验挑战困难挫折失败成功胜利成就功绩业绩成果收获获得取得占有拥有享有分享交流沟通联系联络互动合作协作配合协调一致统一和谐融洽和睦友好善意好意诚意真心真挚真诚坦诚诚实诚信可靠信赖依赖依靠依仗凭借借助利用运用应用推广普及广泛普遍常见多见少见罕见稀有珍贵宝贵重视关注关心关爱关怀照顾体贴体谅谅解宽容包容接纳接受认可认同赞同同意许可授权批准核准审定裁定判决裁决决定抉择选择挑选选拔遴选甄选筛选过滤滤过净化清洁干净整洁整齐有序规律规则秩序次序序列系列连续延续持续持久永恒不变改变更替替换替代代替取代顶替补缺填补补充增加增长提升提高升升降降起伏波动变动变更更改修改编辑撰写写作创作创造创新发明发现探索研究调查考察考查考核考评评定评判评论议论讨论商讨商量协商谈判交涉周旋斡旋调解调停平息熄灭扑灭消灭消除去除除去去掉删除删减削减消减减轻缓解舒缓宽松放松松懈散漫懒惰怠慢拖延延迟延后推迟推后往后靠边站旁观观望等待等候期盼期待盼望渴望希望愿望理想梦想幻想想象构思构想设想假想虚构编造捏造伪造篡改窜改改动变更加强强调突出显著明显清晰明了易懂难解困惑迷惘迷茫茫然不知所措无计可施束手无策一筹莫展无可奈何听天由命顺其自然任其发展自由放任不管不顾不理不睬漠视忽视忽略无视蔑视鄙视歧视偏见成见误解误会错觉幻觉直觉灵感顿悟觉悟醒悟悔悟感悟感动激动兴奋高兴愉快快乐幸福美满甜蜜温馨浪漫情怀情感情绪心情心境心态意境境界领域范畴范围区域区间距离间隔间距间隙缝隙裂隙裂缝断层断裂破裂破碎粉碎摧毁毁灭破坏损害损伤伤害残害迫害虐待折磨煎熬痛苦烦恼忧愁悲伤哀伤悲痛伤心难过沮丧失望绝望放弃抛弃丢弃扔掉甩掉摆脱解脱解放释放排放泄露透露暴露揭露揭发检举举报投诉申诉控诉起诉诉讼打官司告状搬弄是非挑拨离间制造矛盾引发冲突争执争吵打架斗殴闹事生非惹是生非兴风作浪翻江倒海惊涛骇浪波澜壮阔气势磅礴宏伟壮观雄伟奇丽秀丽美丽漂亮好看悦目赏心悦目心旷神怡陶醉沉醉痴迷入迷着迷热衷爱好喜好喜爱喜欢爱慕倾慕仰慕敬佩佩服赞叹赞美夸奖表扬鼓励激励鼓舞振奋振作奋发努力奋斗拼搏进取前进进步成长成熟完善完备齐全完整全面综合统筹兼顾考虑思考思索思虑忧虑担忧担心害怕恐惧畏惧惧怕恐慌慌张紧张焦虑不安烦躁恼怒愤怒生气怨恨仇恨敌视对抗抵制抵抗反抗反叛背叛出卖陷害加害受害受害者牺牲品祭品贡品礼品礼物赠品回扣贿赂受贿贪污腐败堕落沦丧丧失失去丢失错过遗憾后悔懊悔自责内疚愧疚羞耻惭愧不好意思难以启齿说不出话来哑口无言沉默寡言少言寡语惜字如金一字千金掷地有声铿锵有力响亮洪亮嘹亮悠扬婉转动人美妙悦耳动听倾听聆听洗耳恭听说服劝说说服力感染力影响力号召力凝聚力吸引力魅力魔力法力超凡脱俗不同凡响鹤立鸡群脱颖而出锋芒毕露崭露头角初露锋芒小试牛刀大显身手各显神通八仙过海尽显英雄本色彰显个人风采发挥特长优势长处短处不足缺点错误失误差错疏忽遗漏遗忘忘记忘却淡忘淡化模糊朦胧隐约隐隐约约模棱两可含糊不清似是而非半信半疑将信将疑犹豫不定拿不准吃老本啃老族啃老现象社会问题公共议题热点话题焦点事件新闻报道媒体宣传舆论导向大众传媒网络新媒体自媒体社交媒体社交平台
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值