Объединение 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);
}//конец цикла
Я также подумывал сделать оператор переключения случая, но пока это тоже не сработало. Пожалуйста, дайте мне знать некоторые идеи!
Спасибо!!!
@LG_18, 👍0
Обсуждение2 ответа
В вашем коде есть различные проблемы, но главная из них заключается в том, что вы не можете использовать delay()
, когда пытаетесь выполнить более чем одну задачу одновременно. Задержка приводит к тому, что ваша программа зависает и больше ничего не делает.
(По сути, вам следует забыть о функции delay()
и никогда не писать код Arduino, который ее использует. Это запах кода.)
Вам необходимо переписать свой код, чтобы записать значение millis()
, а затем в следующий раз проверить функцию цикла и убедиться, что прошло достаточно времени. Выполните поиск в Google по запросу «Arduino мигать без задержки», чтобы получить объяснение, как это сделать. Вот пример статьи: https://learn.adafruit.com /multi-tasking-the-arduino-part-1/использование-миллисов-для-времени
(Обратите внимание, что некоторые решения предполагают, что вы увеличиваете счетчик каждый раз в цикле и смотрите, прошло ли какое-то магическое количество счетчиков, в зависимости от того, как часто вы ожидаете, что ваш цикл будет вызываться. Это плохой подход. Вы хотите использовать функцию millis()
.
Также обратите внимание, что вам не следует вызывать Serial.begin() в вашей программе более одного раза. Вы должны поместить этот код в свою функцию настройки., @Duncan C
Ваша функция цикла должна вызывать debounce() и setMode() как можно чаще, и ни одна из ваших функций не должна использовать задержку(). Вместо этого они вычисляют время, прошедшее с момента последнего действия, и, если оно больше того, которое вы сейчас используете в качестве значения задержки, выполняют следующее действие; в противном случае он должен просто вернуться.
Просто любопытно: ваш нынешний код, вероятно, будет работать (лучше...), если вы нажмете и удержите кнопку, пока не получите ответ, вместо того, чтобы нажимать и отпускать несколько раз в надежде получить его. Последний способ зависит от того, нажимаете ли вы кнопку в тот момент, когда система ее считывает, но, как вы выяснили, система читает ее слишком редко, чтобы это было работоспособно. Причиной являются вызовы задержки().
- Как повторить другое действие внутри цикла?
- Ультразвуковой датчик показывает странные показания
- Попытка использовать решение для обнаружения кранов с помощью ADXL345 с Arduino
- Как преобразовать мгновенную кнопку в сенсорный датчик TTP223?
- Бот не активируется после нажатия кнопки
- Библиотека клавиатуры не работает или я где-то ошибаюсь
- Может ли Arduino Uno работать со всеми этими компонентами?
- Какова работа pulseIn?
Пока мы ждем, пока еще 1 человек одобрит изменения, внесенные в этот вопрос... @ LG_18, вам нужно изучить, что такое конечный автомат, и применить его для устранения отскока вашей кнопки., @st2000
код, который вы выложили, не компилируется (@matej внес некоторые исправления).....я думаю, что код на вашем компьютере тоже не компилируется......я тоже думаю, что вы редактируете свой код, а вы подумайте, что вы компилируете и загружаете после редактирования, но компиляция завершается неудачно, и ваш Arduino не обновляется новым эскизом..... затем вы запускаете тест на Arduino, и он все равно ведет себя так же, как и раньше, @jsotola