Как отобразить что-то в последовательном мониторе?
Я пытаюсь сделать устройство с двумя кнопками и одним аналоговым входом. Сначала последовательный монитор покажет INITIALIZING, затем он покажет ready to start, если нажат измеряемый пин. Только тогда он начнет измерение, если нажать еще раз, затем он покажет ****************************** и если нажат пин сброса, он покажет reset. Если нажать еще раз, то ------------------------ но проблема в том, что он показывает
***************
(аналоговое значение) в то же время.
Это мой код.
int sensor = A0;
int A = 0;
int resetPin = 3;
int measurePin = 2;
int resetstatus = 0;
int measurestatus = 0;
boolean flag1 = true;
boolean flag2 = true;
long current = 0;
void setup() {
Serial.begin (9600);
pinMode (sensor, INPUT);
pinMode (resetPin, INPUT_PULLUP);
pinMode (measurePin, INPUT_PULLUP);
current = millis ();
}
void loop() {
while (current < 3000) {
Serial.println ("INITIALIZING");
current = millis ();
delay (200);
}
Serial.println ("Ready to begin");
delay (200);
resetstatus = digitalRead (resetPin);
measurestatus = digitalRead (measurePin);
if (resetstatus == LOW) {
flag1 = !flag1;
delay (50);
}
if (flag1 == HIGH) {
delay (50);
reset ();
}
if (flag1 == LOW) {
Serial.println ("------------------------------------");
}
delay (100);
if (measurestatus == LOW) {
flag2 = !flag2;
delay (50);
}
if (flag2 == HIGH) {
delay (50);
measure ();
}
if (flag2 == LOW) {
Serial.println ("***********************************");
digitalWrite (13, LOW);
}
delay (100);
}
void measure() {
A = analogRead (sensor);
Serial.println (A);
digitalWrite (13, HIGH);
}
void reset() {
Serial.println ("reset");
}
@Peouse Dutta, 👍0
Обсуждение1 ответ
Лучший ответ:
Вы объявили flag1 и flag2 как логические значения, но затем вы пытаетесь узнать, являются ли они HIGH или LOW. Логические значения могут быть либо истинными, либо ложными. Однако из-за особенностей C++ это, вероятно, сработает, если High и low равны 1 и 0, то это просто плохой стиль.
Когда у вас есть этот фрагмент кода:
if (flag2 == HIGH)
{
delay (50);
measure ();
}
if (flag2 == LOW)
{
Serial.println ("***********************************");
digitalWrite (13, LOW);
}
Вместо этого можно использовать оператор else, например
if (flag2 == true) // Исправлено на true
{
delay (50);
measure ();
}
else
{
Serial.println ("***********************************");
digitalWrite (13, LOW);
}
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Оператор while с
millis()
здесь используется неправильно.current < 3000
может быть истинным только в течение первых 3 секунд после включения питания (а также каждый раз, когдаmillis()' переполняется). Если вы хотите, чтобы он был выполнен только один раз, вы должны написать
setup(). Также: Что вы подразумеваете под
в то же время`?, @chrislизмените объявления выводов на #define sensor A0 и т. д.... нет причин делать их переменными. переменная current должна быть unsigned long, а не просто long. Также нет необходимости использовать millis() для части init. В цикле настройки вы можете просто сделать Serial.println("Init"); delay(3000);, @Chad G
Все еще не уверен, в чем проблема. Можете ли вы опубликовать вывод?, @Chad G
@chrisl я хотел, чтобы ИНИЦИАЛИЗАЦИЯ отображалась только в течение 3 секунд при включении питания, @Peouse Dutta
@ChadG Я хочу наблюдать только аналоговое значение при нажатии кнопки измерения и отображать сброс при нажатии кнопки сброса., @Peouse Dutta
Тогда, как сказали Чад и я, лучше переместить это в
setup()
(так как эта функция сделана для одноразовой инициализации) и использовать простуюdelay()
. Когда вы ничего не делаете в это время (как это уже делает ваш скетч), это лучше понимать, @chrislи что он делает? Пожалуйста, дайте немного более подробное описание действий пользователя и вывода, @Chad G