Используя датчик веса Arduino, он не удовлетворяет циклу while, не могу понять, почему

/*

 This example code uses bogde's excellent library: https://github.com/bogde/HX711
 bogde's library is released under a GNU GENERAL PUBLIC LICENSE

 The HX711 does one thing well: read load cells. The breakout board is compatible with any wheat-stone bridge
 based load cell which should allow a user to measure everything from a few grams to tens of tons.
 Arduino pin 2 -> HX711 CLK
 3 -> DAT
 5V -> VCC
 GND -> GND

 The HX711 board can be powered from 2.7V to 5V so the Arduino 5V power should be fine.

*/

#include "HX711.h"
#include <Servo.h>

float calibration_factor = -4050.0;

#define DOUT  3
#define CLK  2
Servo myServo;

HX711 scale(DOUT, CLK);

void setup() {
    Serial.begin(9600);
    Serial.println("Food Test");
    scale.tare(); //Assuming there is no weight on the scale at start up, reset the scale to 0
    Serial.println("Readings:");
    myServo.attach(9);
    long zero_factor = scale.read_average(); //Get a baseline reading
    Serial.print("Zero factor: "); //This can be used to remove the need to tare the scale. Useful in permanent scale projects.
    Serial.println(zero_factor);
}

void loop() {
    scale.set_scale(calibration_factor); //Adjust to this calibration factor

    if ((scale.get_units(), 1) <= 5) {
        Serial.print("whoa that is light, more food needed");
        myServo.write(90); // Open food hatch
        delay(2000);
        myServo.write(0);

        do {
            // Do nothing
            Serial.println("It is working somewhat");
            Serial.println(scale.get_units(), 1);
            delay(1000);
            // When weight exceeds 5 it should break out of this loop and go below
        } while ((scale.get_units(), 1) < 10);

        Serial.print("Closing the Hatch");
        myServo.write(0); // close food hatch
    } else {
        Serial.print("Something Went Wrong");
    }
}

Вывод:

It is working somewhat  
10.6
It is working somewhat
10.9
It is working somewhat
10.5
It is working somewhat
6.9
It is working somewhat
-0.8

Я постараюсь объяснить проблему как можно лучше. Я использую библиотеку масштабирования,и scale.get_units (), x возвращает значение в виде float. Все дело в том, что сервопривод будет открываться и оставаться открытым до тех пор, пока не будет достигнут указанный вес в 10 фунтов. Как видно из выполнения, в то время как цикл-это то, что я указываю. Он переходит в цикл if, а затем в цикл do while, и он постоянно выводит значения показаний, которые я хочу. НО, даже когда я достигну более 10 фунтов, он не выйдет из цикла Do/while, по сути, он никогда не удовлетворяет условию while, и я понятия не имею, почему. Он выводит значения более 10, но продолжает считывать значения. Я знаю, что формат не самый лучший, но любая помощь была бы очень признательна!!

, 👍1


1 ответ


1

Мне кажется, что у вас там есть лишняя скобка, которая вам не нужна.

На данный момент ваша структура такова:

if {
    do {
    }
} while...

В нынешнем виде ваш скетч не будет скомпилирован. Несбалансированные кронштейны предотвращают это. Удалите лишний, чтобы параметр while был связан с параметром "Не делать, если" и сообщите об этом.


Часть II

Основная причина вашей проблемы-странный фрагмент кода, который у вас есть в ваших ifи while.

if ((scale.get_units(), 1) <= 5) {

....

} while ((scale.get_units(), 1) < 10);

В обоих из них у вас есть бит (scale.get_units(), 1), который совершенно бессмыслен. Оператор запятой в C вызывает (или оценивает) обе стороны, а затем возвращает правую сторону. Таким образом, это вызывает scale.get_units (), а затем возвращает 1. 1 всегда было и всегда будет меньше 10, поэтому время никогда не заканчивается.

Я не знаю , чего вы надеялись достичь, поместив там, 1, но вы должны удалить его из каждого места, где он у вас есть.

,

Спасибо вам за это исправление, но оно все равно не выйдет из цикла do, если вес больше 10. Пример: Это работает несколько -0.6 Это несколько работает 13.8 Это несколько работает -1.0 Это несколько работает -5.4, @Frank Cerny

Можете ли вы исправить свой скетч и заменить полностью сломанный на тот, который компилируется? Также убедитесь, что вы отсортировали свои отступы - это сразу же показало бы вам плохие скобки., @Majenko

Лучше. Теперь проверьте мою правку (Часть II), @Majenko

Ну, это не все исправило, но это определенно очень помогло мне, большое вам спасибо за вашу помощь и поддержку, я занимался этим несколько часов, но теперь я действительно могу дышать. Спасибо!!!, @Frank Cerny