在共創(chuàng)社內(nèi)部的交流中,先前有一位成員展示了如何借助C語言來實(shí)現(xiàn)對AHT20溫濕度傳感器數(shù)據(jù)的讀取。這一實(shí)例觸發(fā)了另一位共創(chuàng)官的靈感,他決定采納Go語言重新構(gòu)建這一數(shù)據(jù)采集流程。接下來,我們將詳細(xì)解析整個利用Go語言從AHT20溫濕度傳感器獲取數(shù)據(jù)的完整步驟和實(shí)現(xiàn)方法。
一、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 #include #include #include #include #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、使用交叉編譯環(huán)境編譯,拷貝到開發(fā)板

3、運(yùn)行程序查看結(jié)果

二、Go程序獲取AHT20溫濕度
1、參考C程序使用Go程序復(fù)現(xiàn),代碼如下:
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、修改構(gòu)建配置,添加環(huán)境參數(shù):GOOS=linux;GOARCH=arm;GOARM=7。編譯輸出后拷貝到開發(fā)板。并修改可執(zhí)行權(quán)限:chmod 777 go_temp_linux
3、運(yùn)行查看結(jié)果

三、將該功能整合到Web服務(wù)中
1、建立Gin Web項(xiàng)目
為了方便后續(xù)功能拓展,我這里重新建立了一個較為完整的Web項(xiàng)目。目錄結(jié)構(gòu)如下:

并且對resp進(jìn)行了簡單的封裝。
2、有關(guān)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(由于目前只有兩個路由組所以就先寫到一個文件中,后續(xù)模塊增加了再繼續(xù)分隔)
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、添加編譯環(huán)境參數(shù):GOOS=linux;GOARCH=arm;GOARM=7,執(zhí)行編譯,拷貝到開發(fā)板,修改可執(zhí)行權(quán)限
2、啟動服務(wù),進(jìn)行測試


3、可以看到服務(wù)正常運(yùn)行,得到溫濕度信息
至此,就完成了通過Go語言實(shí)現(xiàn)對AHT20溫濕度數(shù)據(jù)的有效采集。這一成果的達(dá)成,充分展現(xiàn)了共創(chuàng)社成員對嵌入式研發(fā)的探索精神。期待這一實(shí)踐經(jīng)歷能夠?yàn)楦嗟那度胧綈酆谜咛峁┯袃r值的參考借鑒。
-
傳感器
+關(guān)注
關(guān)注
2565文章
52873瀏覽量
766443 -
嵌入式
+關(guān)注
關(guān)注
5148文章
19635瀏覽量
316872 -
Linux
+關(guān)注
關(guān)注
87文章
11507瀏覽量
213498 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5652瀏覽量
104113
發(fā)布評論請先 登錄
評論