Объединение 2 датчиков в один код с 1 кнопкой

Я пытаюсь создать схему с одной тактильной кнопкой, ЖК-дисплеем и двумя датчиками: 1) температуры и 2) датчиком пульса. Когда цепь включена, на ЖК-дисплее сначала отображаются показания датчика температуры, при нажатии кнопки на ЖК-дисплее отображаются показания датчика пульса.

Код компилируется, на ЖК-дисплее отображаются как функция температуры, так и работа по считыванию пульса.

Я приложил изображение схемы схемы.

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

#include <LiquidCrystal.h>
#define BUTTON 2

const int rs = 12, en = 11, d4 = 7, d5 = 6, d6 = 5, d7 = 4;
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);

//ТЕМПЕРАТУРА
const int tempPin = A0;              // LM35 в A0

int T1=60;

//ПУЛЬС
#define USE_ARDUINO_INTERRUPTS true    // Настройка прерываний низкого уровня для наиболее точного расчета BPM.
#include <PulseSensorPlayground.h>     // Включает библиотеку PulseSensorPlayground.

int PulseWire = A1;                 // Фиолетовый провод датчика пульса, подключенный к аналоговому контакту A0
int blinkPin = 13;                // контакт, чтобы светодиод мигал при каждом ударе
int Threshold = 550;           // Определить, какой сигнал «считать ударом», а какой игнорировать.
// Используйте проект «Начало работы» для точной настройки порогового значения за пределами настройки по умолчанию.
// В противном случае оставьте значение по умолчанию «550».
PulseSensorPlayground pulseSensor;  // Создает экземпляр объекта PulseSensorPlayground с именем «pulseSensor»


//=========ОТКАЗ КНОПКИ============
boolean lastButton = LOW;     // состояние последней кнопки
boolean currentButton = LOW; // текущее состояние кнопки
int switchMode = 1;             //цикл между функциями
//===================================
void setup()
{

  lcd.begin(16, 2);
  // Настраиваем объект PulseSensor, присваивая ему наши переменные.
  pulseSensor.analogInput(PulseWire);
  //pulseSensor.blinkOnPulse(LED13); //автоматическое мигание светодиода Arduino с сердцебиением.
  pulseSensor.setThreshold(Threshold);

  // Дважды проверяем, что объект «pulseSensor» создан и «начал» видеть сигнал.
  if (pulseSensor.begin()) {
    Serial.println("We created a pulseSensor Object !");  //Это печатается один раз при включении питания Arduino или при перезагрузке Arduino.

  }//конец, если

}//завершаем недействительную настройку()

//Функция устранения дребезга
boolean debounce(boolean last) {
  boolean current = digitalRead(BUTTON);
  if (last != current)
  {
    delay(T1);         //ждём #мс
    current = digitalRead(BUTTON); //читаем еще раз
  }//конец, если
  return current;     //возвращаем текущее значение
}//конец логического устранения дребезга

void setMode(int mode) {

  //ТЕМП. ВКЛ.
  if (mode == 1)
  {
    Serial.begin(9600);
    int value = analogRead(tempPin); // считываем значение с датчика
    lcd.setCursor(0, 1);
    float millivolts = (value / 1024.0) * 5000;
    float celsius = millivolts / 10;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Temp = "); lcd.print((celsius * 9) / 5 + 32);  lcd.print((char) 223); //превращаем градусы Цельсия в Фарехайты
    lcd.print("F");
    lcd.setCursor(7, 2);
    lcd.print(celsius); lcd.print((char) 223);
    lcd.print("C");
    delay(1600);

    lcd.clear();
    delay(T1);
  }//конец, если TEMP ON

  //КРАСНЫЙ ВКЛ.
  else if (mode == 2) {
    {
      Serial.begin(9600);
      int myBPM = pulseSensor.getBeatsPerMinute();  // Вызывает функцию нашего объектаpulsSensor, которая возвращает BPM в виде «int».
      // "myBPM" теперь хранит это значение BPM.

      if (pulseSensor.sawStartOfBeat()) {            // Постоянно проверяем, произошел ли «бит».
        Serial.println("♥  A HeartBeat Happened ! "); // Если проверка «истинна», выводим сообщение «Произошло контрольное сообщение».
        Serial.print("BPM: ");                        // Выводим фразу "BPM: "
        Serial.println(myBPM);                        // Распечатываем значение внутри myBPM.

        lcd.setCursor(0, 0);
        lcd.print("HeartBeat Found!");
        lcd.setCursor(4, 1);
        lcd.print("BPM: "); lcd.print(myBPM);

        delay(1600);
        lcd.clear();
        delay(T1);
      }//конец, если
    }//завершаем функцию setMode void
  }
}
    void loop()
    {
      currentButton = debounce(lastButton); //читаем состояние дребезжания
      if (lastButton == LOW && currentButton == HIGH) /// если она была нажата
      {
        switchMode++;
      }
      //при циклическом переборе различных опций,
      //сбрасываем счетчик на 0
      if (switchMode == 3) switchMode = 1;
      setMode(switchMode);
    }//конец цикла

Я также подумывал сделать оператор переключения случая, но пока это тоже не сработало. Пожалуйста, дайте мне знать некоторые идеи!

Спасибо!!!

, 👍0

Обсуждение

Пока мы ждем, пока еще 1 человек одобрит изменения, внесенные в этот вопрос... @ LG_18, вам нужно изучить, что такое конечный автомат, и применить его для устранения отскока вашей кнопки., @st2000

код, который вы выложили, не компилируется (@matej внес некоторые исправления).....я думаю, что код на вашем компьютере тоже не компилируется......я тоже думаю, что вы редактируете свой код, а вы подумайте, что вы компилируете и загружаете после редактирования, но компиляция завершается неудачно, и ваш Arduino не обновляется новым эскизом..... затем вы запускаете тест на Arduino, и он все равно ведет себя так же, как и раньше, @jsotola


2 ответа


1

В вашем коде есть различные проблемы, но главная из них заключается в том, что вы не можете использовать delay(), когда пытаетесь выполнить более чем одну задачу одновременно. Задержка приводит к тому, что ваша программа зависает и больше ничего не делает.

(По сути, вам следует забыть о функции delay() и никогда не писать код Arduino, который ее использует. Это запах кода.)

Вам необходимо переписать свой код, чтобы записать значение millis(), а затем в следующий раз проверить функцию цикла и убедиться, что прошло достаточно времени. Выполните поиск в Google по запросу «Arduino мигать без задержки», чтобы получить объяснение, как это сделать. Вот пример статьи: https://learn.adafruit.com /multi-tasking-the-arduino-part-1/использование-миллисов-для-времени

(Обратите внимание, что некоторые решения предполагают, что вы увеличиваете счетчик каждый раз в цикле и смотрите, прошло ли какое-то магическое количество счетчиков, в зависимости от того, как часто вы ожидаете, что ваш цикл будет вызываться. Это плохой подход. Вы хотите использовать функцию millis().

,

Также обратите внимание, что вам не следует вызывать Serial.begin() в вашей программе более одного раза. Вы должны поместить этот код в свою функцию настройки., @Duncan C


0

Ваша функция цикла должна вызывать debounce() и setMode() как можно чаще, и ни одна из ваших функций не должна использовать задержку(). Вместо этого они вычисляют время, прошедшее с момента последнего действия, и, если оно больше того, которое вы сейчас используете в качестве значения задержки, выполняют следующее действие; в противном случае он должен просто вернуться.

Просто любопытно: ваш нынешний код, вероятно, будет работать (лучше...), если вы нажмете и удержите кнопку, пока не получите ответ, вместо того, чтобы нажимать и отпускать несколько раз в надежде получить его. Последний способ зависит от того, нажимаете ли вы кнопку в тот момент, когда система ее считывает, но, как вы выяснили, система читает ее слишком редко, чтобы это было работоспособно. Причиной являются вызовы задержки().

,