基于RISC-V MCU CH32V307水感控制系统
很高兴能参与这次的“RISC-V MCU创新应用大赛”,这次我带来的作品是基于RISC-V MCU CH32V307 的水感控制系统。大的方面一直以来城市因为存在内涝导致一下雨就很多地方出现水漫金山的情况,有些地方因为比较偏远所以不易发现带来潜在的危险;小的方面有些家庭有储水池(水箱),当缺水或满水时没即时发现和提醒。因此我就通过RISC-V MCU CH32V307结合水感传感器,做了一个水感应控制系统的初代产品;算抛砖引玉也体验出RISC-V MCU CH32V307的强大功能和易操作性更体现其能适应不同的Iot物联网应用场景。
1、硬件介绍:
我们先来介绍一下我们的主角:我们使用的是CH32V307开发板,该板使用的是南京沁恒微电子(WCH) 推出的一款基于 RISC-V MCU CH32V307 内核的开发板。
主控MCU特点:
> RISC-V4F处理器,最高144MHz系统主频
> 支持单周期乘法和硬件除法,支持硬件浮点运算(FPU)
> 64KB SRAM,256KB Flash
> 供电电压:2.5/3.3V,GPIO单元独立供电
> 多种低功耗模式:睡眠、停止、待机
> 上/下电复位、可编程电压检测器
> 2组18路通用DMA
> 4组运放比较器
> 1个随机数发生器TRNG
> 2组12位DAC转换
> 2单元16通道12位ADC转换,16路触摸按键TouchKey
> 10组定时器
> USB2.0全速OTG接口
> USB2.0高速主机/设备接口(480Mbps 内置PHY)
> 3个USART接口和5个UART接口
> 2个CAN接口(2.0B主动)
> SDIO接口、FSMC接口、DVP数字图像接口
> 2组IIC接口、3组SPI接口、2组IIS接口
> 千兆以太网控制器ETH(内置10M PHY)
> 80个I/O口,可以映射到16外部中断
> CRC计算单元,96位芯片唯一ID
> 串行2线调试接口
接下来出场的就是我们的水感传感器,它的作用就是感知是否有水,如果感应板上检测到没有水时,则输出高电平,反之则输出为低电平。我们就通过CH32V307捕足这个信号,对这个信号进行处理和控制。
2、与开发板线路连接
在开始线路连接之前先说说我们硬件的连接和逻辑。首先,我们通过水感传感器的高低电平传到我们的开发板,然后我们的开发板根据这个信号,控制我们的继电器连接的指示灯进行显示。
上面就是示意图,当水感传感器检测到没有水时,就显示蓝色指示灯;当有水就指示红灯。
那怎么连呢?先将水感传感器的信号线接到控制板的PD11这个用来接收,然后就接继电器,因为继电器要控制2个指示灯,所以接PD12和PD14。
3、数据代码接入
线已经接好了,就到上代码时间了。我们这里用的IDE是MounRiver Studio 用 TencentOS Tiny 开发,这里就直接上核心代码
#define RAIN_PORT GPIOD
#define RAIN_PIN GPIO_Pin_11
#define RAIN_RCC RCC_APB2Periph_GPIOD
#define RAIN_STATE() GPIO_ReadInputDataBit(RAIN_PORT,RAIN_PIN)//读水感的状态
void rain_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RAIN_RCC,ENABLE);
GPIO_InitStructure.GPIO_Pin=RAIN_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(RAIN_PORT,&GPIO_InitStructure);
}
上面就是水感的状态,下面就是继电器的。
void POWER_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
void Open_led(void){
GPIO_ResetBits(GPIOD,GPIO_Pin_12);
GPIO_SetBits(GPIOD,GPIO_Pin_14);
}
void Close_led(void){
GPIO_ResetBits(GPIOD,GPIO_Pin_14);
GPIO_SetBits(GPIOD,GPIO_Pin_12);
}
然后就任务一里面读数就可以了。
if(RAIN_STATE()==1){
printf("===>当前没水%d\\r\\n",RAIN_STATE());
Close_led();
}else{
printf("===>当前有水%d\\r\\n",RAIN_STATE());
Open_led();
}
好吧,还是看看我的成功视频吧(显示视频在21:17秒)。
4、心得和体会
本次水感应控制系统属于初代产品也就是入门级的,主是展现CH32V307开发板的应用场景丰富,开发容易。后继可以加上数据上报和移动端展示,在CH32V307面前这些都不是什么难事。因为CH32V307实在太强大了。。
最后很感谢各位看官内心的观看。青山不改,绿水常流;感谢各位支持,期望下次还有机会参加这样的活动。