15回答

1收藏

收到的试用活动的树莓派板卡

回答|共 15 个

倒序浏览

11#

bjlx

发表于 2019-8-12 21:05:14 | 只看该作者

分享到:
    树莓派开发板和实验面包板已经搭起来一个多星期了,摸索了好一阵,将采用DTH11的温湿度传感器、采用16位ADS1115芯片的模数采集模块、以及I/O口开关量的输入输出控制(输出测试-LED灯亮灭、输入测试-水银开关通断)这些电路基本上都测通了,将使用的python程序都跑了多次,发现了许多跑不通的问题,已逐一解决,现将心得和经验教训总结如下:

IMG_20190812_184226.jpg (1.48 MB, 下载次数: 122)

IMG_20190812_184226.jpg
12#

bjlx

发表于 2019-8-21 07:09:20 | 只看该作者

以上是验证测试所用的整体模块安装在树莓派和面包板上的布局图,下面发一个分布测试的连接图

IMG_20190812_204829.jpg (1.66 MB, 下载次数: 132)

分布验证测试连接图

分布验证测试连接图
13#

bjlx

发表于 2019-8-21 07:18:25 | 只看该作者

经测试,数据采集模块ADS1115中实际只使用了4个插脚,将他们重新整合到一个gpio插座上的测试图如下:

IMG_20190821_071145.jpg (1.58 MB, 下载次数: 108)

IMG_20190821_071145.jpg
14#

bjlx

发表于 2019-8-21 07:24:09 | 只看该作者

验证过可实际使用的ADS1115的Python程序如下:
#已经测试成功的实例程序------20190811  1.i2c地址从默认0x48改为0x4b,2.打印输出的命令要加()
#!/usr/bin/python
# coding: utf-8
import RPi.GPIO as GPIO
import time
channel = 37                    #boad编号37,bcm引脚号26
data = []                       #温湿度值
j = 0                           #计数器
GPIO.setmode(GPIO.BOARD)        #以BOARD编码格式
import sys
sys.path.append('../')
from DFRobot_ADS1115 import ADS1115
ADS1115_REG_CONFIG_PGA_6_144V        = 0x00 # 6.144V range = Gain 2/3
ADS1115_REG_CONFIG_PGA_4_096V        = 0x02 # 4.096V range = Gain 1
ADS1115_REG_CONFIG_PGA_2_048V        = 0x04 # 2.048V range = Gain 2(default)
ADS1115_REG_CONFIG_PGA_1_024V        = 0x06 # 1.024V range = Gain 4
ADS1115_REG_CONFIG_PGA_0_512V        = 0x08 # 0.512V range = Gain 8
ADS1115_REG_CONFIG_PGA_0_256V        = 0x0A # 0.256V range = Gain 16
ads1115 = ADS1115()
while True :
   time.sleep(1)                   #时延一秒
   GPIO.setup(channel, GPIO.OUT)
   GPIO.output(channel, GPIO.HIGH)  #时延
   GPIO.output(channel, GPIO.LOW)
   time.sleep(0.02)                #给信号提示传感器开始工作
   GPIO.output(channel, GPIO.HIGH)
   GPIO.setup(channel, GPIO.IN)
   while GPIO.input(channel) == GPIO.LOW:
       continue
   while GPIO.input(channel) == GPIO.HIGH:
       continue
   while j < 40:
       k = 0
       while GPIO.input(channel) == GPIO.LOW:
                continue
       while GPIO.input(channel) == GPIO.HIGH:
                k += 1
                if k > 110:
                       break
       if k < 8:
                data.append(0)
       else:
                data.append(1)
       j += 1
   #print ("sensor is working.")
   #print (data)                           #输出初始数据高低电平
humidity_bit =data[0:8]                #分组
    humidity_point_bit = data[8:16]
    temperature_bit = data[16:24]
    temperature_point_bit = data[24:32]
    check_bit = data[32:40]
    humidity = 0
    humidity_point = 0
    temperature = 0
    temperature_point = 0
    check = 0
    for i in range(8):
        humidity += humidity_bit * 2 ** (7 -i)                      #转换成十进制数据
        humidity_point += humidity_point_bit* 2 ** (7 - i)
        temperature += temperature_bit * 2** (7 - i)
        temperature_point += temperature_point_bit* 2 ** (7 - i)
        check += check_bit * 2 ** (7 - i)
    tmp = humidity + humidity_point +temperature + temperature_point    #十进制的数据相加
    #if check == tmp:                                              #数据校验,相等则输出
    #   print ("temperature : ", temperature, ", humidity :" , humidity)
    #else:                                                      #错误输出错误信息,和校验数据
    #   print ("wrong")
    #   print ("temperature : ", temperature, ", humidity :" , humidity, " check : ", check, " tmp : ", tmp)
    #Set the IIC address
    ads1115.setAddr_ADS1115(0x4b)
    #Sets the gain and input voltage range.
   ads1115.setGain(ADS1115_REG_CONFIG_PGA_6_144V)
    #Get the Digital Value of Analog ofselected channel
    adc0 = ads1115.readVoltage(0)
    time.sleep(0.2)
    adc1 = ads1115.readVoltage(1)
    time.sleep(0.2)
    adc2 = ads1115.readVoltage(2)
    time.sleep(0.2)
    adc3 = ads1115.readVoltage(3)
    #print ("A0:%dmV  A1:%dmV A2:%dmV A3:%dmV"%(adc0['r'],adc1['r'],adc2['r'],adc3['r']))
    if check == tmp:                                          #数据校验,相等则输出
        #print ("temperature : ",temperature, ", humidity : " , humidity)
        print ("A0:%dmV  A1:%dmV A2:%dmV  A3:%dmV      temperature:%d*C  humidity:%d "%(adc0['r'],adc1['r'],adc2['r'],adc3['r'],temperature,humidity))
    else:                                                  #错误输出错误信息,和校验数据
        print ("wrong")
        #print ("temperature : ",temperature, ", humidity : " , humidity, " check : ",check, " tmp : ", tmp)
        print ("A0:%dmV  A1:%dmV A2:%dmV  A3:%dmV      temperature:%d*C  humidity:%d check:%d  tmp:%d*C"%(adc0['r'],adc1['r'],adc2['r'],adc3['r'],temperature,humidity,check,tmp))
GPIO.cleanup()

15#

bjlx

发表于 2019-8-21 07:35:13 | 只看该作者

在笔记本电脑上使用VPN调试可看到底实际运行结果是:

IMG_20190821_073139.jpg (2.15 MB, 下载次数: 112)

vnc看到的实际运行及测试数据

vnc看到的实际运行及测试数据
16#

bjlx

发表于 2019-8-22 04:34:17 来自手机 | 只看该作者

说明,以上电路及程序是将模数转换采集模块ADS1115和温湿度采集樸块DTH|11同时接入到GPIO囗上,在同一屏幕上显示,这也最接近最终目标电路和程序,基本上利用GPIO口的输入采集方式就可用它了,以后再优化,当前屏幕上显示分两部分,前面4段是ADS1115的4个输入通道采集到的模拟电压的显示,后面2段悬DTH11采集到的温湿度数据显示,ADS1115使用的是I2C通迅模式,DTH11使用的是类似SPI的单线串口通进模式,程序就是从上展示的,己调通。
    调试过程中发现很多问题,希望给后来的伙伴提醒一下:
1:很多资料上介绍的模块对应程序是走不通的,包括我这次购买的ADS1115的这个模块所提供的对应I2c采集程序,里面有一处总是提示不对劲,后查找了很多资料,发现大家都是千篇一律的相同,不知是互相抄的呢还是彩的环境不对,总之用那个程序怎么都不行,后来查原始的国外英文版树莓派关于ADS1115的英文资料,按其介绍,调用核心的I2C通迅例程,分别调试才走通了,体会是,很多资料要实现到实用阶段,还得弄通孕原理,查看原始数据手册才可靠,碰到一个可借用的能走通的程序那真是福气了。
2:我这次遇到的这两个网上提供的例程,都有个同样的问题,就是Python的屏幕输出命令Print,资料上介绍的实际跑起来都提示不对,后来才发现是使用的Python版本问题,python是解释型的语言,完全依赖于其版本环境,一般来说是向下兼容的,但2.×版本和3×版本上有个很大的区别就是print命令,之前的print命令后面不用加括号(),而现在的3.6,3.7版本的都要加括号()才行,我发现网上提供的这两个程序print命令的输出都是不带括号()的,而推荐的资料文章还说是运行在3.6下的,甚至今年前半年的资料上的程序都是这样,所以遇到这种情况,print的输出要带上括号()才能输出,这点要注意。
3:这次测试,我用C语言程序也跑过,感觉各有千秋,C程序最终使用起来是一个可执行程序,比较方便,但初始的编程比较麻烦,对于现在这种更新换代和随时都有调整的这种环境来说,编写效率还是有些低,对当年还在用汇编语言编写单片机程序的我深有体会,我发现开源的Python确实比较好,尤其是有很多现成的的函数等都可调用,但是还是要以原始的开源发布例程为准,只要慢慢积累了可调用的子程序和函数后,开发达是会越来越快的,待有时间了后,对一些精品再用C来优化提高运行效率倒是不错的。

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条