Используя датчик веса 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, но продолжает считывать значения. Я знаю, что формат не самый лучший, но любая помощь была бы очень признательна!!
@Frank Cerny, 👍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, но вы должны удалить его из каждого места, где он у вас есть.
- Как связаться с датчиком через порты RX/TX Arduino?
- Как получить ненулевой выход из HX711 и ячейки загрузки?
- Когда дело доходит до связи UART-RS485, в чем разница между модулем "MAX485" и модулем "HW-0519"?
- Интерфейс RS422 с Arduino
- Печатать на serial monitor, когда он обнаруживает изменение значения
- Arduino показывает "avrdude: ser_open(): can't open device ”\\.\COM3" после последней загрузки
- Несколько датчиков, подключенных к последовательным портам Arduino MEGA 2560
- FlySky TH9X с Arduino: невозможно заставить функциюpulsIn() возвращать разумные значения для любого канала
Спасибо вам за это исправление, но оно все равно не выйдет из цикла do, если вес больше 10. Пример: Это работает несколько -0.6 Это несколько работает 13.8 Это несколько работает -1.0 Это несколько работает -5.4, @Frank Cerny
Можете ли вы исправить свой скетч и заменить полностью сломанный на тот, который компилируется? Также убедитесь, что вы отсортировали свои отступы - это сразу же показало бы вам плохие скобки., @Majenko
Лучше. Теперь проверьте мою правку (Часть II), @Majenko
Ну, это не все исправило, но это определенно очень помогло мне, большое вам спасибо за вашу помощь и поддержку, я занимался этим несколько часов, но теперь я действительно могу дышать. Спасибо!!!, @Frank Cerny