1

我正在做一个涉及从模拟传感器无线上传数据的项目。在这种情况下,它是一个光传感器。

我正在使用 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

我注意到,经过几次尝试后,它开始说没有可用的套接字。

有没有人知道我哪里出错了?

4

2 回答 2

1

我已经解决了这个问题。问题是我使用的是 Arduino IDE 1.0.5,并且存在阻止 Wi-Fi 通信的错误。我现在已更改为使用较早的 IDE 1.0.2,并且一切运行良好。

于 2013-07-17T09:44:49.003 回答
0

即使您将 IDE 版本更改为 1.0.2 ,几个月也可以正常工作。如果再次出现此问题,请考虑升级 Wifi Shield Firmware 。Arduino网站上提供的最新软件包。它解决了错误

升级步骤: 1. 从这里下载并安装 Flip。http://www.atmel.com/tools/FLIP.aspx 您不需要使用或运行 Flip 程序。下载中有一个子程序,您以后需要使用。您将使用 DOS 命令提示符访问此子程序 (batchslip.exe)。WiFi Shield(AT32UC3A 或 AT32UC3A DFU)上还有一个您需要的芯片驱动程序。

  1. 如果您最近在计算机上安装了 Arduino 版本,则更新 WiFi Shield 所需的软件位于 Arduino 目录结构中。当我最近安装 Arduino 版本 1.0.5 时,我知道这对我来说是正确的。(您可能需要安装当前版本)。

  2. 将您的 WiFi Shield 连接到 Uno 板。将跳线放在“DFU 编程跳线”上的两个引脚上。显示在本页 WiFi Shield 的第 4 张图片上: ? http://arduino.cc/en/Main/ArduinoWiFiShield 要找到跳线的图片,寻找指向板子的文字和箭头“DFU编程跳线(仅用于更新屏蔽固件,不连接典型使用)” .

  3. 将电源连接到您的 Arduino。然后将 mini USB 连接到 WiFi shield(不是 micro-USB)和您的计算机。

  4. 希望您的 Windows 设备管理器将在“其他设备”下显示 AT32UC3A DFU。您可能需要插入/拔出 Arduino 的电源以及连接到计算机的 WiFI Shield 的 USB 端口。有一次我很幸运,没有给 Arduino 供电,只在计算机和 WiFi Shield 之间插入 USB mini。

  5. 右键单击“设备管理器”中的设备,然后选择“更新驱动程序”。我选择从我的计算机进行安装,并将 Device Installer 应用程序指向 Install from... C:\Program Files (x86)\Atmel\Flip 3.4.7 。我有一个选项可以单击“包含子目录”。抱歉,我不确定驱动程序实际上可能在哪个子文件夹中。完成此步骤后,AT32UC3A DFU 应该在“Atmel USB 设备”下的设备管理器中正确列出。

  6. 打开命令提示符并导航到 Flip 安装“batchslip.exe”的目录。对我来说,它是 C:\Program Files (x86)\Atmel\Flip 3.4.7\bin ...但这取决于 Atmel 软件的安装位置以及您下载的版本。

  7. 进入目录 ( C:\Program Files (x86)\Atmel\Flip 3.4.7\bin) 后,您将需要运行两个命令。您需要确定最初安装 Arduino 软件的位置。我将我的安装在 C:\Arduino 而不是建议的推荐的冗长文件夹(* 类似于 C:\Arduino 1.0.5.).. 因此,您可能需要在下面列出的两个命令中调整目录结构。我建议从下面剪切并粘贴第一个命令,然后使其与您的 * Arduino 文件夹名称匹配。您可能必须将以下命令转储到记事本或其他东西中以确保没有换行符。使路径尽可能小。升级时不要将 Arduino 文件夹粘贴到程序文件中,因为如果路径有Program Files (x86),单词之间的空格会产生不必要的错误,例如:缺少参数“ c:\Program Files (x86)\Atmel\Flip 3.4.7\bin>batchisp.exe -device AT32UC3A1256 -hardware usb -operation erase f memory flash blankcheck loadbuffer c:\Arduino\hardware\arduino\firmwares\wifishield\binary\wifi_dnld.elf program verify start reset 0 "

    这是您应该在命令行上看到的内容............

2014 年 5 月 10 日星期六 21:16:01 运行 batchisp 1.2.5

AT32UC3A1256 - USB - USB/DFU

设备选择...................... PASS 硬件选择...................... PASS打开端口.......................... PASS 读取 Bootloader 版本.......................... PASS 1.0.2擦除.......................... PASS 选择 FLASH....... .......... PASS 空白检查............ PASS 0x00000 0x3ffff 解析 ELF 文件...... ................. PASS c:\Arduino\hardware\arduino\firmwares\wifishield\binary\wifi_dnld.elf 警告:用户程序和引导加载程序重叠!编程存储器...................... PASS 0x00000 0x2902b 验证存储器...................... . PASS 0x00000 0x2902b 启动应用程序...................... PASS RESET 0

总结:共 11 次通过 11 次失败 0

c:\Program Files (x86)\Atmel\Flip 3.4.7\bin>

  1. 现在更新第二块剪切并粘贴下面的命令。您可能必须将其转储到记事本或其他东西中以确保没有换行符。" c:\Program Files (x86)\Atmel\Flip 3.4.7\bin>batchisp.exe -device AT32UC3A1256 -hardware usb -operation erase f memory flash blankcheck loadbuffer c:\Arduino\hardware\arduino\firmwares\wifishield\binary \wifiHD.elf 程序验证开始重置 0
    "

按回车

这是你的屏幕上会发生的事情..

2014 年 5 月 10 日星期六 21:34:04 运行 batchisp 1.2.5

AT32UC3A1256 - USB - USB/DFU

设备选择...................... PASS 硬件选择...................... PASS打开端口.......................... PASS 读取 Bootloader 版本.......................... PASS 1.0.2擦除.......................... PASS 选择 FLASH....... .......... PASS 空白检查............ PASS 0x00000 0x3ffff 解析 ELF 文件...... ................. PASS 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>

  1. 从 WiFi 卡上取下跳线。移除最小 USB。

  2. 使用任何草图验证 Wifi 防护罩。


这种方法确实解决了 No Socket available 的问题。

于 2015-05-14T12:59:56.197 回答