Таймер Arduino для включения подачи в определенное время

Я работаю над проектом для школьного технического класса. Наша цель — сделать транспортное средство, которое будет двигаться по кабелю и сбрасывать яйцо в цель, спускаясь по кабелю. Я использую Arduino, чтобы открыть люк с помощью сервопривода через определенное время, которое задается двумя кнопками, а третья кнопка будет управлять запуском таймера. Вот моя схема

Вот код:

#include <Servo.h>
#include <LiquidCrystal.h>

int b = 0;
int up = 0;
int down = 0;
int val = 100;


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Servo myservo; 

int pos = 0;    

void setup() 
{
  pinMode(b, INPUT);
  pinMode(up, INPUT);
  pinMode(down, INPUT);
  lcd.begin(16, 2);
  myservo.attach(9);  // присоединяем сервопривод к контакту 9 к объекту сервопривода
}

void loop() 
{
  digitalRead(down);
  digitalRead(up);
  digitalRead(b);
  lcd.setCursor(0, 0);
  lcd.print("milli seconds:");

  while (b == HIGH)
  {
    digitalRead(down);
    digitalRead(up);
    digitalRead(b);
    lcd.setCursor(0, 1);
    lcd.print(val);
    myservo.write(0);
    if (up == HIGH, down == LOW)
    {
      val + 1;
    }  
    if (down == HIGH, up == LOW )
    {
      val - 1;
    }

    delay(val);
    myservo.write(100);
    delay(1000);
  }
}

, 👍0

Обсуждение

вы не задавали никаких вопросов... вы также не сказали, если что-то работает неправильно, @jsotola

Резистор (подтягивающий) на верхней правой кнопке не на той ноге кнопки., @Gerben


1 ответ


1

в настройках вы звоните

pinMode(b, INPUT);
pinMode(up, INPUT);
pinMode(down, INPUT);

но b, вверх и вниз равны 0, так что вот что вы делаете:

pinMode(0, INPUT)
pinMode(0, INPUT)
pinMode(0, INPUT)

Это совсем не то, что вам нужно, их нужно назначить контактам. Все, что вы делаете, это повторно устанавливает цифровой контакт 0 arduino на INPUT 3 раза.

во-вторых

while(b == HIGH)

никогда не сработает, так как b равно 0 и никогда не устанавливается ни в какое другое значение. поэтому он никогда не будет == ВЫСОКИЙ

Наконец,

digitalRead(down);

не делает ничего полезного; то, что он делает, считывается с контакта вниз, для которой установлено значение 0, а затем сбрасывает возвращаемое значение на пол

также это,

if (up == HIGH, down == LOW)

это очень неправильно, должно быть

if (up == HIGH && down == LOW)

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

#include <Servo.h>
#include <LiquidCrystal.h>

const int B = 7;
const int UP = 8;
const int DOWN = 9;
int val = 100;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Servo myservo; 

int pos = 0;    

void setup() 
{
  pinMode(B, INPUT);
  pinMode(UP, INPUT);
  pinMode(DOWN, INPUT);
  lcd.begin(16, 2);
  myservo.attach(9);  // присоединяем сервопривод к контакту 9 к объекту сервопривода
  lcd.setCursor(0, 0);
  lcd.print("milli seconds:");
}

void loop() 
{
  // задача: устранить дребезг коммутаторов
  int up = digitalRead(UP);
  int down = digitalRead(DOWN);
  int b = digitalRead(B);  

  if (up == HIGH && down == LOW)
  {
     val += 1  // todo: обработка переполнения
  }

  if (down == HIGH && up == LOW )
  {
     val -= 1
  }

  lcd.setCursor(0, 1);
  lcd.print(val);

  if(b == HIGH)
  {
    myservo.write(0);
    delay(val);
    myservo.write(100);
    delay(val);      
  }

}

это будет делать то, что пытался сделать исходный код, более или менее, но правильный способ сделать это (в псевдокоде):

// Настройка контактов и т. д.
// Setup(): pinMode(...) ... и т.д.
// Loop():
// кнопки устранения дребезга
// ручка вверх/вниз
// запись миллисекунд при нажатии кнопки
// посмотреть, сколько времени прошло
// запускаем сервопривод по истечении времени таймера
,

спасибо за ваш ответ, но это не сработало. сервопривод просто двигался случайным образом, и таймер не работал, он просто увеличивался, а затем сбрасывался и снова увеличивался., @Mehmet Haspolat