CubieBoard中文论坛

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

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

[复制链接]
发表于 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|手机版|粤ICP备13051116号|cubie.cc---深刻的嵌入式技术讨论社区

GMT+8, 2024-3-29 16:21 , Processed in 0.020758 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部