Web植物管理系统-下位机部分

news/2024/10/11 14:06:59/文章来源:https://blog.csdn.net/weixin_73654895/article/details/142188647

本节主要展示上位机部分,采用BSP编程,不附带BSP中各个头文件的说明,仅仅是对main逻辑进行解释


 main.c

上下位机通信

通过串口通信,有两位数据验证头(verify数组中保存对应的数据头 0xAA55)

通信格式

上位发送11字节数据,其中前两位是0xAA55用于数据验证,第三位用于判断当前上位机发送数据的功能

当第三位数据为0x00时,表明当前是验证数据,用于检验串口通信是否成功,若成功返回字节序列 [0xaa ,0x55,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09]

当第三位数据为0x01时,表明当前是收集温度,光照,土壤湿度数据,返回字节序列 [0xaa ,0x55,0x01,0x温度十位,0x温度个位,0x温度小数位,0x光照百位,0x光照十位,0x光照个位,0x,0x电压个位,0x电压小数位]

当第三位数据为0x02时,表明当前是修改温度,光照,土壤湿度阈值

 在函数my1S中定义了收集温度,光照,土壤湿度数据的实现函数,并且通过检验数据是否超过阈值来触发蜂鸣器报警,根据不同的触发条件来发出不同的声音。

全部代码

#include "STC15F2K60S2.H"        //±ØÐë¡£
#include "sys.H"                 //±ØÐë¡£
#include "Uart1.H" 
#include "adc.h"
#include "displayer.H"
#include "Beep.H"
#include "StepMotor.h"#define N 11#ifdef _displayer_H_
code char decode_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01, 0x41, 0x48, /* ÐòºÅ:   0   1    2	   3    4	    5    6	  7   8	   9	 10	   11		12   13    14     15     *//* ÏÔʾ:   0   1    2    3    4     5    6    7   8    9  (ÎÞ)   ÏÂ-  ÖÐ-  ÉÏ-  ÉÏÖÐ-  ÖÐÏÂ-   */  0x3f|0x80,0x06|0x80,0x5b|0x80,0x4f|0x80,0x66|0x80,0x6d|0x80,0x7d|0x80,0x07|0x80,0x7f|0x80,0x6f|0x80 };  /* ´øСÊýµã     0         1         2         3         4         5         6         7         8         9        */
#endifcode unsigned long SysClock=11059200;         //±ØÐë¡£¶¨Òåϵͳ¹¤×÷ʱÖÓƵÂÊ(Hz)£¬Óû§±ØÐëÐ޸ijÉÓëʵ¼Ê¹¤×÷ƵÂÊ£¨ÏÂÔØʱѡÔñµÄ£©Ò»ÖÂunsigned char rxdbuf[N],txdbuf[N];
code char verify[2]={0xaa,0x55};
unsigned int s0,s1,s2,s3,s4,s5,s6,s7;
unsigned char limit[8] = {3,7,5,0,9,0,1,0};int rt_to_tem(unsigned int adc, unsigned char adcbit)
{ code int temtable[32]={2000,1293,1016,866,763,685,621,567,520,477,439,403,370,338,308,278,250,222,194,167,139,111,83,53,22,-11,-4.7,-87,-132,-186,-256,-364};unsigned char resh;      //¸ß5bit   ²é±íunsigned int resl;       //µÍ11bit  ²åÖµresl=adc<<(16-adcbit);         //ÏÈͳһÀ©Õ¹³É16bitresh=resl>>11;resl=resl & 0x07ff;return(temtable[resh]-(((temtable[resh]-temtable[resh+1])*resl)>>11));
}void check_received_data(void) {unsigned int flag = 0;unsigned int data_flag = 0;unsigned int change_flag = 0;if(rxdbuf[2] == 0x00) flag = 1;if(rxdbuf[2] == 0x01) data_flag = 1;if(rxdbuf[2] == 0x02) change_flag = 1;if(flag){txdbuf[0] = 0xaa;txdbuf[1] = 0x55;txdbuf[2] = 0x00;txdbuf[3] = 0x01;txdbuf[4] = 0x02;txdbuf[5] = 0x03;txdbuf[6] = 0x04;txdbuf[7] = 0x05;txdbuf[8] = 0x06;txdbuf[9] = 0x07;txdbuf[10] = 0x08;Uart1Print(txdbuf, sizeof(txdbuf));}if(!flag && data_flag){// txdbuf[0] = 0xaa;txdbuf[1] = 0x55;txdbuf[2] = 0x01;txdbuf[3] = s0;txdbuf[4] = s1;txdbuf[5] = s2;txdbuf[6] = s3;txdbuf[7] = s4;txdbuf[8] = s5;txdbuf[9] = s6;txdbuf[10] = s7;Uart1Print(txdbuf, sizeof(txdbuf));	}if(!flag && change_flag){limit[0] = rxdbuf[3];limit[1] = rxdbuf[4];limit[2] = rxdbuf[5];limit[3] = rxdbuf[6];limit[4] = rxdbuf[7];limit[5] = rxdbuf[8];limit[6] = rxdbuf[9];limit[7] = rxdbuf[10];txdbuf[0] = 0xaa;txdbuf[1] = 0x55;txdbuf[2] = 0x02;txdbuf[3] = limit[0];txdbuf[4] = limit[1];txdbuf[5] = limit[2];txdbuf[6] = limit[3];txdbuf[7] = limit[4];txdbuf[8] = limit[5];txdbuf[9] = limit[6];txdbuf[10] = limit[7];Uart1Print(txdbuf, sizeof(txdbuf));	}
}void my1S()
{	static unsigned int temperature_sum=0;static unsigned int light_sum = 0;static unsigned int voltage_ge_sum = 0;static unsigned int voltage_xiaoshu_sum = 0;static unsigned int count=0;int temperature_tem;int light_tem;int voltage_ge_tem;int voltage_xiaoshu_tem;struct_ADC adcres;int temperature_shi;int temperature_ge;int temperature_xiaoshu;int temperature;int temperature_aac;int light_bai;int light_shi;int light_ge;int voltage_ge;int voltage_xiaoshu;int voltage;int i=0;adcres=GetADC();temperature_sum = adcres.Rt;temperature_tem = rt_to_tem(temperature_sum,14);temperature_shi = temperature_tem/100%10;temperature_ge = temperature_tem/10%10;temperature_xiaoshu = temperature_tem%10;temperature = temperature_shi *100 + temperature_ge * 10 + temperature_xiaoshu - 320;temperature_shi = (temperature * 10 / 18) /100;temperature_ge = (temperature * 10 /18) %100 /10;temperature_xiaoshu = (temperature * 10 /18) %10;s0 = temperature_shi;s1 = temperature_ge-2;s2 = temperature_xiaoshu;temperature_aac=s0*10+s1*1+s2*0.1;light_sum = adcres.Rop;light_tem = light_sum;light_bai = light_tem%1000/100;light_shi = light_tem%100/10;light_ge = light_tem%10;s3 = light_bai;s4 = light_shi;s5 = light_ge;voltage_ge_sum = adcres.EXT_P10/50;voltage_xiaoshu_sum = adcres.EXT_P10%50/5;voltage_ge = voltage_ge_sum;voltage_xiaoshu = voltage_xiaoshu_sum;voltage = (adcres.EXT_P10%1000/100) * 100 + (adcres.EXT_P10%100/10) * 10 + adcres.EXT_P10%10;s6 = voltage / 50;s7 = voltage%50/5;if(light_sum>90){SetBeep(1000,200);}if(temperature_aac>38){SetBeep(8000,50);}if(s6>=3){SetBeep(2000,100);P41 &=~ 0X2;}if(s6<3){for( i=0;i<60;i++){P41 |= 0X2;}
}Seg7Print(s0,16+s1,s2,s3,s4,s5,16+s6,s7);   //ÿ160mSÏÔʾһ´Îζȣ¬Ã¿´ÎÊÇ16´Î²âÁ¿µÄƽ¾ù tem%10	
}void main() 
{ Uart1Init(9600);AdcInit(ADCexpEXT);  DisplayerInit();BeepInit();StepMotorInit();SetDisplayerArea(0,7);LedPrint(0);P41 |= 0X2;SetUart1Rxd(rxdbuf, sizeof(rxdbuf), verify, 2);	SetEventCallBack(enumEventSys1S,my1S);	SetEventCallBack(enumEventUart1Rxd, check_received_data);MySTC_Init();	 while(1)             	{ MySTC_OS();    }	             
}                 

硬件电路连接

扩展了树莓派的自动灌溉模块,链接如下:灌溉元件

元件单独使用的链接图,但是由于我们需要获取实时电压,我们选择将 AO 接入到 P1.0 来做数模转换,与之对应的是对于继电器的 IN 端口,我们采用stc-b板的vcc来给它供电,这是因为电池提供的电压是6v,超过了继电器的 5v 需求,电源只用来给水泵供电。

整体线路图

外加电源

黄色的模块竖串联,横断路

检测单元

驱动模块

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

如若内容造成侵权/违法违规/事实不符,请联系编程新知网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IM系统完结了,那简历该怎么写?(含简历项目描述)

作者&#xff1a;冰河 星球&#xff1a;http://m6z.cn/6aeFbs 博客&#xff1a;https://binghe.gitcode.host 文章汇总&#xff1a;https://binghe.gitcode.host/md/all/all.html 星球项目地址&#xff1a;https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…

ELK在Linux服务器下使用docker快速部署(超详细)

ELK是什么&#xff1f; 首先说说什么是ELK ELK 是一个开源的日志管理和分析平台&#xff0c;由三个主要组件组成&#xff1a; Elasticsearch&#xff1a;一个分布式搜索和分析引擎&#xff0c;能够快速存储、搜索和分析大量数据。它是 ELK 堆栈的核心&#xff0c;负责数据的…

C++数据结构-树的深度优先搜索及树形模拟法运用(进阶篇)

1. DFS简介 深度优先搜索算法&#xff08;英语&#xff1a;Depth-First-Search&#xff0c;简称DFS&#xff09;是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点&#xff0c;尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件&am…

C/C++实现植物大战僵尸(PVZ)(打地鼠版)

&#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&#xff0c;后期持续更新系列文章 &#x1f680;如果有错误感谢请大家批评指出&#xff0c;及时修改 &#x1f680;感谢大家点赞&#x1f44d;收藏⭐评论✍ 游戏…

探索Web3前沿:革新性算力共享平台,重塑数字资源利用新时代

基于Web3的算力共享平台 随着区块链技术的不断发展和Web3.0时代的到来,算力共享平台逐渐成为推动数字经济和人工智能发展的重要力量。基于Web3的算力共享平台通过去中心化、分布式网络等技术手段,实现了算力的高效、透明和安全的共享,为人工智能、科学研究、艺术创作等多个…

Maven 常见问题以及常用命令

常见问题 &#xff1a; 1. 识别不了maven项目 mvn clean install -Dmaven.test.skiptrue //构建 2. 打jar包时报异常 指定下jdk版本 常用命令&#xff1a; mvn clean mvn package mvn install mvn deploy

响应式网站的网站建设,需要注意什么?

响应式网站建设需要注意多个方面&#xff0c;以确保网站能够在各种设备和屏幕尺寸上提供一致且良好的用户体验。下面详细介绍响应式网站建设的注意事项&#xff1a; 响应式网站的网站建设&#xff0c;需要注意什么? 考虑多终端适配 设计样式&#xff1a;在设计响应式网站时&…

C++进阶:二叉搜索树

✨✨所属专栏&#xff1a;C✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ ⼆叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树&#xff0c;它或者是⼀棵空树&#xff0c;或者是具有以下性质的⼆叉树: • 若它的左⼦树不为空&#xff0c;则左⼦树上所有结点的值都⼩于等于根结点的值 • 若…

ffmpeg实现视频的合成与分割

视频合成与分割程序使用 作者开发了一款软件&#xff0c;可以实现对视频的合成和分割&#xff0c;界面如下&#xff1a; 播放时&#xff0c;可以选择多个视频源&#xff1b;在选中“保存视频”情况下&#xff0c;会将多个视频源合成一个视频。如果只取一个视频源中一段视频…

Comsol 利用多孔材料填充复合吸声器,拓宽低频完美吸声

参考文献&#xff1a;Cheng B , Gao N , Huang Y ,et al.Broadening perfect sound absorption by composite absorber filled with porous material at low frequency:[J].Journal of Vibration and Control, 2022, 28(3-4):410-424.DOI:10.1177/1077546320980214. 为了提高低…

【C++前后缀分解 动态规划】2100. 适合野炊的日子|1702

本文涉及知道点 C前后缀分解 C动态规划 LeetCode2100. 适合野炊的日子 你和朋友们准备去野炊。给你一个下标从 0 开始的整数数组 security &#xff0c;其中 security[i] 是第 i 天的建议出行指数。日子从 0 开始编号。同时给你一个整数 time 。 如果第 i 天满足以下所有条件…

今天中秋,中秋快乐,分析一个中秋月饼的项目

特色功能 使用obj模型&#xff0c;搭配tga文件&#xff0c;附加上颜色 normalMap 是让字和线条看起来更清楚和真实 高光贴图 凹凸贴图 ...... 源码 https://github.com/Lonely1201/lonely1201.github.io/tree/main/Juejin/mooncake 在线预览 https://lonely1201.githu…

.net core 通过Sqlsugar生成实体

通过替换字符串的方式生成代码&#xff0c;其他代码也可以通这种方式生成 直接上代码 设置模板 将这几个模板文件设置为&#xff1a;嵌入资源 模板内容&#xff1a; using SqlSugar;namespace {Namespace}.Domain.Admin.{ModelName}; /// <summary> /// {TableDisplay…

“钧瓷联合体”激活禹州经济发展新引擎

大禹智库 第 105期&#xff08;总第436期&#xff09; 2024-9-16 钧瓷联合体对禹州经济发展的作用是多方面的&#xff0c;主要体现在以下几个方面&#xff1a; 一、促进钧瓷产业集聚与升级 钧瓷联合体的成立有助于促进钧瓷产业的集聚效应&#xff0c;形成产业集群。通过整合行…

rocky Linux 9.4系统配置zabbix监控MySQL主从复制状态与配置钉钉告警

MySQL主从复制原理&#xff1a; 1. 主从复制的基本概念 主服务器&#xff08;Master&#xff09;&#xff1a;负责处理所有的写操作&#xff08;INSERT、UPDATE、DELETE&#xff09;&#xff0c;并将这些操作记录到二进制日志&#xff08;binary log&#xff09;中。 从服务器…

小程序开发设计-第一个小程序:创建小程序项目④

上一篇文章导航&#xff1a; 小程序开发设计-第一个小程序&#xff1a;安装开发者工具③-CSDN博客https://blog.csdn.net/qq_60872637/article/details/142219152?spm1001.2014.3001.5501 须知&#xff1a;注&#xff1a;不同版本选项有所不同&#xff0c;并无大碍。 一、创…

EndnoteX9安装及使用教程

EndnoteX9安装及使用教程 一、EndNote安装 1.1 下载 这里提供一个下载链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1RlGJksQ67YDIhz4tBmph6Q 提取码&#xff1a;5210 解压完成后&#xff0c;如下所示&#xff1a; 1.2 安装 双击右键进行安装 安装比较简单…

Python酷库之旅-第三方库Pandas(119)

目录 一、用法精讲 526、pandas.DataFrame.head方法 526-1、语法 526-2、参数 526-3、功能 526-4、返回值 526-5、说明 526-6、用法 526-6-1、数据准备 526-6-2、代码示例 526-6-3、结果输出 527、pandas.DataFrame.idxmax方法 527-1、语法 527-2、参数 527-3、…

MySQL之表内容的增删改查

目录 一:Create 二:Retrieve 1.select列 2.where条件 3.结果排序 4. 筛选分页结果 三:Update 四:Delete 1.删除数据 2. 截断表 五&#xff1a;插入查询结果 六&#xff1a;聚合函数 七:group by子句的使用 表内容的CRUD操作 : Create(创建), Retrieve(读取)…

arcgisPro地理配准

1、添加图像 2、在【影像】选项卡中&#xff0c;点击【地理配准】 3、 点击添加控制点 4、选择影像左上角格点&#xff0c;然后右击填入目标点的投影坐标 5、依次输入四个格角点的坐标 6、点击【变换】按钮&#xff0c;选择【一阶多项式&#xff08;仿射&#xff09;】变换 7…