dht pro shield怎么允许连接dht网络

Fatal error: Uncaught exception 'RedisException' with message 'Connection closed' in /data/www/yeelink.net/blog/wp-content/themes/yeelink/functions.php:11
Stack trace:
#0 /data/www/yeelink.net/blog/wp-content/themes/yeelink/functions.php(11): session_start()
#1 /data/www/yeelink.net/blog/wp-settings.php(329): include('/data/www/yeeli...')
#2 /data/www/yeelink.net/blog/wp-config.php(88): require_once('/data/www/yeeli...')
#3 /data/www/yeelink.net/blog/wp-load.php(37): require_once('/data/www/yeeli...')
#4 /data/www/yeelink.net/blog/wp-blog-header.php(12): require_once('/data/www/yeeli...')
#5 /data/www/yeelink.net/blog/index.php(17): require('/data/www/yeeli...')
thrown in /data/www/yeelink.net/blog/wp-content/themes/yeelink/functions.php on line 11
Fatal error: Uncaught exception 'RedisException' with message 'Connection closed' in [no active file]:0
Stack trace:
thrown in [no active file] on line 01、将程序上传到板子时Arduino IDE提示&avrdude: stk500_getsync(): not in sync: resp=0x00&
网上查遇到这个问题的人比较多,有说驱动问题的,有说IDE设置问题的。具体到我遇到的这个情况,原因是板子上插了RF24无线传输模块(也许线还没有插对),拔掉以后再上传程序就正常了。
2、nRF24L01+无线透传使用问题
Arduino官网上似乎推荐,遇到一个问题,接收端运行几分钟后停止响应;试了另外一个,遇到传输不稳定的问题,一时没有解决,还是回到Mirf了,之前的停止响应问题没有再出现。
关于无线透传的讨论不少,虽然用arduino的不多。
Mirf的地址问题:Mirf的address是有长度要求的,例如可以用&serv1&、&clie1&作为地址,长度过短会导致无法传输,例如用&cl2&作为地址。试了好多次才发现这个问题。
nRF24L01模块(使用Mirf库时)的自动应答问题:项目里使用一个nRF24L01(服务端)接收多个nRF24L01(客户端)的消息,发现客户端之间互相收到本应发到服务端的消息,经过多次试验,发现应该与nRF24L01的自动应答机制有关。在Mirf.cpp的setTADDR方法里可以看到,目标地址被同时写到RX_ADDR_P0和TX_ADDR这两个寄存器里,前者是接收自动应答使用的(一个nRF24L01可以有6个接收地址同时工作),导致peer发到服务端的消息也被当作自动应答了。为避免这种干扰,我实验下来的方法是:每个客户端在发送数据之前先setTADDR到一个无效且唯一的地址,在send之前那一刻再使用setTADDR将地址设置到服务端的地址,发送完成后马上setTADDR到那个无效地址。
3、Arduino与Android通过usb通讯
利用这个开源项目。注意,两侧的baudrate要设置一致;android端读取到的数据可能是不完整数据,需要多读几次以便补齐。
&The nature of hardware device interfaces like these is that there is typically no guarantee your data will arrive in a single read().&If you expect 16 bytes of data, you need to read(), successively, until you have received all 16. &If you want to read until there is a newline, you will need to scan all characters until you find a newline -- and then save anything received after it for later.&
4、关于arduino设备的唯一ID
最后决定使用的方案是:写一个专门的小程序(量产程序),对每个arduino运行一次,在EEPROM里写入唯一的id号。正式程序运行时只需读取,不做修改。
注意:EEPROM的擦写次数是有限制的,一般标称为10万次,但有人声称实验结果只有100次左右。还好,比较靠谱的实验测试结果是超过100万次,总之写入EEPROM时慎重。
5、温湿度传感器DHT11
3.3v/5v通用,接数字信号口,使用这个库获得数据。DHT11精度不高,若要求高可使用DHT22(也叫AM2302)。
6、同一段代码在两块板子上运行效果不同
两块板子都是uno+sensor shield+nrf24l01,其中一块运行完全正常,另一块无法接收到消息(可以发送消息)。交换sensor shield(连同上面的nrf)无效,交换usb线无效,接外接12v电源无效。最后发现如果在代码的loop()里加delay(100)则基本能接收到消息,但还有部分丢包。两块板子是从不同卖家处购买的,看来还是有区别啊。
7、Arduino nano v3.0接nrf24l01模块不工作问题
nano直接连nrf24l01模块无法收发数据;但用nano先接传感器扩展板(sensor shield,像),再把nrf24l01接到扩展板上,则工作正常。仔细检查过连线没有问题,且分别替换过nano和nrf模块usb线等,都没有效果。最后发现nano板子上的3.3v针脚电压不对,几乎是零,联系卖家检查后说是nano上少一根线,要把usb口背后的两个电容(C1和C7)靠近芯片的引脚短接,照此方法问题解决。而扩展板上的3.3v针脚是用asm从5v降压得来,所以没有这个问题。
nano的说只有用usb供电时3.3v针脚才有电压,但经实验,我手上的这一版(电容短接后)不论用usb供电还是通过vin供电,3.3v针脚都有3.3v电压。
8、无法上传程序到arduino pro mini
使用ft232rl连接arduino pro mini,上传程序时提示:
stk500_getsync(): not in sync: resp=0x00
上传时按reset按钮不起作用,DTR线也已经连接。经过反复实验,发现两个问题导致这个现象:1)arduino上的RX应该接ft232rl的TX,TX接RX,我一开始接反了;2)一开始用的FTDI的驱动是最新的2.0.8.30,在的提示下,降级到后问题解决。PS.最好搜索并下载CDM20824_Setup.exe文件以便强制降级。
又测试了一下DTR线的作用,如果连接了DTR线,直接上传程序就可以成功;如果不连接DTR线,在提示Uploading时立刻按一下arduino的reset按钮,也可以上传成功,不按按钮则上传失败。
Update : 不知道什么原因,ft232rl又无法上传程序到arduino pro mini了。这个帖子里有人提到在DTR线上加一个100nF的电容是关键的一步,但我手边没有这个电容,而且即使我不连接DTR线采用手动reset的方式仍然不行。后来使用PL2303模块的下载线(只有四个脚,与ft232rl相比少了DTR脚)配合手动reset方式可以正常上传程序到arduino。
9、Arduino的数据类型
Arduino的长整型是32位的,而Java里是64位,互传数据时别搞错了。关于arduino里的
10、电池供电方案
我花了不少时间在研究各种供电方案上,要平衡电池容量和带来的体积增加,还要考虑电池成本因素:
方案1: 5号/7号干电池供电,为达到至少3.3v的电压以便驱动arduino pro mini+nrf24l01,需要至少三节电池,体积太大放弃;
方案2:CR2032纽扣电池供电,同样电压不足(标称3V),实测3.2V但后来会有电压下降,在3V左右arduino能启动但无线模块不正常;
方案3:3.7V锂电池供电,这是目前采用的方案,目标是让一块250mAh的锂聚合物电池能维持设备运行2个月以上。为节约成本和体积,锂电池充电模块将采用外置的方式。
可以检测当前VCC脚的电压(仅支持328和168),有助于实现提示电池电量不足,我在pro mini 5v上实测可用。
11、减小工作电流
目前采用arduino pro mini 5v/16MHz版本,这个版本在tb上的售价为13元人民币左右,而3.3v/8MHz的版本要17元左右,实测5v版本用3.3v电源(输入VCC)仍然可用,只是这时核心频率可能会低于16MHz,影响不大。
为减小工作电流以获得尽可能长的工作时间,设备绝大多数时间进入睡眠模式(使用库),利用watchdog周期性醒来发送数据,然后立刻回到睡眠模式。
nrf24l01模块也需要同时睡眠和醒来,使用Mirf库里的powerDown()命令。
实测电流:pro mini 5v版本,3.7v锂电池供电,HT7533稳压,LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF)同时Mirf.powerDown(),电流1.48mA。
传感器供电:如果直接将传感器接在5v或3v3上,传感器会一直消耗电流。为了节电,可以将对电流要求不高的传感器接在digital输出上,当arduino需要使用传感器时再对它通电。、
12、TP4056充电板的充电电流问题
tb上买的TP4056芯片的锂电池充电板,要更改的Rprog是在电路板下方中部(电路板上文字方向为正)的一个小贴片电阻,出厂时阻值是1.2k。我需要90mA的充电电流,按照说明,替换成15k左右的电阻。
测试充电电流时遇到一点问题:发现充电电流比预想的要低,77mA左右,而且几乎一开始就缓慢下降,并不是恒流的。查了一些资料后发现,我是把万用表串接到BAT+口上的,而万用表对这个电流造成了影响,因为使用不同的档位测出来的电流值不同,高档位显示的电流比较高。实际应该串接到In+口,或者测量Rprog电阻的电压然后(V/Rprog)*1200得到充电电流。
13、analogRead(0)与analogRead(A0)的区别?
如果所说属实,在Arduino IDE 0022以上这两个命令没有区别,A0的值为14,而analogRead(0)等价于analogRead(14)。补充:又找到说的比较详细。
14、搭建最小系统的问题
a) 我在tb上买的usbasp,vcc脚居然与gnd脚短接(!),vcc脚旁边的那个看不清字的脚有5v电压;后来仔细一看,是文字距离对应的针脚太远,以致于串行了。
b) 我使用Atmega168pa作为核心搭建最小arduino系统,在arduino ide 1.5.5里选择board -& arduino ng or older,用usbasp烧录bootloader时会提示下面的错误:
&avrdude:&Expected signature for ATMEGA168 is 1E 94 06
原因是atmel168pa与atmel168这两个芯片的签名不一样,arduino自带的avrdude无法识别。按照的方法可以解决,不过可能是arduino ide版本不同的原因,原帖里的内容需要略作修改,按照ide的错误提示来改即可。,虽然我没实际试验,但也值得一看。
c) 顺便提醒一下用&面包板专用电源&的,要注意电源插针的极性&&电源插在面包板两端时正负极刚好是反过来的。
d) 可能是面包板不太牢靠,在面包板上搭的最小系统很不稳定,后来焊到洞洞板上就没有问题。
e) 如果使用programmer(例如usbasp)刷sketches到最小系统,注意每刷一次EEPROM都会被清除,解决的办法是将EESAVE熔丝位设置为1(见)。
f) 为了方便调试,以及解决programmer刷sketches导致EEPROM被清除的问题,我决定还是用ttl(pl2303)上传程序。连接好Vcc, Gnd, Tx, Rx后发现upload会失败,reset不起作用,在网上找到提到boards.txt里upload.protocal的设置问题,打开boards.txt将原来的pro.upload.tool=avrdude改为pro.upload.tool=stk500,再刷一遍bootloader,使用ttl就正常了。
补充:后来使用ttl上传时又提示missing "upload.params.quiet"错误,将pro.upload.tool改回为avrdude解决,比较奇怪。
15、最小系统在5v下工作但在3.3v下不工作
还是atmega168pa芯片,配合8MHz外部晶振,搭好的最小系统上传blink程序,在5v输入下led闪烁,但换成3.3v输入led不亮。测量pin13的电压输出为0.5v左右且保持不变,说明blink程序没有正常执行。后来发现原因是3.3v输入只接到vcc而没有接到avcc脚上。进一步测试,如果3.3v只接avcc,led也会闪烁但比较暗,pin13输出电压为2.2v左右。说明vcc与avcc需要都接到3.3v供电才可以。
在atmega的datasheet里有这样的说明:&AVCC AVCC is the supply voltage pin for Port A and the A/D converter. It should be externally connected to VCC, even if the ADC is not used. If the ADC is used, it should be connected to VCC through a low-pass filter. &
16、使用Eagle制作电路板
为了进一步缩小成品尺寸,我决定设计自己的电路板,然后再tb上找工厂打样生产。一开始考虑使用protel做这件事,后来发现eagle更合适,首先后者是可以免费使用的不需要破解,其次eagle的官网上就有很多元件库可以下载,与arduino有关的库也比较丰富。eagle上手也不难,推荐看一下Sparkfun上的两篇教程(,)基本就可以开始干活儿了。
下图我设计的第一个PCB板(已送去打样),尺寸为25mmx42mm,电路板上主要集成了基于atmega328p的arduino最小系统和nrf24l01接口,用来实现传感器数据的无线上传,低功耗设计使用250mAh的锂电池供电2个月左右。完全手工布线,虽然过程磕磕绊绊,但还是挺有成就感的。
上图是第一版设计,打样回来发现几个问题:1)丝印有重叠,原因是虽然在eagle里隐藏了一些层,但gerbers文件里这些层仍然可见;解决办法是在pcb设计图里smash元件,然后删除掉与丝印重叠的name和value;2)有三条线没有连通(见上图中的三条细黄线),设计时原本以为地线都靠覆铜连通的就没有管,其实覆铜不是哪里都能覆盖到的,所以打样前要保证所有飞线都route过(点击ratsnest工具提示nothing to do就表示所有飞线都route好了)。
第二版的设计里改正了第一版中的问题,并对一些元件进行了重新布局。
第三版的改动比较大:里把配对按钮的下拉(pull-down)改为上拉(pull-up)以便与习惯一致,另外修改了电源接口和传感器接口,atmega328芯片采用45度角布局方便走线,led从0603改为0805方便焊接,aref与3v3断开但保留一个跳线,将晶振改为贴片封装,nrf24l01模块设计在电路板背面以便在焊接后仍然能修改(拆)正面的元件。
16.1 常用单位换算
Eagle里的钻孔尺寸单位是英寸inch,乘以39.4就是毫米,例如0.02inch=0.508mm。打样前要注意厂家对最小钻孔的要求,一般不能低于0.4mm,因为钻孔越小使用的钻头越小,价格也越贵。
1mil = 1/1000英寸 = 0.0254毫米
1英寸 = 25.4毫米
1毫米 = 39.4mil = 0.0394英寸
16.2 PCB板覆铜
在PCB板上覆铜对走线很有帮助,双面板一般有一面的覆铜用于地线,上面提到的Sparkfun的里有覆铜的使用方法。
但是要注意,有些地方由于被其他走线包围,会导致覆铜无法到达,这些地方通常会有遗留的连线(例如上图中两个10uF电容之间)需要手工route,如果不route这些线在成品线路板上就只能飞线补救了。
17、从Eagle导出gerbers文件
为了打样,需要给工厂提供设计文件,但不是每家工厂都接受eagle的源文件,同时提供源文件也容易被别人复制自己的设计。因此需要将eagle格式的设计文件导出为gerbers文件,这个绝大多数工厂都接受的文件格式。我在网上找到了一个简易教程《Eagle PCB 生成Gerber文件步骤》,作者孙民强,按照教程所说的步骤打样&基本&成功。
这次打样比较明显的一个问题是,虽然在eagle里隐藏了tNames层,但导出gerbers以后这个层依然存在,导致元件自带的Name与tPlace层的文字同时出现产生重叠。解决方法是先smash带有Name的元件,然后就可以移动或删除Name,从而只保留tPlace层。也许在导出gerbers过程中也可以做一些设置达到相同目的吧,暂时没有研究。
使用免费版可以查看gerbers文件。
18、电路板焊接注意
焊接atmega芯片前,先确保芯片已经刷好bootloader,用arduino ide刷时要注意选择正确的board类型(例如arduino pro or pro mini);处理器类型最好也选一下(例如atmega328(3.3v 8MHz)).
贴片LED极性:有彩色线的一端是负极,&|&&指向的一端是负极。
焊接很小的贴片元件时这样比较容易:先在其中一边焊盘上挂上锡,然后用镊子夹住元件贴紧这个焊盘,用烙铁将锡熔化的同时稍微用力将元件推进去,这一边就固定好了,这时可以轻松将另一边焊好。
19、最小系统无法工作原因
a)万用表检查电源与地线是否短路 b)检查atmega芯片方向是否正确 c)加电检查3v3电压是否正确 d)atmega芯片是否已烧入正确的bootloader
阅读(...) 评论()1099人阅读
arduino笔记
最近开始学习arduino的网络应用,刚好要用到数据网络上传的功能,几番尝试后,有些心得体会。
手中有一个arduino mega 2560的开发板和Ethernet shiled的拓展板,还有dht11温湿度传感器
使用目的是为了将传感器获得的温湿度数据上传到yeelink(yeelink.net)的服务器
但是在使用过程中,发现有些不足的地方
先上主要代码:
#include &Wire.h&
#include &dht11.h&
#include &Ethernet.h&
#include &SPI.h&
#include&math.h&
dht11 DHT11;
#define DHT11PIN 32
#define APIKEY &xxxxxxxxxxxxxxxxxxxxxxxxx&
#define DEVICEID 17799
#define SENSOR_T 31034
#define SENSOR_H 31035
int getLength(int someValue);
char server[]=&api.yeelink.net&;
//第一处开始
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xAA};
unsigned long lastConnectionTime = 0;
// last time you connected to the server, in milliseconds
boolean lastConnected =
// state of the connection last time through the main loop
const unsigned long postingInterval = 500; // delay between 2 datapoints, 0.5s
//上面三个值一直不知道是干嘛的
void setup()
Serial.begin(115200);
Serial.println(&DHT11 TEST PROGRAM &);
//第二处开始
Ethernet.begin(mac); // 开始监听客户端
Wire.begin();
void loop()
Serial.println(&\n&);
int chk = DHT11.read(DHT11PIN);
Serial.print(&Read sensor: &);
switch (chk)
case DHTLIB_OK:
Serial.println(&OK&);
case DHTLIB_ERROR_CHECKSUM:
Serial.println(&Checksum error&);
case DHTLIB_ERROR_TIMEOUT:
Serial.println(&Time out error&);
Serial.println(&Unknown error&);
Serial.print(&Humidity (%): &);
int humid = DHT11.
Serial.println(humid);
Serial.print(&Temperature (C): &);
int tempt = DHT11.
Serial.println(tempt);
sendData(humid);
delay(2000);
1. 在第一处的mac设定中,尽量选择mac生成器生成的有序值,不要自己随意一改,否则路由器会无法正确识别网络拓展板
2. 在第二处中,有很多的代码都采用Ethernet.begin(mac,ip)的形式进行网络拓展板的初始化,但对于开启了DHCP的路由器来说,即使你的所有ip都不重复,也是有隐藏隐患的。这种违背路由器本身设定的ip分配行为,会导致路由器在工作时产生不可预知的错误,从而陷入自身瘫痪。
sendData()函数的具体内容(参照yeelink网站资料):
void sendData(int thisData) {
// if there's a successful connection:
//第三处开始
if (client.connect(server, 80)) {
//第三处结束
Serial.println(&connecting...&);
// send the HTTP PUT request:
client.print(&POST /v1.0/device/&);
client.print(DEVICEID);
client.print(&/sensor/&);
client.print(SENSOR_H);
client.print(&/datapoints&);
client.println(& HTTP/1.1&);
client.println(&Host: api.yeelink.net&);
client.print(&Accept: *&);
client.print(&/&);
client.println(&*&);
client.print(&U-ApiKey: &);
client.println(APIKEY);
client.print(&Content-Length: &);
// calculate the length of the sensor reading in bytes:
// 8 bytes for {&value&:} + number of digits of the data:
//第四处开始
int thisLength = 10 + getLength(thisData);
client.println(thisLength);
//第四处结束
client.println(&Content-Type: application/x-www-form-urlencoded&);
client.println(&Connection: close&);
client.println();
// here's the actual content of the PUT request:
client.print(&{\&value\&:&);
//第五出开始
client.print(thisData);
//第五处结束
client.println(&}&);
// if you couldn't make a connection:
Serial.println(&connection failed&);
Serial.println();
Serial.println(&disconnecting.&);
client.stop();
// note the time that the connection was made or attempted:
//第六处开始
lastConnectionTime = millis();
//第六处结束
3.此处判断服务器80端口是否可用,在建立链接的第一次尝试中,往往会耗费较多的时间,最长可达十几秒,此时的thisData已经没有了时效性,属于废弃数据
4.此处用来判断上传数据的长度,来自官方网站的getLength()函数如下:
int getLength(int someValue) {
// there's at least one byte:
int digits = 1;
// continually divide the value by ten,
// adding one to the digit count for each
// time you divide, until you're at 0:
int dividend = someValue /10;
while (dividend & 0) {
dividend = dividend /10;
// return the number of digits:
此函数的限制就是,只能判断出正整数的数据长度,对于小数和负数无能为力,如果不自己修改这个函数的话,会导致上传的结果仅为整数,对于一些高精度要求的项目来说,几乎等于致命。
改进方法:
首先估计要上传的数据范围,是00.00~99.99,则直接将数据长度定义为5位,包括小数点;000.00~999.99,直接定义为6位;00.000~99.999,直接定义为6位,以此类推。
这样的话,就不要是用getLength()函数了。
还有一个比较让初学者头疼的,就是DHT11的温度传感器获取的温湿度数据只能是整数的,官方资料的40bit 数据 = 8bit 温度整数 + 8bit 温度小数 + 8bit 湿度整数 + 8bit 湿度小数,证明是错误的。8bit 温度小数 和 8bit 湿度小数的值均为 0 !所以说,只期望整数罢了!
5.还是前面所说的问题,如果确定网络连接的部分耗时较多的话,到这一步的thisData数据几乎是报废的数据,用户可以在串口的Serial.print(tempt)省略掉,即取消串口监视。在&& 第四处& 之前,进行一次传感器读取,以最新的数据作为上传结果。
6.用来记录上一次上传时间,一直没找到这个值在哪儿用到了,估计是为了计算时间间隔,减小服务器负载。。。。。
可是,即使是这样,网络连接还是基本上每两次掉一次,根本无法满足要求,希望网站管理者能够对网站负载能力进行提升。
刚开始学习,皮毛之见,还望见谅
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1115次
排名:千里之外
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'}

我要回帖

更多关于 pro shield 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信