CubieBoard博客-HomeCubieTech公司网站

cubie.cc CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 663|回复: 0

CB4获取温湿度传感器SHT30传感器数据

[复制链接]

23

主题

0

好友

5738

积分

论坛元老

Rank: 8Rank: 8

贡献
1068
金钱
2415
威望
1068
买家信用
卖家信用
积分
5738
发表于 2019-12-24 12:21:26 |显示全部楼层
SHT30传感器直接接在I2C的接口上,然后直接上代码就行了。不知道这缩进咋回事。
  1. package main

  2. import (
  3.         "bytes"
  4.         "encoding/binary"
  5.         "fmt"
  6.         "os"
  7.         "syscall"
  8.         "time"
  9. )

  10. func getTempAndHum() (temp, hum string) {
  11.         addr := 0x44
  12.         f, err := os.OpenFile("/dev/i2c-0", os.O_RDWR, 0666)
  13.         if err != nil {
  14.                 return
  15.         }
  16.         defer f.Close()
  17.         if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, f.Fd(), 0x0703, uintptr(addr), 0, 0, 0); err != 0 {
  18.                 return
  19.         }
  20.         _, err = f.Write([]byte{0x24, 0x00})
  21.         if err != nil {
  22.                 return
  23.         }
  24.         time.Sleep(15500 * time.Microsecond)
  25.         const blockSize = 3
  26.         data := make([]struct {
  27.                 Data [2]byte
  28.                 CRC  byte
  29.         }, 2)

  30.         buf1 := make([]byte, 6)
  31.         _, err = f.Read(buf1)
  32.         if err != nil {
  33.                 return
  34.         }
  35.         buf := bytes.NewBuffer(buf1)
  36.         err = binary.Read(buf, binary.BigEndian, data)
  37.         if err != nil {
  38.                 return
  39.         }
  40.         var results []uint16
  41.         for i := 0; i < 2; i++ {
  42.                 calcCRC := calcCRC_SHT3X(0xFF, data[i].Data[:2])
  43.                 crc := data[i].CRC
  44.                 if calcCRC != crc {
  45.                         return
  46.                 }
  47.                 results = append(results, getU16BE(data[i].Data[:2]))

  48.         }
  49.         temp = fmt.Sprintf("%.2f", float64(results[0])*175/(0x10000-1)-45)
  50.         hum = fmt.Sprintf("%.2f", float64(results[1])*100/(0x10000-1))
  51.         return
  52. }

  53. func calcCRC_SHT3X(seed byte, buf []byte) byte {
  54.         for i := 0; i < len(buf); i++ {
  55.                 seed ^= buf[i]
  56.                 for j := 0; j < 8; j++ {
  57.                         if seed&0x80 != 0 {
  58.                                 seed <<= 1
  59.                                 seed ^= 0x31
  60.                         } else {
  61.                                 seed <<= 1
  62.                         }
  63.                 }
  64.         }
  65.         return seed
  66. }

  67. func getU16BE(buf []byte) uint16 {
  68.         v := uint16(buf[0])<<8 + uint16(buf[1])
  69.         return v
  70. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

QQ|Archiver|手机版|邮件群发|cubie.cc---深刻的嵌入式技术和应用讨论中文社区 ( 粤ICP备13051116号-1  

GMT+8, 2020-4-3 02:01 , Processed in 0.023771 second(s), 12 queries , Apc On.

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc. | Style by Coxxs

回顶部