基于STM32的智能喂养系统

news2024/12/24 8:59:56

基于STM32的智能喂养系统

系统简介

  • 自动检测环境温湿度,当温湿度低于阈值时自动打开加湿器;
  • 自动检测水位,当水位低于阈值时自动加水;
  • 自动检测有害气体,当检测到有害气体时自动打开风扇;
  • 同步状态到微信小程序,微信小程序可以控制风扇,加湿器,水泵开关。

系统

有单片机主控负责检测各种信号量,将信息显示到屏幕上,采集信息后判断,并作出相应的动作。
在这里插入图片描述

系统框图

在这里插入图片描述

框图描述:相关传感器采集水位、温度、湿度、气体成分等信息传给主控,主控将处理之后的信息分别显示出来和发送到云端,主控可以控制相关设备进行加水、排气、报警、加湿等操作。相关模块独立供电。

系统所需器件

  • STM32F103RCT6最小系统板(系统主控)
  • ESP8266(WiFi通信模块)
  • 0.94寸OLED屏(显示模块)
  • DHT11(温湿度检测模块)
  • SPG30(二氧化碳检测模块)
  • HCSR-04(超声波模块)
  • 有源蜂鸣器
  • 5V继电器
  • LED灯若干

系统流程图

在这里插入图片描述

框图描述:下位机硬件驱动初始化,软件联网初始化,初始化完成后采集各个传感器数据进行处理、显示和上报,然后系统判断是否超过阈值,超过阈值之后控制相应器件进行相关操作;上位机初始化之后,接收下位机发来的数据进行显示,并且可以下发命令到下位机执行相关的操作。

硬件组成

硬件选型

  • 系统采用STM32F103RCT6最小系统板作为系统主控,32单片机,满足此系统所有要求,便宜,淘宝容易获得。
  • ESP8266作为WiFi通信模块和小程序通信,将采集的信息发送给小程序,同时接受小程序的命令。
  • 显示采用0.94寸的OLED模块,足够显示所有信息,采用IIC通信。
  • 采用SPG30模块检测二氧化碳浓度。该模块灵敏,采用IIC通信。
  • 用HCSR-04超声波模块检测水位。
  • 有源蜂鸣器作为提醒单元。
  • 若干发光二极管作为光信号。
  • 5V继电器驱动风机和加湿器。
  • 5V驱动的风机
  • 5V驱动的加湿器。
  • 一组3.3V电源,一组5V电源。(充电宝即可)

硬件原理图

在这里插入图片描述

硬件PCB图

板子正面
在这里插入图片描述
板子反面
在这里插入图片描述

硬件实物图

在这里插入图片描述

软件组成

软件描述:软件由Keil5编写,用的是C语言。

下位机

程序流程图

在这里插入图片描述

程序

//系统初始化
void System_Init(void)
{
    u8 i = 0;
    BEEP_Init();
    SysInit_GPIO();
    delay_init();	    	 //延时函数初始化
    I2C_Configuration();
    OLED_Init();			//初始化OLED
    NVIC_Config();
    SysInit_TIM();
    Adc_Init();
	Hcsr04Init();//超声波初始化
    OLED_CLS();
    OLED_ShowStr1(0, 0, (char*)"OLED Ready", 1);

    if(DHT11_Init())	//DHT11初始化
    {
        OLED_ShowStr1(0, 1, (char*)"DHT11 Error", 1);
        delay_ms(200);
        DHT11_Init();
    }
    else
        OLED_ShowStr1(0, 1, (char*)"DHT11 Ready", 1);

    Usart1_Init(115200);	 	//串口初始化为9600
    OLED_ShowStr1(0, 2, (char*)"UART1 Ready", 1);
    UsartPrintf(USART_DEBUG, "串口1初始化成功\r\n");
    Usart2_Init(115200);//8266通讯串口
    UsartPrintf(USART_DEBUG, "串口2初始化成功!\n");
    OLED_ShowStr1(0, 3, (char*)"UART2 OK", 1);
    //SGP30模块开机需要一定时间初始化,在初始化阶段读取的CO2浓度为400ppm,TVOC为0ppd且恒定不变,因此上电后每隔一段时间读取一次
    //SGP30模块的值,如果CO2浓度为400ppm,TVOC为0ppd,发送“正在检测中...”,直到SGP30模块初始化完成。
    //初始化完成后刚开始读出数据会波动比较大,属于正常现象,一段时间后会逐渐趋于稳定。
    //气体类传感器比较容易受环境影响,测量数据出现波动是正常的,可自行添加滤波函数。

	SGP30_Init();   //初始化SGP30
    SGP30_Write(0x20, 0x08);
    sgp30_dat = SGP30_Read();//读取SGP30的值
    CO2Data = (sgp30_dat & 0xffff0000) >> 16;
    TVOCData = sgp30_dat & 0x0000ffff;
    OLED_ShowStr1(0, 4, (char*)"SGP30 Ready", 1);
}

int main(void)
{
    const char* topics[] = {"/123/123/123"};
    unsigned short timeCount = 0;	//发送间隔变量
    unsigned char* dataPtr = NULL;
    
    System_Init(); 	//系统初始化
    ESP8266_Init();//8266初始化
    while(OneNet_DevLink())//接入onenet
    delay_ms(500);
    OLED_CLS();
    BuzzerShortBi();
    OneNet_Subscribe(topics, 1);
    while(1)
    {
        if(timeCount % 40 == 0) //1000毫秒/完成一次25ms=40 一秒执行一次(有一点点误差)
        {
            distance = Hcsr04GetLength();
        }
        if(++timeCount >= 120)									//发送间隔5s,也就是5s上传一次数据,3000/25=120
        {
            timeCount = 0;
        }
        TimerDeal();
		OLED_ShowStr1(0, 0, (char*)"OLED Ready", 1);
        dataPtr = ESP8266_GetIPD(3);//完成需要15个毫秒,三次循环,一次5个毫秒
        if(dataPtr != NULL)
            OneNet_RevPro(dataPtr);
    }
}

连接WiFi需要周围有一个
账号:aoteman,密码:88888888
的热点。

微信小程序

在这里插入图片描述

// 事件处理函数
 
  onLoad() {
    this.connectmqtt()
  },
 connectmqtt:function(){
   var that=this
   const options={
     connectTimeout:4000,
     clientId:Math.random().toString(36).substr(2),
     port:8084,
     username:'f22dfaf7d27fced36f716e2533f6c48f',
     password:'123123'
   }
   client=mqtt.connect('wxs://t.yoyolife.fun/mqtt',options)
   client.on('connect',(e)=>{
     console.log('服务器连接成功')
     client.subscribe('/iot/3051/cc',{qos:0},function(err){
       if(!err)
       {console.log('订阅成功')}
     })
   })
   //信息监听事件
   client.on('message',function(topic,message){
     let tem={}
     tem=JSON.parse(message)
     that.setData({
       tempo:tem.temp,
       hum:tem.humi,
       lx:tem.lengtn,
       co2:tem.co2,
       shuiwei:tem.shuiwei,
     })
     console.log(tem)
     console.log('收到'+message.toString())
   })
   client.on('reconnect',(error)=>{
     console.log('正在重新连接',error)
   })
   client.on('error',(error)=>{
    console.log('连接失败',error)
  })
 },
 onledchange:function(event){
   console.log(event.detail)
   let sw=event.detail.value
   console.log(event.detail.value)
   if(sw)
   {
    client.publish('/123/123/123','{"target":"led","value":1}',function(err){
      if(!err)
      {
        console.log('成功发送指令-开')
      }
    })
   }
   else
   {
    client.publish('/123/123/123','{"target":"led","value":0}',function(err){
      if(!err)
      {
        console.log('成功发送指令-关')
      }
    })
   }
 },
 onbeepchange:function(event){
  console.log(event.detail)
  let sw=event.detail.value
  console.log(event.detail.value)
  if(sw)
  {
   client.publish('/123/123/123','{"target":"beep","value":1}',function(err){
     if(!err)
     {
       console.log('成功发送指令-开')
     }
   })
  }
  else
  {
   client.publish('/iot/3051/wsy','{"target":"beep","value":0}',function(err){
     if(!err)
     {
       console.log('成功发送指令-关')
     }
   })
  }
}
})

最后就是发布小程序了。可以自行百度。

实物操作视频

哎,我还没录。

总结

此项目还是比较完整的,最终连机调试的时候需要细心慢慢调试。
v:shiboven

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/767248.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中间件上云部署 zookeeper

中间件上云部署 zookeeper 企业级中间件上云部署 zookeeper一、环境说明二、zookeeper部署YAML资源清单准备三、zookeeper部署及部署验证四、zookeeper应用验证 企业级中间件上云部署 zookeeper 一、环境说明 storageclassingress 二、zookeeper部署YAML资源清单准备 # vim…

图解java.util.concurrent并发包源码系列,原子类、CAS、AtomicLong、AtomicStampedReference一套带走

图解java.util.concurrent并发包源码系列,原子类、CAS、AtomicLong、AtomicStampedReference一套带走 原子类为什么要使用原子类CAS AtomicLong源码解析AtomicLong的问题ABA问题AtomicStampedReference 高并发情况下大量的CAS失败,导致CPU空转 往期文章&…

百度智能汽车负责人储瑞松离职,智驾重心转向ANP3

作者 | 王博 HiEV从多个信息源获悉,百度集团副总裁、百度智能汽车事业部总经理储瑞松将从百度离职。一位知情人士透露,储瑞松「即将启程,返回美国」。 继百度Apollo技术骨干郭阳离职后,储瑞松的变动,更加直白地反映出百…

电动汽车高压测试方案

针对电动汽车道路试验的要求,风丘科技携手德国IPETRONIK共同推出了电动汽车高压测试方案。电动汽车测试通常有两种测量手段:第一种是测量模拟量信号,包括电压、电流、温度和高压;第二种是使用数据记录仪或CAN卡从车辆总线读取数据…

你一定要收好这个系统性能测试用例模板

引言 文档目的 [简述本文档的目的] 适用范围 [指明本文档的适用范围和读者对象。如本测试计划是在策略和方法的高度说明如何计划、组织和管理测试项目。测试计划应包含足够的信息,使测试人员明白项目需要做什么、是如何运作的。另外,测试计划只是测试的…

刚体运动学-速度和加速度的表示方法(连体坐标系和世界坐标系)

0. 符号定义 自己画了一个图 下标 b b b是连体坐标系原点 O b O_b Ob​相对世界坐标系原点 O p O_p Op​的矢量在世界坐标系下的表示。下标 p p p是观察点相对世界坐标系原点 O p O_p Op​的矢量在世界坐标系下的表示。下标 p / b p/b p/b是观察点相对连体坐标系原点 O b O_b…

Python实现将pdf,docx,xls,doc,wps,zip,xlsx,ofd链接下载并将文件保存到本地

前言 本文是该专栏的第31篇,后面会持续分享python的各种干货知识,值得关注。 在工作上,尤其是在处理爬虫项目中,会遇到这样的需求。访问某个网页或者在采集某个页面的时候,正文部分含有docx,或pdf,或xls,或doc,或wps,或ofd,或xlsx,或zip等链接。需要你使用python自…

Yalmip入门教程(2)-变量定义和操作

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译:https://yalmip.github.io/tutorials/ 1.决策变量的定义 1.1 sdpvar 上文简单介绍了sdpvar函数的用法,接下来将对其进行详细介绍。复习一下,sdpvar函数的基本语…

window10安装telnet

1、打开控制面板 2、点击程序和功能 3、点击启用或关闭Windows功能 4、选中Telnet客户端,然后点击确定,然后就可以使用telnent 主机 端口来查看本地是否能连通该主机的该端口。

Linux系统部署Tomcat详细教程(图文讲解)

前言:本篇博客教大家如何一步一步使用Linux系统去部署自己的Tomcat服务器,每一行代码都是我自己严格执行过的,共分为了8点进行阐述,逻辑清晰! 目录 一、安装JDK环境 二、准备Tomcat安装包 三、安装Tomcat 四、配置…

【前端】求职必备知识点1-HTML

文章目录 DOCUTYPE的作用HTML语义化HTML5新特性iframedefer 和 async 标题链接【前端】求职必备知识点1-HTMLhttps://blog.csdn.net/karshey/article/details/131795380 DOCUTYPE的作用 DOCTYPE是document type (文档类型) 的缩写。 是HTML5中一种标准通用标记语言的文档类型…

《TCP IP网络编程》第七章

第七章:优雅的断开套接字的连接 TCP 的断开连接过程比建立连接更重要,因为连接过程中一般不会出现大问题,但是断开过程可能发生预想不到的情况。因此应该准确掌控。所以要掌握半关闭(Half-close),才能明确断…

131、仿真-基于51单片机智能电子称HX711报警仿真设计(程序+原理图+PCB图+Proteus仿真+参考论文+元器件清单等)

摘 要 电子秤是将检测与转换技术、计算机技术、信息处理、数字技术等技术综合一体的现代新型称重仪器。它与我们日常生活紧密结合息息相关。 电子称主要以单片机作为中心控制单元,通过称重传感器进行模数转换单元,在配以键盘、显示电路及强大软件来组成…

【手撕C语言基础】递归

(꒪ꇴ꒪ ),hello我是祐言博客主页:C语言基础,Linux基础,软件配置领域博主🌍快上🚘,一起学习!送给读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!作者水平很有限,如果发现错误&#x…

数据结构(王道)——数据结构之 二叉树

一、数据结构之 二叉树概念: 特殊的二叉树结构: 满二叉树完全二叉树 二叉排序树 平衡二叉树 二叉树基本概念总结: 二、二叉树的常用性质: 1、叶子结点比二分支结点多一个

汽车的空气悬架的功能以及发展趋势

空气悬架能实现什么功能以及发展趋势 了解空气悬架之前,首先得快速了解什么是悬架。 教科书说法是: 悬架系统是汽车的车架与车桥或车轮之间的一切传力连接装置的总称。悬架系统基本构成有弹性元件(各类弹簧,缓冲作用);减震元件(减震器,减震作用);导向机构(控制臂等…

技术分享:如何用pytest_addoption切换自动化测试环境?

前言 在目前互联网公司中,都会存在多个测试环境,那么当我们编写的自动化想要在多套测试环境下进行运行时,如何使用? 大多数人想到的可能是通过将我们自动化代码中的地址修改成不同环境。 但是这时候就会增加一些工作量&#xf…

智安网络|移动安全的转型:零信任如何重新定义格局

数字化转型和远程/移动办公的常态化已经成为许多企业的现实。这一转变为企业带来了许多便利,但同时也引入了前所未有的风险,涉及员工的隐私、个人身份和特权访问凭证。尤其是在经济衰退和疫情的持续影响下,许多企业不得不在提高生产力的同时面…

260道网络安全工程师面试题汇总(附答题解析+配套资料)

由于我之前写了不少网络安全技术相关的文章和回答,不少读者朋友知道我是从事网络安全相关的工作,于是经常有人私信问我: 我刚入门网络安全,该怎么学? 想找网络安全工作,应该要怎么进行技术面试准备&…

Linux gdb汇编调试

文章目录 一、示例代码二、gdb汇编指令2.1 step/stepi2.2 next/nexti2.3 info registers2.4 set2.5 x2.6 rip寄存器2.7 rip 寄存器 参考资料 一、示例代码 &#xff08;1&#xff09; #include <stdio.h>int add(int a, int b) {return a b; }int main() {int a 3;in…