1.stm32开发板:基于温湿度传感器获取数据,并将数据打印在开发板的数码管进行显示

news/2024/12/29 5:07:57/

1.应用层代码

#include "head.h"
#include "user.h"
/*******根据温湿度传感器获取数据并将数据在数码管上显示精度在两位数*********/
int main(int argc, char const *argv[])
{int tem, hum;float tem_h, hum_h;int number = -1;// 用于将温湿度的数据读取传输到应用层int fd_i2c = open("/dev/si7006", O_RDWR);if (fd_i2c < 0){printf("si7006文件打开失败:%d\n", __LINE__);exit(-1);}// 用于将温湿度的组合数据传输到驱动层,控制数码管的亮灭int fd_spi = open("/dev/m74hc595", O_RDWR);if (fd_spi < 0){printf("m74hc595文件打开失败:%d\n", __LINE__);}while (1){/*******I2C做的事********/// 温湿度的数据ioctl(fd_i2c, GET_HUM, &hum);ioctl(fd_i2c, GET_TEM, &tem);// 网络字节序的转换hum = ntohs(hum);tem = ntohs(tem);// 将数字量转换成模拟量hum_h = 125.0 * hum / 65536 - 6;tem_h = 175.72 * tem / 65536 - 46.85;/*******SPI做的事********//*组个数字量模拟量*/number = (int)hum_h * 100 + (int)tem_h;// printf("number=%d\n",number);ioctl(fd_spi, GET_SHUMA1, number);// sleep(1);}return 0;
}

2.驱动层

2.1温湿度的采集

int i2c_read(char reg) // 传输的数据
{short value;          // 发送的数据 因为温湿度占据2个字节char r_buf[] = {reg}; // 寄存器所在的地址int ret;// 封装消息struct i2c_msg r_msg[] = {[0] = {// 写信号的包装.addr = client1->addr, // 从机的地址.flags = 0,            // 表示写.len = sizeof(r_buf),  // 传输的数据大小.buf = r_buf,          // 数据的首地址},[1] = {// 读信号的包装.addr = client1->addr, // 从机地址.flags = 1,            // 表示读.len = 1,.buf = (char *)&value,},};// 信号包装好以后,开始调用数据发送函数ret = i2c_transfer(client1->adapter, r_msg, 2);if (ret != 2){printk("数据传输失败:%d\n", __LINE__);return -EIO;}return value;
}

2.2温湿度转发到用户层

if (cmd == GET_HUM || cmd == GET_TEM){int hum, tem;int ret = -1;switch (cmd){case GET_HUM:// 获取从机发过来的温度数据hum = i2c_read(0xE5);// 将数据发送到用户空间ret = copy_to_user((void *)arg, &hum, 4);if (ret < 0){printk("温度数据传输失败:%d\n", __LINE__);return 0;}break;case GET_TEM:tem = i2c_read(0xE3);// 将数据发送到用户空间ret = copy_to_user((void *)arg, &hum, 4);if (ret < 0){printk("温度数据传输失败%d\n:", __LINE__);return 0;}break;}}

2.3将用户层传输过来的数据,打印在数码管上

 

if (cmd == GET_SHUMA1){char buf[2]="";int shuma[4];shuma[0] = arg / 1000;            // 千shuma[1] = arg % 1000 / 100;      // 百shuma[2] = arg % 1000 % 100 / 10; // 十shuma[3] = arg % 1000 % 100 % 10; // 个for (k = 0; k < 500; k++){for (i = 0; i < 4; i++){buf[0] = 0x1 << i; // 控制哪个灯switch (shuma[i]){case 0:buf[1] = 0x3f;break;case 1:buf[1] = 0x06;break;case 2:buf[1] = 0x5D;break;case 3:buf[1] = 0x4F;break;case 4:buf[1] = 0x66;break;case 5:buf[1] = 0x6D;break;case 6:buf[1] = 0x7D;break;case 7:buf[1] = 0x07;break;case 8:buf[1] = 0x7F;break;case 9:buf[1] = 0x6F;break;}spi_write(spi1, buf, sizeof(buf));   }}}


http://www.ppmy.cn/news/907330.html

相关文章

Android 百度地图开发--- 导航功能输入起始地址实现导航,地址解析与反解析的使用

转载请注明出处http://blog.csdn.net/u012324136/article/details/50826147 本人主要介绍安卓开发使用百度地图实现导航功能&#xff0c;用户可以输入当前位置和目的地&#xff0c;实现导航。 首先&#xff0c;我们需要当用户输入具体接到地址后将具体街道的地址转化为经度和…

百度地图怎么查看全景(教程)

手机地图导航可以帮助用户快速定位到目的地。还可以查看周边商圈。出行非常方便。使用百度地图还可以精细到查看全景视角。遇到小区、体育场馆。还可以切换查看内景。要如何开启全景图呢&#xff1f; 百度地图查看全景怎么做 1.进入百度地图首页面。点击右侧图层按钮。更改地…

Win10快捷键大全快速开发切换操作之道

目录 第一部分&#xff1a;Windows10系统快捷键 复制、粘贴和其他常规快捷键 Windows徽标键快捷键 命令提示符快捷键 对话框快捷键 文件资源管理器快捷键 虚拟桌面快捷键 任务栏快捷键 《设置》快捷键 第二部分&#xff1a;Windows10应用的快捷键 《Microsoft Edge浏…

Android AVD Manager - 安卓虚拟机的设置

AVD Manager : Android Virtual Device Manager QVGA :240x320 quarter of VGA HVGA :320x480 Half of VGA VGA :480x640 WVGA :480x800 Wide VGA FWVGA:480x854 AVD设置技巧 实际AVD设置说明 iu手动安装下硬件加速: SDK Manager - Extra: SDK 目录下&#xff1a; silent_…

android drawable几个文件夹对应的分辨率(屏幕适配)

大佬详细文章&#xff08;讲解屏幕适配&#xff09;&#xff1a; https://blog.csdn.net/love_xsq/article/details/43266863#commentBox ldpi&#xff1a;240x320 mdpi&#xff1a;320x480 hdpi&#xff1a;480x800、480x854 xhdpi&#xff1a;至少960*720 xxhdpi&#xff1a…

Docker安装卸载

说明&#xff1a;在大型的项目开发中&#xff0c;各种开发软件所需的环境各不相同&#xff0c;所需的依赖也时常发生冲突。而Docker将开发软件&#xff0c;和所需的依赖、函数库、配置打包成一个可移植的镜像文件&#xff0c;在Docker的容器中运行&#xff0c;使用沙箱机制&…

根据屏幕大小设置字体

public static int adjustFontSize(int screenWidth, int screenHeight){if (screenWidth < 240) { // 240X320 屏幕return 10;}else if (screenWidth < 320){ // 320X480 屏幕return 14;}else if (screenWidth < 480){ // 480X800 或 480X854 屏幕return …

用ESP学习单片机之Arduino_Esp-32s点亮2.8‘‘TFT LCD屏幕_ILI9341_SPI_240x320_V1.2

简介 板子&#xff1a; Esp 32s开发板屏幕&#xff1a; 2.8‘’ TFT LCD &#xff08;ILI9341、SPI&#xff09;IDE&#xff1a; Arduino库&#xff1a;Ucglib 玩Arduino也有一阵子了&#xff0c;B站小电视和天气始终带火了0.96寸的OLED&#xff0c;上手简单&#xff0c;确实好…