Таймер 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);
}
}
@Mehmet Haspolat, 👍0
Обсуждение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
- Использовать timer0, не влияя на millis() и micros().
- Arduino Мигает двумя светодиодами без задержки (количество повторений)
- Как рандомизировать задержку в коде шагового двигателя Arduino?
- Запуск двигателя постоянного тока в течение заданного промежутка времени
- Как заставить ЖК-экран прокручивать текст , позволяя вводить кнопки?
- Как запустить 4 светодиода последовательно на основе кнопочного входа?
- Как остановить код Arduino через 1 секунду?
- Нужен сигнал ШИМ частотой 10 кГц от контактов 3 и 11 с использованием таймера 2.
вы не задавали никаких вопросов... вы также не сказали, если что-то работает неправильно, @jsotola
Резистор (подтягивающий) на верхней правой кнопке не на той ноге кнопки., @Gerben