【问题标题】:Get water level sensor info into esp8266-01 to upload to thingSpeak获取水位传感器信息到 esp8266-01 上传到thingSpeak
【发布时间】:2019-04-15 23:19:55
【问题描述】:

我有一个使用 Arduino UNO 和 esp8266-01 的项目。 Arduino 用于收集高水位和低水位传感器信息,然后传输该信息以打开/关闭用于水阀的闭锁继电器以填充我的游泳池。它还可以关闭和打开太阳能电池板为我的电池充电,还可以关闭和打开 esp8266。
我希望每次 esp8266 启动时都能连接到 wifi,然后将水位传感器信息和电池电量传感器信息发送到thingSpeak。

在下面的代码中,我做了它,以便 esp8266 第一次通电时尝试连接到本地 wifi,但由于没有提供 ip 和密码,它进入接入点模式并打开登录页面。我还提供用户输入他们的thingSpeak写api。这些数据被保存到 esp8266 的 eeprom 中,以便将来它会自动连接并向thingSpeak 发送信息。这工作正常。

我的问题是从水位传感器和电池电量获取信息到 esp8266。我首先在 Arduino 上收集数据,然后让 esp8266 使用 SerialSoftware 使用 AT 命令连接并上传信息。然而,为了让 AUTOCONNECT 工作,我不得不重新编程 esp8266,现在它不响应 AT 命令。我试图重新编程 ESP 上的 RX 和 TX 引脚,但当有水时它只有两个读数,读数为 1024,没有水为 0。中间没有。电池电量没有记录任何内容。我可以使用 TX 和 RX 引脚以某种方式作为模拟输入来执行此操作,还是可以将 Arduino 上收集的信息(数字)并使用 TX(arduino)和 RX(ESP)将它们发送到 ESP8266 发送到物语。我不知所措,需要帮助。

这是 ESP8266 上的代码

#include <FS.h>
#include <ESP8266WiFi.h>          //https://github.com/esp8266/Arduino
#include <EEPROM.h>
//needed for library
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>         //https://github.com/tzapu/WiFiManager
#include <ArduinoJson.h>

//NEW STUFF START
char Password[36]="";
char apiKey[16]="";
WiFiClient client;
//eeprom new end
char defaultHost[100] = "";  //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();
  }

int addr = 0; 

void setup() {
  //EEPROM.begin(512);  //Initialize EEPROM
  WiFiManager wifiManager;
    // put your setup code here, to run once:
    Serial.begin(115200);
    pinMode(wifiResetPin, INPUT_PULLUP);
    attachInterrupt(digitalPinToInterrupt(wifiResetPin), handleWifiReset,FALLING);







  WiFiManagerParameter customAPIKey("apiKey", "ThingSpeakWriteAPI", apiKey, 16);
//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(&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(apiKey, customAPIKey.getValue());

  if (shouldSaveConfig) {
    Serial.println("saving config");
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    json["defaultHost"] = defaultHost;
    json["apiKey"] = apiKey;
    Serial.println("API");
    Serial.print(apiKey);
    String apiKey2 = String(apiKey);
    File configFile = SPIFFS.open("/config.json", "w");
    if (!configFile) {
      Serial.println("failed to open config file for writing");
    }
json.printTo(configFile);
    json.printTo(Serial);
    delay(1000);
    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();


    //Serial.println("WriteApi");
    //Serial.println(apiKey);


    //if you get here you have connected to the WiFi
    //Serial.println("K)");
     //save the custom parameters to FS

  strcpy(apiKey,customAPIKey.getValue());
   EEPROM.begin(512);  //Initialize EEPROM

  // write appropriate byte of the EEPROM.
  // these values will remain there when the board is
  // turned off.

  EEPROM.write(addr, 'A');    //Write character A
  addr++;                      //Increment address
  EEPROM.write(addr, 'B');    //Write character A
  addr++;                      //Increment address
  EEPROM.write(addr, 'C');    //Write character A

  //Write string to eeprom
  String www = apiKey;
  for(int i=0;i<www.length();i++) //loop upto string lenght www.length() returns length of string
  {
    EEPROM.write(0x0F+i,www[i]); //Write one by one with starting address of 0x0F
  }
  EEPROM.commit();    //Store data to EEPROM


  //Read string from eeprom



}

//callback notifying us of the need to save config


void loop() {
 Serial.begin(115200);

 WiFiManager wifiManager;
if (WiFi.status() == WL_DISCONNECTED) {

 wifiManager.autoConnect("AutoConnectAP");}
 delay(5000);
 if (WiFi.status() == WL_CONNECTED) {  Serial.println("Connected");



WiFiClient client;
 long itt = 500;
    long itt2 = 500;
char defaultHost[100] = "api.thingspeak.com";

//HERE IS WHERE I CHANGE THE TX AND RX PIN FUNCTION
 pinMode(1, FUNCTION_3);
  pinMode(3, FUNCTION_3);
//THEN I ASSIGN THEM AS INPUT PINS 
 pinMode(1,INPUT);
 pinMode(3,INPUT);
//ASSIGN EACH PIN TO AN INTERGER
  const int waterInPin = 3;  // Analog input pin that the potentiometer is attached to
    const int BatteryInPin = 1;  // Analog input pin that the battery 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);
//ASSIGN THE INPUT VALUES TO UPLOAD LONGS    
    itt = waterSensorInValue;
    itt2 = BatterySensorInValue;
    EEPROM.begin(512);
    Serial.println(""); //Goto next line, as ESP sends some garbage when you reset it  
  Serial.print(char(EEPROM.read(addr)));    //Read from address 0x00
  addr++;                      //Increment address
  Serial.print(char(EEPROM.read(addr)));    //Read from address 0x01
  addr++;                      //Increment address
  Serial.println(char(EEPROM.read(addr)));    //Read from address 0x02

  //Read string from eeprom
  String www;   
  //Here we dont know how many bytes to read it is better practice to use some terminating character
  //Lets do it manually www.circuits4you.com  total length is 20 characters
  for(int i=0;i<16;i++) 
  {
    www = www + char(EEPROM.read(0x0F+i)); //Read one by one with starting address of 0x0F    
  }  

  Serial.print(www);  //Print the text on serial monitor




    if (client.connect(defaultHost,80))
    { // "184.106.153.149" or api.thingspeak.com
        itt++;  //Replace with a sensor reading or something useful
       //UPLOAD TO THINGSPEAK
        String postStr = www;
        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 (www)+"\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(55000);

}

正如我所说,几乎一切正常。当 Arduino 打开 ESP8266 时,它就会启动。传感器启动并获取值。一个值被上传到 ThingSpeak(只是没有用。

任何想法、建议、示例、教程将不胜感激。谢谢。

【问题讨论】:

    标签: arduino esp8266 arduino-esp8266


    【解决方案1】:

    我的建议是只使用一个 ESP32 来完成所有这些工作。 它比使用两个微控制器更简单、更容易。 您可以使用 ESP32 读取和发送传感器数据,省去两个不同 micros 通信的麻烦。

    【讨论】:

    • 所以我不能使用只有 8 个引脚、vcc、接地、TX、RX、复位、CH-PD、gpio0、gpio2 的 ESP8266-01。我会看看 ESP32,但我在 arduino 中有很多代码。我关闭/打开 ESP8266,关闭太阳能电池板以避免过度充电,我切换到墙壁电源以避免电池电量过低,我监控电池,我监控水位,我监控高水位和低水位监控级别。通过关闭和打开设备,我可以减少用电量。
    • 如果您的项目没有足够的引脚,您可以使用 ESP8266;如果您需要更多引脚,则可以使用 ESP32。
    • 来自 Arduino 的代码可能与 ESP 兼容。
    猜你喜欢
    • 2019-08-05
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多