基于CH32V307的温度显示功能

第一部分 设计概述

1.1 设计目的

    在智能工业生产现场中,生产设备的控制依赖于传感器读数以及相关算法等。而传感器起着至关重要的作用,传感器的驱动和数据传输依赖于微控制器,
系统基于沁恒 CH32V307 微控制器进行数据收集、服务器进行数据处理和,中
间基于服务器通过串口与微控制器进行数据传输处理并通过以太网与服务器交
互。服务器端,可实现数据库、数据可视化显示和设备交互;微控制器端通过
操作系统执行传感器驱动进程、以太网传输进程、工业现场数据显示等进程;
工业控制器端。

1.2硬件介绍

首先介绍一下我们使用的开发板:我们使用的是CH32V307开发板。该板使用的是南京沁恒微电子推出的一款基于RISC-V MCU CH32V307内核的开发板。CH32V307系列是基于32位RISC-V设计的互联型微控制器,配备了硬件堆栈区、快速中断入口,在标准RISC-V基础上大大提高了中断响应速度。加入单精度浮点指令集,扩充堆栈区,具有更高的运算性能。扩展串口UART数量到8组,电机定时器到4组。提供USB2.0高速接口(480Mbps)并内置了PHY收发器,以太网MAC升级到千兆并集成了10M-PHY模块。

1.3 主要技术特点

    微控制器使用了显示屏、温湿度传感器以及以太网模块。控制器驱动温湿度模块测量温湿度;显示屏显示传感器名称温湿度名称以及数值;以太网采用
芯片自带 10M 处理模块,外接以太网接口,采用官方驱动库进行数据传输。数
据传输至服务器 python socket 进行以太网数据接收处理。

1.4 关键性能指标

(1) MCU
    CH32V307VCT6,主频 144MHz,FLASH 和 RAM 四种配置
    288KB FLASH ,32KB RAM
    256KB FLASH ,64KB RAM
    224KB FLASH ,96KB RAM
    192KB FLASH ,128KB RAM
    CH32V307V-R0 是 南京沁恒微电子(WCH) 推出的一款基于 RISC-V 内核的开发板,最高主频为 120Mhz,该开发板芯片为 CH32V307-R0。

 

主控片上资源

(2) AHT10
    温度范围为: 测量范围为 -40 ℃ ~+ 85 ℃ 精度±0.5℃;
    湿度范围为:测量范围为 0% - 100% 精度为±3%RH;
(3) 以太网:ETH 支持 10M

1.5 主要创新点

(1) MCU 自带以太网处理模块
    (2) 采用 TCP 连接,数据传输准确

第二部分 系统组成及功能说明

2.1 整体介绍

 

系统结构

2.2 各模块介绍

(一)开发板

a) MCU
  MCU 作为核心处理器,驱动周围模块并与外界进行通信。
b) 温湿度模块
  温湿度传感器测量物理环境的温湿度,由 MCU 驱动,通过 IIC 协议与
MCU 进行数据传输。

 

温湿度模块

c) 显示屏
    显示屏作为人机交互界面有 MCU 驱动显示。显示内容包括温湿度传感器信
号;温湿度以及数值等内容
d) 以太网模块
    以太网模块为 MCU 外界以太网接口,无相关转接芯片。

(二)服务器

    以 PC 作为服务器接口,使用 Python Socket 建立服务器。通过绑定 IP 以及
端口进行输出传输以及相关数据的处理等内容。

import socket,os
server = socket.socket()
server.bind(("192.168.1.100",1000))
server.listen(5)
 
#数据暂存器
TEMP = [b'H',b'2']
 
while True:
    conn,addr = server.accept()
    print("Connected to:",addr)
    while True:
        #接收两个字节数据
        data = conn.recv(2)
        #判断接收的字节是否为空,为空则退出
        if not data:
            print("Connected break")
            break
        #将两个字节切片
        info = [data[i:i+1] for i in range(0, len(data), 1)]
        #print(len(info))
        if len(info) == 2 :
            TEMP[0] = info[0]
            TEMP[1] = info[1]
        #字节判断转换输出
        if (TEMP[0] == b'H') :
            print('H',ord(TEMP[1]))
        if (TEMP[0] == b'T') :
            print('T',ord(TEMP[1]))
 
server.close()

第三部分 完成情况及性能参数

(一)显示屏模块

    显示屏温湿度显示

 

显示屏温湿度显示

(二)服务器模块

 

Python Socket TCP连接

第四部分 主控关键代码

点击查看代码

#include "debug.h"
#include "WCHNET.h"
#include "string.h"
#include "lcd.h"
#include "AHT_10.h"
 
int32_t temperature, humidity;
char temp[2];
 __attribute__((__aligned__(4))) ETH_DMADESCTypeDef DMARxDscrTab[ETH_RXBUFNB];                        /* MAC接收描述符 ,4字节对齐*/
 __attribute__((__aligned__(4))) ETH_DMADESCTypeDef DMATxDscrTab[ETH_TXBUFNB];                        /* MAC发送描述符,4字节对齐 */
 
 __attribute__((__aligned__(4))) u8  MACRxBuf[ETH_RXBUFNB*ETH_MAX_PACKET_SIZE];                       /* MAC接收缓冲区,4字节对齐 */
 __attribute__((__aligned__(4))) u8  MACTxBuf[ETH_TXBUFNB*ETH_MAX_PACKET_SIZE];                       /* MAC发送缓冲区,4字节对齐 */
__attribute__((__aligned__(4))) SOCK_INF SocketInf[WCHNET_MAX_SOCKET_NUM];                           /* Socket信息表,4字节对齐 */
const u16 MemNum[8] = {WCHNET_NUM_IPRAW,
                         WCHNET_NUM_UDP,
                         WCHNET_NUM_TCP,
                         WCHNET_NUM_TCP_LISTEN,
                         WCHNET_NUM_TCP_SEG,
                         WCHNET_NUM_IP_REASSDATA,
                         WCHNET_NUM_PBUF,
                         WCHNET_NUM_POOL_BUF
                         };
const u16 MemSize[8] = {WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_IPRAW_PCB),
                          WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_UDP_PCB),
                          WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_TCP_PCB),
                          WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_TCP_PCB_LISTEN),
                          WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_TCP_SEG),
                          WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_IP_REASSDATA),
                          WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_PBUF) + WCHNET_MEM_ALIGN_SIZE(0),
                          WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_PBUF) + WCHNET_MEM_ALIGN_SIZE(WCHNET_SIZE_POOL_BUF)
                         };
 __attribute__((__aligned__(4)))u8 Memp_Memory[WCHNET_MEMP_SIZE];
 __attribute__((__aligned__(4)))u8 Mem_Heap_Memory[WCHNET_RAM_HEAP_SIZE];
 __attribute__((__aligned__(4)))u8 Mem_ArpTable[WCHNET_RAM_ARP_TABLE_SIZE];
 
 
#define RECE_BUF_LEN                          WCHNET_TCP_MSS*2                                   /*socket接收缓冲区的长度,最小为TCP MSS*/
 
u8 MACAddr[6];                                                                                   /*Mac地址*/
u8 IPAddr[4] = {192,168,1,10};                                                                   /*IP地址*/
u8 GWIPAddr[4] = {192,168,1,1};                                                                  /*网关*/
u8 IPMask[4] = {255,255,255,0};                                                                  /*子网掩码*/
u8 DESIP[4] = {192,168,1,100};                                                                   /*目的IP地址*/
u8 connectStatus=0;
u8 SocketId;                                                                                     /*socket id号*/
u8 SocketRecvBuf[WCHNET_MAX_SOCKET_NUM][RECE_BUF_LEN];                                           /*socket缓冲区*/
u8 MyBuf[RECE_BUF_LEN];
u16 desport=1000;                                                                                /*目的端口号*/
u16 srcport=1000;                                                                                /*源端口号*/
/********************************************************************
 * @fn      Ethernet_LED_Configuration
 * @brief   set eth data and link led pin
 * @return  none
 */
void Ethernet_LED_Configuration(void)
{
    GPIO_InitTypeDef  GPIO;
 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    GPIO.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
    GPIO.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO);
    Ethernet_LED_LINKSET(1);
    Ethernet_LED_DATASET(1);
}
 
 
/*********************************************************************
 * @fn      Ethernet_LED_LINKSET
 *
 * @brief   set eth link led,setbit 0 or 1,the link led turn on or turn off
 *
 * @return  none
 */
void Ethernet_LED_LINKSET(u8 setbit)
{
     if(setbit){
         GPIO_SetBits(GPIOB, GPIO_Pin_8);
     }
     else {
         GPIO_ResetBits(GPIOB, GPIO_Pin_8);
    }
}
/*********************************************************************
 * @fn      Ethernet_LED_DATASET
 *
 * @brief   set eth data led,setbit 0 or 1,the data led turn on or turn off
 *
 * @return  none
 */
void Ethernet_LED_DATASET(u8 setbit)
{
     if(setbit){
         GPIO_SetBits(GPIOB, GPIO_Pin_9);
     }
     else {
         GPIO_ResetBits(GPIOB, GPIO_Pin_9);
    }
}
  1. 心得和体会

在本次水感控制系统的制作中,遇到了许多问题,有理论上的,也有操作失误。通过这个项目,使我加深了对单片机知识的理解,明白了理论知识的学习要配合动手实践才能取得更好的效果!

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

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

相关文章

NetSuite nlapiRunReport隐秘的API

作为中国现金流量表剖析的后续篇,今朝我们谈一个隐秘函数。在几周之前,当用户问我:“SuiteScript能调用标准财务报表的运行结果么?”。我的答案是“No!”,斩钉截铁。但是直到我们从代码堆里发现了这个API -…

被 ChatGPT 点燃的向量数据库们

主要观点: 向量数据库可以让开发者以向量嵌入的形式处理非结构化数据(两个向量之间的距离代表了它们的关联性),这对于使用和扩展大型语言模型(LLM)尤为重要。 1、Pinecone 是个全托管的 SaaS 向量数据库厂商…

AI批改英语作文行不行?免费,覆盖雅思考研四六级,打分评语纠错都得有 | 测评...

茕茕 发自 凹非寺量子位 报道 | 公众号 QbitAI 我,一个科技小编,最近在跟国外大佬的邮件交流中,感到飘过六级后的自己英语写作水平那真是日渐捉急。 从句怎么用?时态对不对?看着对面主编犀利的目光,那一瞬间…

如何让ChatGPT成为你最佳的模拟面试官

正在上传…重新上传取消 ChatGPT云炬学长 1 人赞同了该文章 如何让ChatGPT成为你最佳的模拟面试官随着技术的不断发展,越来越多的企业开始使用人工智能面试官来帮助筛选候选人,ChatGPT作为其中的一种代表,正在受到越来越多的关注。那么如何…

春种一粒粟:企业如何修炼好云原生内功?

日月盈昃,辰宿列张。寒来暑往,秋收冬藏。 《千字文》里蕴藏了一种人与天地之间共处的智慧,那就是想要收获粮食,一定要提前播种。农耕如此,百业如此,数字化创新也是一样。 数字化技术,已经成为全…

《云原生构建数字世界》简介

云原生是在云计算时代指导企业基于云架构设计和开发应用,并将应用向云端迁移的一套全新的技术理念。与传统应用相比,所谓的云原生应用即为云而生。构筑数字世界新未来的关键是用云原生的思维去践行,未来数字世界的基础就是建立在云原生之上&a…

用云原生思维践行云原生,你做对了吗?

有了ChatGPT,你还会再用关键字进行搜索吗?这就像企业已经上了云,还会再退回老路,自己摆弄服务器、存储吗?无论从技术的持续演进,还是从应用现代化的需求来看,企业上云,开弓没有回头箭&#xff…

字符串 - 二进制和文本字符串 - 探究

1.应用场景 主要用于探究字符串中的二进制和文本字符串,以及它们的区别和应用场景。 2.学习/操作 1.文档阅读 重要来自于与chatgpt的对话问答 以及其他技术文章 2.整理输出 2.1 是什么 二进制和文本字符串都是计算机中常用的数据类型,前者主要用于存储…

chatgpt赋能python:用Python抢优惠券,快速低价购物!

用Python抢优惠券,快速低价购物! 优惠券在购物时可以给我们带来很大的优惠,可是抢到优惠券的几率并不是那么高。有了Python,我们可以编写自己的优惠券抢购程序,快速抢到心仪的优惠券,无需反复手动尝试&…

chatgpt赋能python:长截图是什么?

长截图是什么? 长截图是一种比较新颖的网页截图方式,它的特点就是可以将整个页面的内容全部截取下来,让用户通过滚动鼠标来浏览这个页面的所有内容。这种截图方式在移动端比较常见,因为移动端的屏幕较小,往往需要滚动…

体外诊断(POCT)之软件介绍

这是2016上半年的研究成果,其中包括了概率统计,密码学,软件逆向,图像编解码,图像识别,多媒体指令优化等多个学科知识的交叉 下面即从技术角度,对所用得到的知识开发的这个产品进行一个简易的描述说明. 扩展阅读: 体外诊断(POCT)之软件入口配置修改 体外诊断(POCT)之系统配置文…

医疗信息管理系统(HIS)——>业务介绍

目录 一、项目背景 二、业务 三、门诊流程 四、住院流程 五、页面原型初稿(门诊)介绍 六、 页面原型初稿(住院)介绍 七、页面原型初稿(药房药库)介绍 一、项目背景 医疗信息系统是现代化医院运营的必…

三款实用分析诊断工具简介

当处理海量数据的时候,很容易出现各种异常和性能瓶颈,这时常常需要分析程序运行行为和性能瓶颈以优化系统性能。这里简单介绍了三种强大的分析诊断工具以帮助大家更快更好的完成优化工作。 1.Arthas Arthas是 阿里巴巴开源的一款 Java 线上诊断工具&…

玩转群晖NAS——前言

一直以来就有购置一台家用服务器的想法,趁着双十一赶紧购置一波,于是就买了个群晖DS920还有4个8T的希捷酷狼Pro硬盘,花了我一万多的钱,心疼归心疼,东西到手之后的兴奋还是远远大于剁手之痛的。迫不及待地安装上之后&am…

怎么把群晖个人用户空间相片映射到公共空间/photo

怎么把群晖个人用户空间相片映射到公共空间/photo 1.打开File Station 到homes 目录下对应用户名右键复制用户名路径 这里复制/volume1/home/user1 2.打开控制面板进入任务计划新增触发任务事件选开机用户账户选root 任务设置用户自定义脚本填入脚本点确定回到任务。 mkdir /…

有了群晖怎么玩,分享一下我的群晖中运行的服务

原文网址:https://post.smzdm.com/p/a07mk7z9/ 我前几篇文章中说了我在服务器中弄了个虚拟机群晖,很多朋友在没有入手群晖的时候不知道群晖这玩意买来干嘛,花这么多钱,这篇文章就讲讲群晖有那些好玩实用的东西 一、Drive-套件文…

如何使用群晖nas快速收集多份文件?

经常需要在工作中收集文件的小伙伴是否遇到了一个共同的问题⚠: 比如老板让你收集公司员工的工作报告时,你一打开邮箱,几十封、几百封邮件就会涌进来,需要进行下载上百封邮件需要下载。有时候一些同事通过QQ、微信等各种app发送&a…

群晖NAS与Windows系统实现共享文件夹同步方案

一、在Windows系统中创建需要共享的文件夹 操作步骤如下: ①选中需要共享的文件夹,选择“属性”。 ②在属性弹窗中选择“共享”-->“高级共享”-->“权限”-->"添加"-->"高级"-->"立即查找"选择合适的账…

3.3 利用群晖:群辉与PC电脑直连,实现万兆/2.5G速度文件互传(解决 直连后 网络/外网/网页 访问变慢,直连后群辉无网络 cloud sync无网络)

为黑群晖和电脑装备了万兆X540 T2网卡,为实现万兆速度的文件互传,决定将黑群晖直连PC,其需要注意的点有以下三点: 修改PC和群辉的IPv4: 为实现固定IP访问群辉,这里建议修改PC和群辉均为固定IP。 1&#xff…

[NAS] Synology (群晖) DSM 7.X 挂载NTFS硬盘

前言 群晖默认支持的文件系统有btrfs和ext4,对于一些媒体影音游戏等比较大的文件,组RAID做热备对于笔者个人来说不太划算, 而在系统升级或者换设备备份时候把这些挟裹进去,备份文件则是巨大无比. 笔者的分盘策略是RAID5只存系统软件类电子书之类的软件, 挂载NTFS做云备份 冷备…