Ayez du code arduino pour les enregistreurs de température qui fonctionne TRÈS PROCHE ...!

J'ai construit une routine OTA pour pouvoir les mettre à jour à distance, mais la boucle delay () que je devais m'assurer qu'elle ne consignait que les températures toutes les 15 minutes pose maintenant des problèmes car elle gèle efficacement l'arduino par conception pendant 15 minutes, ce qui signifie que l'OTA ne le ferait pas '' t travailler pendant qu'il est dans cet état.

Certaines suggestions disent simplement de passer à millis () à la place, mais je n'arrive pas à faire fonctionner cela et cela enregistre ~ 20 enregistrements par seconde pour le moment.

Idéalement, je veux juste que delay_counter compte jusqu'à la valeur de DELAY_TIME, puis exécute le reste du code et réinitialise le compteur.

Quelqu'un peut-il m'aider et indiquer ce que je fais stupide dans mon code ???


// v2 Temp sensor
// Connecting to Home NAS

#include <DHT.h>
#include <DHT_U.h>


#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <WiFiUdp.h>
#include <ESP8266mDNS.h>
#include <ArduinoOTA.h>
#include <InfluxDbClient.h>



#define SSID "xxx" //your network name
#define PASS "xxx" //your network password
#define VersionID "v3"


#define SensorName "ServerUnit" //name of sensor used for InfluxDB and Home Assistant
// Temp Sensor 1 - GardenTropical
// Temp Sensor 2 - GardenRoom
// Temp Sensor 3 - Greenhouse
// Temp Sensor 4 - OutsideGreenhouse
// Temp Sensor 5 - ServerUnit

// Connection Parameters for Jupiter InfluxDB
#define INFLUXDB_URL "http://192.168.1.5:8086"
#define INFLUXDB_DB_NAME "home_assistant"
#define INFLUXDB_USER "xxx"
#define INFLUXDB_PASSWORD "xxx"


// Single InfluxDB instance
InfluxDBClient client(INFLUXDB_URL, INFLUXDB_DB_NAME);
// Define data point with measurement name 'DaveTest`
Point sensor("BrynyneuaddSensors");


#define PORT 80
#define DHTPIN 4     // what pin the DHT sensor is connected to
#define DHTTYPE DHT22   // Change to DHT22 if that's what you have
#define BAUD_RATE 115200 //Another common value is 9600
#define DELAY_TIME 900000 //time in ms between posting data to Home Server
unsigned long delay_counter = 0;

DHT dht(DHTPIN, DHTTYPE);


//this runs once
void setup()
{
  Serial.begin(BAUD_RATE);

  // Connect to WIFI
  WiFi.begin(SSID, PASS);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print("*");
  }

  // Initialise OTA Routine
   ArduinoOTA.onStart([]() {
    Serial.println("Start");
  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\nEnd");
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
    else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
    else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
    else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
    else if (error == OTA_END_ERROR) Serial.println("End Failed");
  });
  ArduinoOTA.begin();
  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());



  //initalize DHT sensor
  dht.begin();

  // set InfluxDB database connection parameters
  client.setConnectionParamsV1(INFLUXDB_URL, INFLUXDB_DB_NAME, INFLUXDB_USER, INFLUXDB_PASSWORD);

  // Add constant tags - only once
  sensor.addTag("device", SensorName);

  // Check server connection
  if (client.validateConnection()) {
    Serial.print("Connected to InfluxDB: ");
    Serial.println(client.getServerUrl());
  } else {
    Serial.print("InfluxDB connection failed: ");
    Serial.println(client.getLastErrorMessage());
    Serial.println(client.getServerUrl());
    Serial.println("Exiting DB Connection");

  }

}

//this runs over and over
void loop() {
  ArduinoOTA.handle();


  float h = dht.readHumidity();
  Serial.print("Humidity: ");
  Serial.println(h);
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float c = dht.readTemperature();
  Serial.print("Temperature: ");
  Serial.println(c);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(c)) {
    Serial.println("Reading DHT22 Failed, exiting");
    return;
  }

  //update Influx DB channel with new values
  updateTemp(c, h);

  Serial.print("Writing to InfluxDB: ");


  //INFLUXDB - clear temp data so it doesn't repeat
  sensor.clearFields();

  // Update Influx DB
  sensor.addField("Temperature", c);
  sensor.addField("Humidity", h);

  Serial.println(sensor.toLineProtocol());
  // Write data
  client.writePoint(sensor);

  //wait for delay time before attempting to post again
  if(millis() >= DELAY_TIME){
        delay_counter += 0;
        }

    //Increment Delay Counter
    delay_counter++;
}


bool updateTemp(float tempC, float humid) {

  WiFiClient client;    // Create a WiFiClient to for TCP connection


  Serial.println("Receiving HTTP response");
  while (client.available()) {
    char ch = static_cast<char>(client.read());
    Serial.print(ch);
  }
  Serial.println();


  Serial.println("Closing TCP connection");
  client.stop();
  return true;
}

0
Alphatester77 20 avril 2020 à 22:06

3 réponses

Meilleure réponse

Rendez-le simple et utilisez un code facile:

const unsigned long timeIntervall = 15*60*1000; // 15 minutes
unsigned long timeStamp = 0;

void setup(){....}

void loop() {
  ArduinoOTA.handle(); // is running all the time

  // Code in this section only runs every timeIntervall - rollover safe
  if(millis() - timeStamp > timeIntervall ){

  float h = dht.readHumidity();
 ......
  // Write data
  client.writePoint(sensor);

  timeStamp = millis();  // reset the timer
   }
}
1
Codebreaker007 20 avril 2020 à 20:45

Définissez un TimerObject. cela semble être ce que vous voulez.

  1. Téléchargez le code Arduino TimerObject depuis github et suivez les instructions d'installation
  2. #include "TimerObject.h"
  3. Créer la fonction de rappel
  4. Créez le TimerObject
  5. Configurez le TimerObject et appelez périodiquement update() dans votre loop():
// make sure to include the header
#include "TimerObject.h"

...

// setup your TimerObject
TimerObject* sensor_timer = new TimerObject(15 * 60 * 1000); // milliseconds

...

// define the stuff you want to do every 15 minutes and
// stick it in a function
// not sure what from your loop() needs to go in here
void doSensor()
{
  float h = dht.readHumidity();
  Serial.print("Humidity: ");
  Serial.println(h);
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float c = dht.readTemperature();
  Serial.print("Temperature: ");
  Serial.println(c);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(c)) {
    Serial.println("Reading DHT22 Failed, exiting");
    return;
  }

  //update Influx DB channel with new values
  updateTemp(c, h);

  Serial.print("Writing to InfluxDB: ");


  //INFLUXDB - clear temp data so it doesn't repeat
  sensor.clearFields();

  // Update Influx DB
  sensor.addField("Temperature", c);
  sensor.addField("Humidity", h);

  Serial.println(sensor.toLineProtocol());
  // Write data
  client.writePoint(sensor);
}

...

// add the timer setup to your setup()
// probably at the end is a good place
void setup()
{
    ...
    // lots of stuff above here
    sensor_timer->setOnTimer(&doSensor);
    sensor_timer->Start();
}

// modify your loop() to check the timer on every pass
void loop()
{
    ArduinoOTA.handle();

    sensor_timer->Update();
}

Si vous ne voulez pas attendre 15 minutes pour le premier appel de doSensor, vous pouvez l'appeler explicitement à la fin de votre fonction setup() avant de démarrer le minuteur.

3
JohnFilleau 20 avril 2020 à 19:44

Voici un exemple simple d'utilisation de millis ()


int last_report = -777;//dummy value

int REPORT_INTERVAL = 15 *60 ; // 15 minutes

void loop() {

  ArduinoOTA.handle();

  int interval = millis() / 1000 - last_report;

  if (interval < REPORT_INTERVAL) {
    return;
  }

  last_report = millis() / 1000;

  //do some important stuff

}

1
Maxim Sagaydachny 20 avril 2020 à 19:50