Помощь с программой парковки автомобиля Arduino

Вот программа и принципиальная схема парковки на базе Arduino (скопировано с http://www.arduining.com/2012/10/13/arduino-parking-lot-filled/ ). Я хочу заменить выключатель выхода и конца на ИК-датчик или ультразвуковой датчик.
/*ParkingL02.pde
Arduining.com 08 JUL 2012
Code used in the production of the Youtube material.
*/
#include <Servo.h>
Servo myservo; // создаем объект сервопривода для управления сервоприводом
#define ServoM 12 //Подключен к серводвигателю.
#define Bright 11 //библиотека сервопривода отключает ШИМ на контактах 9 и 10.
#define Exit 9 // Контакт, подключенный к кнопке EXIT.
#define In 8 // Контакт, подключенный к кнопке IN.
#define BarLow 177 //Нижнее положение барьера.
#define BarUp 95 //Верхнее положение барьера.
#define CAPACITY 8 //Вместимость парковки.
#define INTEN 80 //Интенсивность отображения %
//Подключение выводов к сегментам (катодам).
#define segA 0
#define segB 1
#define segC 2
#define segD 3
#define segE 4
#define segF 5
#define segG 6
int SensorIn(void); // объявляем функцию датчика для входа в автомобили
//Массив с сегментами для представления десятичных чисел (0-9).
byte segments[10] = {
// pgfedcba <--- сегменты
B00111111, // число 0
B00000110, // номер 1
B01011011, // номер 2
B01001111, // номер 3
B01100110, // номер 4
B01101101, // номер 5
B01111101, // номер 6
B00000111, // номер 7
B01111111, // номер 8
B01101111 // номер 9
};
void setup() {
myservo.attach(ServoM); // присоединяем сервопривод.
pinMode(Exit, INPUT); // устанавливаем контакт кнопки "EXIT" на вход
pinMode(In, INPUT); // устанавливаем контакт кнопки "IN" на вход
digitalWrite(Exit, HIGH); // Подключаем подтягивающий резистор.
digitalWrite(In, HIGH); // Подключаем подтягивающий резистор.
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
pinMode(Bright, OUTPUT);
analogWrite(Bright, 255 * INTEN / 100);
myservo.write(BarLow); //Барьер в нижнем положении
// задержка(1000);
}
int Available = 9; // Количество доступных мест.
void loop() {
Display(Available);
if ( SensorIn() == 0 )
{
if (Available != 0) {
Available--;
myservo.write(BarUp);
delay(3000);
myservo.write(BarLow);
}
}
if (digitalRead(Exit) == 0)
{
if (Available != CAPACITY) {
Available++;
myservo.write(BarUp);
delay(3000);
myservo.write(BarLow);
}
}
}
/*-------------------------------------------------------------------
Put the segments according to the number.
--------------------------------------------------------------------*/
void Display(int number) {
byte segs = ~segments[number]; //"~" используется для общего анода.
digitalWrite(segA, bitRead(segs, 0) );
digitalWrite(segB, bitRead(segs, 1) );
digitalWrite(segC, bitRead(segs, 2) );
digitalWrite(segD, bitRead(segs, 3) );
digitalWrite(segE, bitRead(segs, 4) );
digitalWrite(segF, bitRead(segs, 5) );
digitalWrite(segG, bitRead(segs, 6) );
}
// Мы переместили «код датчика» для ввода автомобилей в эту функцию
// На данный момент «In-sensor» — это просто кнопка.
int SensorIn(void) {
return ( digitalRead(In) );
}
1 ответ
Если бы это был я, я бы подошел к этому так:
- Переместить каждую кнопку чтения (digitalRead(xxx)) в ее собственную процедуру.
- Заставьте все работать, продолжая использовать кнопки.
- Напишите отдельный скетч для любого датчика или датчиков, которые вы собираетесь использовать. Все, что ему нужно сделать, это зажечь светодиод, чтобы вы могли быть уверены, когда он обнаруживает, а когда нет.
- Теперь замените содержимое каждой из новых процедур кнопок (из шага 1) на код датчика, который вы только что написали. Ваши процедуры должны возвращать те же значения для обнаружения датчика, которые они возвращали для обнаружения кнопки. Вам не нужно менять никакую другую часть вашего исходного кода.
- Исправьте все ошибки, допущенные на предыдущем этапе, и все готово.
Обновление:
Я только что сделал отступ в вашем коде (выше) и внес одно из предложенных мной изменений. Вы увидите, что я создал новую функцию SensorIn() и поместил туда код для чтения кнопки «In». Сделайте то же самое для кнопки «Exit».
Затем, используя новый скетч, научитесь писать код для любого типа датчика, который вы хотите использовать для входа в автомобили. Когда это сработает, скопируйте его в функцию 'SensorIn()' этого скетча, заменив строку, которая считывает нажатие кнопки. Сделайте это много работающим.
Затем сделайте то же самое, напишите новый скетч для датчика выхода, пока вы не сможете заставить его работать надежно. Конечно, если вы решите использовать тот же тип датчика для выхода, что и для входа, вы можете просто повторно использовать тот же код. Заставьте этот скетч снова работать.
Теперь у вас должен быть скетч, похожий на скетч кнопки, но использующий два реальных датчика вместо кнопок.
Можете переписать код и вставить, пожалуйста? Я тут нуб... И совсем запутался... Пишу отдельный код для ультразвукового датчика... и вызываю его вместо кнопки. Вызывает ещё больше ошибок., @Manlam Konyak Arolim
Кодирование и проект завершены...это старый вопрос :) В любом случае спасибо, @Manlam Konyak Arolim
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- avrdude ser_open() can't set com-state
- Как подключиться к Arduino с помощью WiFi?
- Mac OSX Yosemite не отображает последовательные порты для Uno R3
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
Возможно, вам поможет форматирование кода., @Michel Keijzers
Теоретически ИК-датчик мог бы работать точно так же, как кнопка (с точки зрения кода)., @Paul
Мне нужна схема с подключением ИК-датчика, @Revathi
Мне нужен этот код, но у меня есть ЖК-дисплей. Я делаю тот же проект с двумя ИК-датчиками. Если кто-то сделал это с ЖК-дисплеем, буду благодарен. Мне нужно показать его на следующей неделе. Помогите, пожалуйста., @Mohamed Toumi