Пытаетесь прочитать текущее положение гибкого датчика и сохранить его как переменную? НАНО ATmega328p

Я пытаюсь написать код для считывания текущего положения гибкого датчика при нажатии кнопки и использования этих данных для подачи импульса на пьезоэлемент. Я настроил его так, чтобы он считывал показания гибкого датчика и подавал сигнал тревоги, когда он достигает 100 или ниже, это работает! Итак, я хочу интегрировать кнопку, на которую вы нажимаете, чтобы установить текущее состояние гибкого датчика, а затем, когда он перемещается и становится меньше числа, зарегистрированного при нажатии кнопки, тогда подается сигнал тревоги. Раньше я писал на базовом и быстром базовом языках, а сейчас (много лет спустя) пытаюсь выучить C и испытываю трудности. Я использую NANO ATmega328p — вот мой код:

int flexSensorPin = A0;//аналоговый вывод 7= tiny2=A1
const int Piezo = 3; //цифровой контакт 3 = tiny0
const int inPin = 2; // Нажмите кнопку, чтобы установить текущий статус изгиба
void setup() {
  pinMode (Piezo, OUTPUT);
  pinMode(inPin, INPUT);    // объявляем кнопку как вход
  Serial.begin(9600);
}
void loop() {
  int val = 0;
  val = digitalRead(inPin);
  int flexSensorReading = analogRead(flexSensorPin);
  Serial.println(flexSensorReading);
  if (flexSensorReading < 100) {
    Serial.println("Alarm! Set Angle Exceeded");
    digitalWrite(Piezo, HIGH);
    delay(100);
    digitalWrite(Piezo, LOW);

  }
  delay(250);
}

, 👍0

Обсуждение

А в чем конкретно у вас проблема с написанием кода? Вы уже прочитали состояние контакта кнопки и аналоговое напряжение гибкого датчика. Используйте оператор if, где вы присваиваете переменной аналоговое значение, если кнопка была нажата. Затем замените «100» в первом операторе «if» на эту переменную., @chrisl

И еще две вещи, когда вы это сделаете: чтобы кнопка реагировала, вам следует отказаться от вызовов delay() и использовать неблокирующий код (см. пример BlinkWithoutDelay в Arduino IDE). И тогда, возможно, придется отключить вашу кнопку. Для этого в сети можно найти множество обучающих программ., @chrisl

Также, в зависимости от вашей схемы подключения, вы можете использовать INPUT_PULLUP вместо INPUT, если у вас нет внешнего подтягивающего резистора, подключенного к входу вашей кнопки. (https://www.arduino.cc/en/Tutorial/InputPullupSerial), @Maximilian Gerhardt

Также библиотека TimedAction (https://playground.arduino.cc/Code/TimedAction) поможет вам периодически переключать пьезовыход (если необходимо вызвать сигнал тревоги) каждые 100 мс. Таким образом, вы избавитесь от вызовов delay(), и ваша кнопка станет более отзывчивой. Для устранения дребезга кнопок вы также можете использовать библиотеку Button (https://playground.arduino.cc/Code/Button)., @Maximilian Gerhardt


1 ответ


1

Вам нужно будет добавить это в начало вашего кода.

int LoggedPosition=100;

Изменить эту строку

if (flexSensorReading < 100) {

К этому

if (flexSensorReading < LoggedPosition) {

и добавьте это непосредственно перед задержкой, в конце функции loop()

if(digitalRead(inPin)){
    LoggedPosition=flexSensorReading;
}
,

Я ввел этот код, но он, похоже, сбрасывает значение на новое каждый раз, когда он сгибается, поэтому вы продолжаете сгибать, пока значение не превысит датчик изгиба. Это похоже на то, что мне нужно. Но не так. Я хочу, чтобы он устанавливал значение текущего положения при нажатии кнопки или при включении питания, а затем использовал это значение в качестве «граничной» точки, при достижении или превышении которой раздается звуковой сигнал, который продолжает звучать до тех пор, пока не будет нажата кнопка для сброса значения или датчик изгиба не будет перемещен в «безопасное» положение., @Dave Ellison

Я думаю, что ваша кнопка при нажатии подает низкое напряжение на штырек. Это немного нелогично, но это единственное, что может вызвать такое поведение. Вам нужно будет изменить if(digitalRead(inPin)) на if(digitalRead(inPin)==0). Проверьте, работает ли это., @Nitro