学习笔记|如何用Go程序采集温湿度传感器数据

news2024/9/21 20:26:07

在共创社内部的交流中,先前有一位成员展示了如何借助C语言来实现对AHT20温湿度传感器数据的读取。这一实例触发了另一位共创官的灵感,他决定采纳Go语言重新构建这一数据采集流程。接下来,我们将详细解析整个利用Go语言从AHT20温湿度传感器获取数据的完整步骤和实现方法。

一、C程序获取AHT20温湿度

1、参考ElfBoard官方例程:03-例程源码\03-1 命令行例程源码\09_elf1_cmd_aht20\elf1_cmd_aht20.c

#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "sys/ioctl.h"
#include "fcntl.h"
#include "stdlib.h"
#include "string.h"
#include <poll.h>
#include <sys/select.h>
#include <sys/time.h>
#include <signal.h>
#include <fcntl.h>

#define AHT20_DEV "/dev/aht20"

int main(int argc, char *argv[])
{
    int fd;
    unsigned int databuf[2];
    int c1,t1; 
    float hum,temp;
    int ret = 0;

    fd = open(AHT20_DEV, O_RDWR);
    if(fd < 0) {
        printf("can't open file %s\r\n", AHT20_DEV);
        return -1;
    }

    while (1) {
        ret = read(fd, databuf, sizeof(databuf));
        if(ret == 0) {       /* ?????? */

            c1 = databuf[0]*1000/1024/1024;  //
            t1 = databuf[1] *200*10/1024/1024-500;
            hum = (float)c1/10.0;
            temp = (float)t1/10.0;

            printf("hum = %0.2f temp = %0.2f \r\n",hum,temp);
            usleep(500000); 
        }
    }
    close(fd);  
    return 0;
}

2、使用交叉编译环境编译,拷贝到开发板

图片

3、运行程序查看结果

图片

二、Go程序获取AHT20温湿度

1、参考C程序使用Go程序复现,代码如下:

package main

import (
  "fmt"
  "syscall"
  "time"
  "unsafe"
)

const Aht20Dev = "/dev/aht20"

func main() {
  fd, err := syscall.Open(Aht20Dev, syscall.O_RDWR, 0)
  if err != nil {
    fmt.Printf("can't open file %s: %s\n", Aht20Dev, err)
    return
  }
  defer syscall.Close(fd)

  buf := make([]byte, 8)
  const delay = 500 * time.Millisecond

  var c1, t1 int
  var hum, temp float32

  for {
    n, err := syscall.Read(fd, buf)
    if err != nil {
      fmt.Println("Read err", err)
    }
    if n == 0 {
      c1 = int(*(*uint32)(unsafe.Pointer(&buf[0]))) * 1000 / 1024 / 1024
      t1 = int(*(*uint32)(unsafe.Pointer(&buf[4])))*200*10/1024/1024 - 500
      hum = float32(c1) / 10.0
      temp = float32(t1) / 10.0

      fmt.Printf("hum = %.2f temp = %.2f\n", hum, temp)
      time.Sleep(delay)
    }
  }

  syscall.Close(fd)
}

2、修改构建配置,添加环境参数:GOOS=linux;GOARCH=arm;GOARM=7。编译输出后拷贝到开发板。并修改可执行权限:chmod 777 go_temp_linux

3、运行查看结果

图片

三、将该功能整合到Web服务中

1、建立Gin Web项目

为了方便后续功能拓展,我这里重新建立了一个较为完整的Web项目。目录结构如下:

图片

并且对resp进行了简单的封装。

2、有关AHT20温湿度传感器的部分

(1)AHT20温湿度传感器Logic

package aht20Logic

import (
  "fmt"
  "syscall"
  "unsafe"
)

const Aht20Dev = "/dev/aht20"

type HumAndTemp struct {
  Hum  float32 `json:"hum,omitempty"`
  Temp float32 `json:"temp,omitempty"`
}

func ReadHumAndTemp() (HumAndTemp, error) {
  fd, err := syscall.Open(Aht20Dev, syscall.O_RDWR, 0)
  if err != nil {
    fmt.Printf("can't open file %s: %s\n", Aht20Dev, err)
    return HumAndTemp{}, nil
  }
  defer syscall.Close(fd)

  buf := make([]byte, 8)

  n, err := syscall.Read(fd, buf)
  if err != nil {
    fmt.Println("Read err", err)
  }
  if n == 0 {
    c1 := int(*(*uint32)(unsafe.Pointer(&buf[0]))) * 1000 / 1024 / 1024
    t1 := int(*(*uint32)(unsafe.Pointer(&buf[4])))*200*10/1024/1024 - 500
    _ = syscall.Close(fd)
    return HumAndTemp{Hum: float32(c1) / 10.0, Temp: float32(t1) / 10.0}, nil
  }

  return HumAndTemp{}, nil
}

(2)ATH20温湿度传感器Handler

package aht20Handler

import (
  "Web/logic/aht20Logic"
  "Web/utils/resp"
  "github.com/gin-gonic/gin"
)

func HumAndTemp(c *gin.Context) {
  data, err := aht20Logic.ReadHumAndTemp()
  if err != nil {
    resp.Fail(c, 500, resp.CodeSystemErr)
  }

  resp.Success(c, data)
}

(3)router(由于目前只有两个路由组所以就先写到一个文件中,后续模块增加了再继续分隔)

package routers

import (
  "Web/controller/aht20Handler"
  "Web/controller/testHandler"
  "github.com/gin-gonic/gin"
)

const (
  baseUrl = "elf1"
)

func SetRouter() *gin.Engine {
  r := gin.Default()

  test := r.Group(baseUrl + "/test")
  {
    test.GET("ping", testHandler.PingPong)
  }

  aht20 := r.Group(baseUrl + "/aht20")
  {
    aht20.GET("hum-temp", aht20Handler.HumAndTemp)
  }

  return r
}

四、编译、测试

1、添加编译环境参数:GOOS=linux;GOARCH=arm;GOARM=7,执行编译,拷贝到开发板,修改可执行权限

2、启动服务,进行测试

图片

图片

3、可以看到服务正常运行,得到温湿度信息

至此,就完成了通过Go语言实现对AHT20温湿度数据的有效采集。这一成果的达成,充分展现了共创社成员对嵌入式研发的探索精神。期待这一实践经历能够为更多的嵌入式爱好者提供有价值的参考借鉴。

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

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

相关文章

图论基础|695. 岛屿的最大面积、1020. 飞地的数量、130. 被围绕的区域

695. 岛屿的最大面积 力扣题目链接(opens new window) 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0&#xff0…

WebGIS航线编辑器(无人机航线规划)

无人机航点、航线规划&#xff0c;实现全自动航点飞行作业及飞行航拍。禁飞区、作业区功能保障飞行安全。 GIS引擎加载 const viewer new Cesium.Viewer("cesiumContainer", { imageryProvider: new Cesium.IonImageryProvider({ assetId: 3872 }), }); const im…

水泥领域智慧工厂物联网解决方案

水泥领域智慧工厂物联网解决方案 在水泥生产行业中&#xff0c;构建智慧工厂物联网解决方案已经成为推动产业升级、实现智能制造的关键路径。该方案深度融合了先进的信息技术与传统的水泥生产工艺&#xff0c;通过全面感知、可靠传输、智能处理等环节&#xff0c;实现了对整个…

打造高效自动化渗透测试系统:关键步骤与实践

随着当前网络安全威胁的不断扩展与升级&#xff0c;开展渗透测试工作已经成为广大企业组织主动识别安全漏洞与潜在风险的关键过程。然而&#xff0c;传统的人工渗透测试模式对测试人员的专业能力和经验水平有很高的要求&#xff0c;企业需要投入较大的时间和资源才能完成。在此…

[实践经验]: visual studio code 实用技巧

目录 editor rulers 这里主要总结一些常用的VScode技巧&#xff0c;不定时更新… editor rulers 设置 -> 搜索 editor.rulers -> edit in settings.json "editor.rulers": [{"column": 80,"color": "#ff00FF"},]效果如图

基于Java的汽车客运站管理系统的设计与实现论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对汽车客运站售票信息管理混乱&#xff0c;出错率高&#xff0c;信息安…

Tensorflow2.0笔记 - FashionMnist数据集训练

本笔记使用FashionMnist数据集&#xff0c;搭建一个5层的神经网络进行训练&#xff0c;并统计测试集的精度。 本笔记中FashionMnist数据集是直接下载到本地加载的方式&#xff0c;不涉及用梯子。 关于FashionMnist的介绍&#xff0c;请自行百度。 #Fashion Mnist数据集本地下载…

2024开年首展,加速科技展台“热辣滚烫”

3月20日&#xff0c;备受瞩目的半导体行业盛会SEMICON China 2024在上海新国际博览中心盛大启幕&#xff0c;展会汇集了来自全球的半导体领域顶尖企业与专业人士。加速科技作为业界领先的半导体测试设备供应商携重磅测试设备及解决方案精彩亮相&#xff0c;展示了最新的半导体测…

陈巍:Sora大模型技术精要万字详解(上)——原理、关键技术、模型架构详解与应用

​目录 收起 1 Sora的技术特点与原理 1.1 技术特点概述 1.2 时间长度与时序一致性 1.3 真实世界物理状态模拟 1.4 Sora原理 1.4.1扩散模型与单帧图像的生成 1.4.2 Transformer模型与连续视频语义的生成 1.4.3 从文本输入到视频生成 2 Sora的关键技术 2.1 传统文生图技…

GitHub Copilot怎么取消付费?

0. 前言 GitHub Copilot非常好用&#xff0c;还没有使用过的同学可以参考教程白嫖一个月&#xff1a;【保姆级】VsCode 安装GitHub Copilot实操教程 GitHub Copilot每月10美元的费用对于一些用户来说可能是一笔不小的开销。如果你已经完成了GitHub Copilot的免费试用&#xf…

痛失offer的八股

java面试八股 mysql篇&#xff1a; 事物的性质&#xff1a; 事物的性质有acid四特性。 a&#xff1a;automic&#xff0c;原子性&#xff0c;要么全部成功&#xff0c;要么全部失败&#xff0c;mysql的undolog&#xff0c;事物在执行的时候&#xff0c;mysql会进行一个快照读…

C#多态性

文章目录 C#多态性静态多态性函数重载函数重载 动态多态性运行结果 C#多态性 静态多态性 在编译时&#xff0c;函数和对象的连接机制被称为早期绑定&#xff0c;也被称为静态绑定。C# 提供了两种技术来实现静态多态性。分别为&#xff1a; 函数重载 运算符重载 运算符重载将…

MINT: Detecting Fraudulent Behaviors from Time-series Relational Data论文阅读笔记

2. 问题定义 时间序列关系数据&#xff08;Time Series Relation Data&#xff09; 这个数据是存放在关系型数据库中&#xff0c;每一条记录都是泰永时间搓的行为。 更具体地&#xff0c;每条记录表示为 x ( v , t , x 1 , x 2 , … , x m − 2 ) x (v,t,x_1,x_2,\dots,x…

是德科技keysight N9917A微波分析仪

181/2461/8938产品概述&#xff1a; N9917A 是一款使用电池供电的便携式分析仪&#xff1b;基本功能是电缆和天线分析&#xff1b;配置还包括频谱和网络分析仪、可选的内置功率计和矢量电压表。 N9917A FieldFox 手持式微波分析仪 主要特性和功能 18 GHz 最大频率&#xfef…

docker 容器挂掉,无法exec 进入bash 怎么修改容器里的文件

在使用tdengine 数据库时出现了 TDengine.Driver.TDengineError:“code:[0x334],error:Out of dnodes” 查找文档发现需要修改一个配置文件 。 /etc/taos/taos.cfg 中的 supportVnodes 参数 于是修改 保存。然后&#xff0c;运行出错。 03/21 06:56:27.986498 00000064 …

UE5 C++增强输入

一.创建charactor&#xff0c;并且包含增强输入相关的头文件 1.项目名.build.cs。添加模块“EnhancedInput”&#xff0c;方便找到头文件和映射的一些文件。 PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine&q…

服务器总是宕机问题记录

博主介绍&#xff1a; 22届计科专业毕业&#xff0c;来自湖南&#xff0c;主要是在CSDN记录一些自己在Java开发过程中遇到的一些问题&#xff0c;欢迎大家一起讨论学习&#xff0c;也欢迎大家的批评指正。 文章目录 背景调整总结 背景 2核2G的服务器&#xff0c;服务器安装了t…

Spark Rebalance hint的倾斜的处理(OptimizeSkewInRebalancePartitions)

背景 本文基于Spark 3.5.0 目前公司在做小文件合并的时候用到了 Spark Rebalance 这个算子&#xff0c;这个算子的主要作用是在AQE阶段的最后写文件的阶段进行小文件的合并&#xff0c;使得最后落盘的文件不会太大也不会太小&#xff0c;从而达到小文件合并的作用&#xff0c;…

CSS弹性盒模型(学习笔记)

一、厂商前缀 1.1 作用 解决浏览器对C3新特性的兼容&#xff0c;不同的浏览器厂商&#xff0c;定义了自己的厂商前缀 1.2 语法 浏览器 厂商前缀内核(渲染引擎)&#xff1a;解析htmlcssjs谷歌 -webkit-blink苹果-webkit-webkit欧朋-o-blink火狐 -moz-geckoIE-ms- trid…

sentinel流控规则详解(图形化界面)

1、QPS 每秒的请求数&#xff0c;超过这个请求数&#xff0c;直接流控。 2、BlockException统一异常处理 2.1、创建异常返回类 Result.class public class Result<T> {private Integer code;private String msg;private T data;public Result(Integer code, String ms…