Программный сброс WDT HX711

Я использую следующий код, чтобы проверить, равно ли значение 0, например, нет ли весов, и если да, то он будет игнорировать это значение и ничего с ним не делать. Код работает правильно, но продолжает выводить следующее:

Мягкий сброс WDT

стек>>>

ctx: cont sp: 3ffffd70 конец: 3ffffc0 смещение: 01b0 3ffff20: 00000050 00000000 31310010 36323439 3ffff30: 00000000 00000000 00000010 00000001 3ffff40: 3ffee408 00000000 00000000 40202927 3ffff50: 4022dff2 a0000000 bf2cc404 3ffe84dc 3ffff60: 3ffee408 bf2cc404 3ffee408 40202962 3ffff70: 3ffeeb9c 40202c00 3ffee408 40202996
3ffff80: 3ffee448 bf2cc404 3ffee408 40202664 3ffff90: 3fffdad0 fffe2d7e 3ffee448 3ffee4b0 3fffffa0: 3fffdad0 00000000 3ffee480 40203848 3ffffb0: fefeffe fefeffe 3ffe8514 40100a41
<<

Если я удалю if(чтение < 0.01){, код будет работать нормально. Что может быть причиной этого?

#include "HX711.h"
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

#define DOUT  D3
#define CLK  D2
const char* ssid = "Curtis"; 
const char* password = "password";


HX711 scale(DOUT, CLK);
float calibration_factor = -118470; //-7050 работал для моей установки с максимальным весом 440 фунтов
void joinwifi(){
    WiFi.begin(ssid, password);
  Serial.println();
  Serial.print("Connecting");
   while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("success!");
  Serial.print("IP Address is: ");
  Serial.println(WiFi.localIP());
}
void setup() {
  Serial.begin(9600);
  joinwifi();
  Serial.println("HX711 calibration sketch");
  Serial.println("Remove all weight from scale");
  Serial.println("After readings begin, place known weight on scale");
  Serial.println("Press + or a to increase calibration factor");
  Serial.println("Press - or z to decrease calibration factor");
  scale.set_scale();
  scale.tare(); //Сбрасываем масштаб до 0
  long zero_factor = scale.read_average(); //Получаем базовые показания
  Serial.print("Zero factor: "); //Это можно использовать для устранения необходимости тарирования весов. Полезно в проектах постоянного масштаба.
  Serial.println(zero_factor);
}
void loop() {
  while (WiFi.status() == WL_CONNECTED)
  {
    scale.set_scale(calibration_factor); //Настроиться на этот калибровочный коэффициент
    float reading = scale.get_units(1);
    if(reading < 0.01){
      Serial.print("no need");
       Serial.println();
    }
    else{
      Serial.print("Reading: ");
      Serial.print(reading);
      Serial.print(" lbs"); //Измените это значение на кг и заново отрегулируйте калибровочный коэффициент, если вы, как здравомыслящий человек, следуете единицам СИ.
      Serial.print(" calibration_factor: ");
      Serial.print(calibration_factor);
      Serial.println();
      if(Serial.available())
      {
        char temp = Serial.read();
        if(temp == '+' || temp == 'a')
          calibration_factor += 10;
        else if(temp == '-' || temp == 'z')
          calibration_factor -= 10;
      }
    }
  }
  while (WiFi.status() != WL_CONNECTED)
  {
    joinwifi();
  }

}

, 👍0


1 ответ


Лучший ответ:

2

Потому что весь ваш код выполняется в режиме while внутри вашего цикла (который является избыточным — циклы Loop(), отсюда и его название), и у вас нет задержек или yield(), вы не даете сторожевому таймеру того толчка, который необходим ему, чтобы остаться в живых.

Либо удалите операторы while и превратите их в if, либо добавьте вызовы yeild() внутри циклов while.

,

@CurtisBoylan, если это решит проблему, примите ответ Маженко как решение., @romkey