我正在做一个涉及从模拟传感器无线上传数据的项目。在这种情况下,它是一个光传感器。
我正在使用Arduino Uno R2和官方Arduino Wi-Fi Shield。以下是我的代码:
#include <SPI.h>
#include <WiFi.h>
#include <HttpClient.h>
#include <Xively.h>
char ssid[] = "Bradley's MacBook Pro"; // your network SSID (name)
int status = WL_IDLE_STATUS;
// Your Xively key to let you upload data
char xivelyKey[] = "SOP7lASYJVcRecV98zlHosDc9nLIAXqnDnIxRnXAmNeKorIk";
// Analog pin which we monitor (0 and 1 are used by the Ethernet shield)
int sensorPin = 2;
// Define the strings for our datastream IDs
char sensorId[] = "light";
XivelyDatastream datastreams[] = {
XivelyDatastream(sensorId, strlen(sensorId), DATASTREAM_FLOAT),
};
// Finally, wrap the datastreams into a feed
XivelyFeed feed(1125419529, datastreams, 1 /* number of datastreams */);
WiFiClient client;
XivelyClient xivelyclient(client);
void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print your WiFi shield's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println("Starting single datastream upload to Xively...");
Serial.println();
// attempt to connect to Wifi network:
while ( status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
status = WiFi.begin(ssid);
// wait 10 seconds for connection:
delay(10000);
}
Serial.println("Connected to wifi");
printWifiStatus();
}
void loop() {
int sensorValue = analogRead(sensorPin);
datastreams[0].setFloat(sensorValue);
Serial.print("Read sensor value ");
Serial.println(datastreams[0].getFloat());
Serial.println("Uploading it to Xively");
int ret = xivelyclient.put(feed, xivelyKey);
Serial.print("xivelyclient.put returned ");
Serial.println(ret);
Serial.println();
delay(15000);
}
然而不幸的是,每次我连续回复时都会这样:
Attempting to connect to SSID: Bradley's MacBook Pro
Connected to wifi
SSID: Bradley's MacBook Pro
IP Address: 10.0.2.3
signal strength (RSSI):-20 dBm
Read sensor value 1023.00
Uploading it to Xively
xivelyclient.put returned -1
Read sensor value 1023.00
Uploading it to Xively
xivelyclient.put returned -1
Read sensor value 684.00
Uploading it to Xively
xivelyclient.put returned -1
Read sensor value 684.00
Uploading it to Xively
xivelyclient.put returned -1
Read sensor value 684.00
Uploading it to Xively
No Socket available
xivelyclient.put returned -1
Read sensor value 684.00
Uploading it to Xively
No Socket available
xivelyclient.put returned -1
我注意到经过一些尝试后,它开始说没有可用的插座。
有没有人知道我哪里出错?
答案 0 :(得分:1)
我已经解决了这个问题。问题是我使用的是Arduino IDE 1.0.5,并且存在阻止Wi-Fi通信的错误。我现在已经改为使用早期的IDE 1.0.2,一切都运行得很好。
答案 1 :(得分:0)
即使您将IDE版本更改为1.0.2,几个月它也能正常工作。如果再次出现此问题,请考虑升级Wifi Shield固件。最新的软件包可以在Arduino网站上找到。它解决了错误
升级的步骤: 1.从此处下载并安装Flip。 http://www.atmel.com/tools/FLIP.aspx您不需要使用或运行Flip程序。下载中有一个子程序,稍后您将需要使用。您将使用DOS命令提示符到达此子程序(batchslip.exe)。您还需要WiFi Shield(AT32UC3A或AT32UC3A DFU)上的芯片驱动程序。
如果您最近在计算机上安装了Arduino版本,则更新WiFi Shield所需的软件位于Arduino目录结构中。当我最近安装Arduino版本1.0.5时,我知道这对我来说是真实的。 (您可能需要安装当前版本)。
将WiFI Shield连接到Uno板。将跳线放在“DFU编程跳线”的两个引脚上。这个页面上显示的WiFi Shield第四张图片:? http://arduino.cc/en/Main/ArduinoWiFiShield 要找到跳线的图片,请查找指向电路板的字和箭头。 DFU编程跳线(仅用于更新屏蔽固件,保留未连接的典型用途)&#34;。
连接到Arduino的电源。然后将迷你USB连接到WiFi防护罩(不是micro-USB)和计算机。
希望您的Windows设备管理器在&#34;其他设备&#34;下显示AT32UC3A DFU。您可能必须使用插拔电源连接到Arduino以及连接到计算机的WiFI Shield的USB端口。有一次,我没有为Arduino供电,只在计算机和WiFi Shield之间插入USB mini。
右键点击“设备管理器”中的设备&#39;并选择&#34;更新驱动程序&#34; 。我选择从我的计算机安装并指示Device Installer应用程序从...安装:C:\ Program Files(x86)\ Atmel \ Flip 3.4.7。我可以选择点击&#34;包含子目录&#39;。抱歉,我不确定驱动程序实际可能处于什么子文件夹。完成此步骤后,AT32UC3A DFU应正确地列在设备管理器中的#34; Atmel USB设备&#34;。
打开命令提示符并导航到&#34; batchslip.exe&#34;是由Flip安装的。对我来说,它是C:\ Program Files(x86)\ Atmel \ Flip 3.4.7 \ bin ...但它取决于Atmel软件的安装位置以及您下载的版本。
进入目录(C:\ Program Files(x86)\ Atmel \ Flip 3.4.7 \ bin)后,您需要运行两个命令。您需要确定最初安装Arduino软件的位置。我在C:\ Arduino中安装了我的,而不是建议的冗长文件夹(*类似于C:\ Arduino 1.0.5。)。因此,您可能需要在下面列出的两个命令中调整目录结构。 我建议从下面剪切并粘贴第一个命令,然后使其与您的* Arduino文件夹名称匹配。您可能必须将以下命令转储到记事本或其他内容以确保没有换行符。使路径尽可能小。在升级时不要在程序文件中粘贴Arduino文件夹,因为如果路径有程序文件(x86),则单词之间的空格将创建不必要的错误,例如:缺少参数 &#34; c:\ Program Files(x86)\ Atmel \ Flip 3.4.7 \ bin&gt; batchisp.exe -device AT32UC3A1256 -hardware usb -operation erase f memory flash blankcheck loadbuffer c:\ Arduino \ hardware \ arduino \ firmwares \ wifishield \ binary \ wifi_dnld.elf程序验证启动重置0 &#34;
2014年5月10日星期六21:16:01运行batchisp 1.2.5
AT32UC3A1256 - USB - USB / DFU
设备选择.......................通过 硬件选择.....................通过 开口...........................通过 阅读Bootloader版本............. PASS 1.0.2 擦除................................通过 选择FLASH ........................ PASS 空白检查......................... PASS 0x00000 0x3ffff 解析ELF文件.......................通过c:\ Arduino \ hardware \ arduino \ firmwares \ wifishield \ binary \ wifi_dnld.elf 警告:用户程序和引导加载程序重叠! 编程存储器..................... PASS 0x00000 0x2902b 验证内存....................... PASS 0x00000 0x2902b 开始申请................... PASS RESET 0
摘要:共11次通过11次失败0
按Enter键
2014年5月10日星期六21:34:04运行batchisp 1.2.5
AT32UC3A1256 - USB - USB / DFU
设备选择.......................通过 硬件选择.....................通过 开口...........................通过 阅读Bootloader版本............. PASS 1.0.2 擦除................................通过 选择FLASH ........................ PASS 空白检查......................... PASS 0x00000 0x3ffff 解析ELF文件.......................通过c:\ Arduino \ hardware \ arduino \ firmwares \ wifishield \ binary \ wifiHD.elf 警告:用户程序和引导加载程序重叠! 编程存储器..................... PASS 0x00000 0x3fe2b 验证内存....................... PASS 0x00000 0x3fe2b 开始申请................... PASS RESET 0
摘要:共11次通过11次失败0
c:\ Program Files(x86)\ Atmel \ Flip 3.4.7 \ bin&gt;
从WiFi卡中移除跳线。删除Min USB。
使用任何草图验证Wifi屏蔽。
此方法确实解决了No Socket可用问题。