我有一个项目,其中有一个与Arduino Uno r3连接的水位传感器。我有一个连接到Arduino的ESP8266-01模块。使用AT命令,我能够将传感器结果上传到ThinkSpeak。但是我希望能够登录到其他wifi通道,因此我在ESP8266上放置了wifiManager.h,ESP8266WiFi.h,DNSServer.h和ESP8266WebServer.h,一切正常。由于由于没有IP和密码而无法连接,因此它以AP模式打开,我从计算机连接到它并登录。我输入我的IP地址和密码,然后单击SAVE,ESP被回收并连接。我现在正尝试将传感器数据上传到thingSpeak,但我认为AT命令不再起作用,因为我收到错误espData不在此范围内声明。这是我的代码。
//这是我放入ESP8266的新代码,并使用GPIO 2将信息从传感器上传到thinkSpeak 如您所见,我使用wifiManager连接到wifi,然后通过GPIO 2端口读取由Arduino驱动的传感器。
#include <FS.h>
#include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino
//needed for library
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h> //https://github.com/tzapu/WiFiManager
#include <ArduinoJson.h>
//NEW STUFF START
char apiKey[20]="";
WiFiClient client;
char defaultHost[100] = "api.thingspeak.com"; //Thing Speak IP address (sometime the web address causes issues with ESP's :/
long itt = 500;
long itt2 = 500;
const byte wifiResetPin = 13;
int interruptPinDebounce = 0;
long debouncing_time = 1000;
volatile unsigned long wifiResetLastMillis = 0;
bool shouldSaveConfig = false;
void saveConfigCallback () {
Serial.println("Should save config");
shouldSaveConfig = true;}
void handleWifiReset(){
if(millis()<wifiResetLastMillis){
wifiResetLastMillis = millis();
}
if((millis() - wifiResetLastMillis)>= debouncing_time){
Serial.println("Clearing WiFi data resetting");
WiFiManager wifiManager;
wifiManager.resetSettings();
SPIFFS.format();
ESP.reset();
delay(1000);
}
wifiResetLastMillis = millis();
}
void setup() {
WiFiManager wifiManager;
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(wifiResetPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(wifiResetPin), handleWifiReset,FALLING);
//NEW STUFF START
//clean FS, for testing
//SPIFFS.format();
//read configuration from FS json
Serial.println("mounting FS...");
if (SPIFFS.begin()) {
Serial.println("mounted file system");
if (SPIFFS.exists("/config.json")) {
//file exists, reading and loading
Serial.println("reading config file");
File configFile = SPIFFS.open("/config.json", "r");
if (configFile) {
Serial.println("opened config file");
size_t size = configFile.size();
// Allocate a buffer to store contents of the file.
std::unique_ptr<char[]> buf(new char[size]);
configFile.readBytes(buf.get(), size);
DynamicJsonBuffer jsonBuffer;
JsonObject& json = jsonBuffer.parseObject(buf.get());
json.printTo(Serial);
if (json.success()) {
Serial.println("\nparsed json");
strcpy(defaultHost, json["defaultHost"]);
strcpy(apiKey, json["apiKey"]);
} else {
Serial.println("failed to load json config");
}
}
}
} else {
Serial.println("failed to mount FS");
}
WiFiManagerParameter customHostServer("defaultHost", "Host Server", defaultHost, 100);
WiFiManagerParameter customAPIKey("apiKey", "ThingSpeakWriteAPI", apiKey, 20);
//END NEW STUFF
//WiFiManager
//Local intialization. Once its business is done, there is no need to keep it around
//WiFiManager wifiManager;
//NEW STUFF START
wifiManager.setSaveConfigCallback(saveConfigCallback);
wifiManager.addParameter(&customHostServer);
wifiManager.addParameter(&customAPIKey);
//END NEW STUFF
//reset saved settings
//wifiManager.resetSettings();
//set custom ip for portal
//wifiManager.setAPStaticIPConfig(IPAddress(10,0,1,1), IPAddress(10,0,1,1), IPAddress(255,255,255,0));
//fetches ssid and pass from eeprom and tries to connect
//if it does not connect it starts an access point with the specified name
//here "AutoConnectAP"
//and goes into a blocking loop awaiting configuration
wifiManager.autoConnect("AutoConnectAP");
Serial.println("Connected");
//NEW STUFF START
strcpy(defaultHost, customHostServer.getValue());
strcpy(apiKey, customAPIKey.getValue());
if (shouldSaveConfig) {
Serial.println("saving config");
DynamicJsonBuffer jsonBuffer;
JsonObject& json = jsonBuffer.createObject();
json["defaultHost"] = defaultHost;
json["apiKey"] = apiKey;
File configFile = SPIFFS.open("/config.json", "w");
if (!configFile) {
Serial.println("failed to open config file for writing");
}
json.printTo(Serial);
json.printTo(configFile);
configFile.close();
//end save
}
Serial.println("local ip");
Serial.println(WiFi.localIP());
//END NEW STUFF
//or use this for auto generated name ESP + ChipID
//wifiManager.autoConnect();
pinMode(2,INPUT);
pinMode(1,INPUT);
Serial.println("WriteApi");
Serial.println(apiKey);
//if you get here you have connected to the WiFi
Serial.println("connected...yeey :)");
//save the custom parameters to FS
strcpy(defaultHost,customHostServer.getValue());
strcpy(apiKey,customAPIKey.getValue());
}
//callback notifying us of the need to save config
void loop() {
delay(5000);
String apiKey2 = apiKey;
char defaultHost[100] = "api.thingspeak.com";
pinMode(2,INPUT);
pinMode(1,INPUT);
const int waterInPin = 2; // Analog input pin that the potentiometer is attached to
const int BatteryInPin = 1; // Analog input pin that the potentiometer is attached to
int waterSensorInValue;//reading our water lever sensor
int waterSensorOutValue;//conversion of water sensor value
int BatterySensorInValue;//reading our water lever sensor
int BatterySensorOutValue;//conversion of water sensor value
// put your main code here, to run repeatedly:
waterSensorInValue = analogRead(waterInPin);
BatterySensorInValue = analogRead(BatteryInPin);
waterSensorOutValue = map(waterSensorInValue,0,1024,0,225);
BatterySensorOutValue = map(BatterySensorInValue,0,1024,0,225);
Serial.println("WaterOutValue = ");
Serial.println(waterSensorOutValue );
Serial.println("WaterInValue = ");
Serial.println(waterSensorInValue );
Serial.println("BatteryOutValue = ");
Serial.println(BatterySensorOutValue );
Serial.println("BatteryInValue = ");
Serial.println(BatterySensorInValue);
delay(18000);
itt = waterSensorInValue;
itt2 = BatterySensorInValue;
if (client.connect(defaultHost,80))
{ // "184.106.153.149" or api.thingspeak.com
itt++; //Replace with a sensor reading or something useful
String postStr = apiKey;
postStr +="&field1=";
postStr += String(itt);
postStr +="&field2=";
postStr += String(itt2);
postStr += "\r\n\r\n\r\n";
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: "+String (apiKey)+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(postStr.length());
client.print("\n\n\n");
client.print(postStr);
Serial.println("% send to Thingspeak");
}
client.stop();
Serial.println("Waiting…");
delay(20000);
}
我会将其他与传感器或互联网无关的代码放到Arduino板上 但是,只要将其连接到串行端口并在上传代码后直接运行,上述代码就可以很好地工作。如果我从计算机上的串行端口拔下Arduino,然后重新插入,则不会发生任何事情。我认为它应该继续运行上面的代码以连接到互联网,读取传感器并将信息发送到thingSpeak,但事实并非如此。任何想法为什么会这样。
我用新代码替换了旧代码,该代码据说可以将我的somethingSpeak写入api保存到SPIFFS。如果我擦除设置,然后以Flash大小设置为512k(128k SPIFFS)进行上传,则会挂载FS,并将默认的Host和Api写密钥保存到SPIFF,然后ESP8266重新启动,连接到Internet并转至thingSpeak和更新传感器读数。问题仍然在于,我想关闭ESP8266以节省能源,但是当我重新启动它时,只有(void)循环运行,因此甚至认为它已连接到wifi,甚至连东西都无法更新传感器输入。如何从SPIFFS获取信息api写入密钥到草图的(void)循环部分,以便它在关闭后将传感器数据发送到thingSpeak。还是我没有连接到ThingSpeak。无论如何,这是一个不同的问题,因此我将重新发布一个更具体的问题,并将其标记为已回答。
答案 0 :(得分:0)
这回答了我有关使用ESP8266和Arduino uno连接到不同的wifi和密码以及添加自定义参数的过程的许多问题。我仍然有一些问题,但会在另一篇帖子中提出,希望有人可以帮助我。