Как отобразить что-то в последовательном мониторе?

Я пытаюсь сделать устройство с двумя кнопками и одним аналоговым входом. Сначала последовательный монитор покажет 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");
}

, 👍0

Обсуждение

Оператор 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


1 ответ


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

2

Вы объявили 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);
}
,