CJMCU-GUVA-S12SD/CJMCU-S12D 太阳光紫外线强度传感器

本文分享了CJMCU-GUVA-S12SD/CJMCU-S12D太阳光紫外线强度传感器的使用经验,包括入坑过程、数据手册、传感器工作原理及代码实现。作者指出该传感器采用单总线通信协议,而非TTL,并提供了纠正错误的解决方案。
摘要由CSDN通过智能技术生成

CJMCU-GUVA-S12SD/CJMCU-S12D Solar UV Intensity Sensor(太阳光紫外线强度传感器)是2015年刚出来的。但厂家只提供了简化版的英文数据手册和写在txt的几行代码,Baidu、Google上也只能搜到英文版数据手册和厂家托管在百度云上的几行代码,没有人把经历共享出来,甚至在GitHub上无法搜到任何有关CJMCU-GUVA-S12SD/CJMCU-S12D的资料和代码。
所以我把我的爬坑经历共享出来,希望大家都能看懂。

楼上是摘要~
点击这里查看 CJMCU-GUVA-S12SD/CJMCU-S12D 太阳光紫外线强度传感器 原文
点击这里查看 我托管在GitHub上的代码

CJMCU-GUVA-S12SD/CJMCU-S12D 太阳光紫外线强度传感器

8月初淘来一个太阳光紫外线强度传感器,感觉应该很有意思,型号是CJMCU-GUVA-S12SD/CJMCU-S12D,谁知这传感器淘宝卖家只提供了简化版的英文数据手册和写在txt文档里的几行代码,Baidu、Google上只有英文版资料和一些淘宝商家在百度云上托管的几行代码,并没有人把玩过的经历共享出来,甚至在Github上无法搜索到任何有关CJMCU-GUVA-S12SD/CJMCU-S12D的资料。好吧,某宝一瞧,居然是2015年刚出来的传感器。虽然已经出了半年,但比起那些常见的sensor岁数可小了不知多少,哈哈哈~

入坑

接上VCC和GND,再接好SIG。之前翻淘宝的时候印象有点深,写的是这个sensor用的TTL通信,我没有任何思考直接把SIG接到了RX。

数值转换表

勉勉强强啃完英文数据手册,发现经过数据处理可以得到传感器光电流的输出电压,同时输出电压值和紫外线等级基本呈线性关系(如上图)。同时,在txt文件中的几行代码里边发现了一个转换:代码转换,认为这个数据是光电流的输出电压与紫外线等级的转换值。

UVindex

烧录程序,数据读出来,优化一下代码,再对着光电流的输出电压与

以下是将GUVA-S12SD紫外线传感器通过PCF8591转换成毫伏电压的51程序,供您参考: ```c #include <reg51.h> #define uchar unsigned char #define uint unsigned int #define PCF8591_ADDR 0x90 // PCF8591地址 #define GUVA_S12SD_ADDR 0x00 // GUVA-S12SD地址 sbit SCL = P2^1; // I2C总线SCL引脚 sbit SDA = P2^0; // I2C总线SDA引脚 // I2C总线起始信号 void I2C_Start() { SDA = 1; SCL = 1; SDA = 0; SCL = 0; } // I2C总线停止信号 void I2C_Stop() { SDA = 0; SCL = 1; SDA = 1; } // I2C总线等待应答信号 bit I2C_WaitAck() { bit ack; SDA = 1; SCL = 1; ack = SDA; SCL = 0; return ack; } // I2C总线发送应答信号 void I2C_Ack() { SDA = 0; SCL = 1; SCL = 0; } // I2C总线发送非应答信号 void I2C_NAck() { SDA = 1; SCL = 1; SCL = 0; } // I2C总线发送一个字节 void I2C_WriteByte(uchar dat) { uchar i; for(i=0;i<8;i++) { SDA = dat & 0x80; SCL = 1; SCL = 0; dat <<= 1; } } // I2C总线接收一个字节 uchar I2C_ReadByte() { uchar i, dat = 0; SDA = 1; for(i=0;i<8;i++) { dat <<= 1; SCL = 1; dat |= SDA; SCL = 0; } return dat; } // 从PCF8591读取GUVA-S12SD的电压值 uint ReadGUVA_S12SD() { uint vol; I2C_Start(); I2C_WriteByte(PCF8591_ADDR); if(!I2C_WaitAck()) { I2C_Stop(); return 0; } I2C_WriteByte(GUVA_S12SD_ADDR); if(!I2C_WaitAck()) { I2C_Stop(); return 0; } I2C_Start(); I2C_WriteByte(PCF8591_ADDR | 0x01); if(!I2C_WaitAck()) { I2C_Stop(); return 0; } vol = I2C_ReadByte(); I2C_Ack(); I2C_Stop(); return vol * 5000 / 255; // 将ADC值转换成电压值,单位为毫伏 } void main() { uint vol; while(1) { vol = ReadGUVA_S12SD(); // 读取GUVA-S12SD的电压值 // 将电压值转换成待显示的数值(例如:1.23V -> 123) // 将待显示的数值发送到数码管显示模块进行显示 } } ``` 注意:以上程序仅供参考,具体实现还需根据您的具体硬件环境和实际需求进行调整和修改。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值