Помогите скомбинировать скетчи и разобраться с ошибкой
- Войдите на сайт для отправки комментариев
Здравствуйте дорогие форумчане. Обращаюсь к вам с просьбой о помощи с вот такими вопросами:
1) Имеется два скетча, из этих источников:
http://smart-home.te.ua/arduino-herkonovyij-datchyk/?lang=ru
http://lesson.iarduino.ru/page/kontrol-dostupa-rfid-rc522-servo-arduino/
Хочется сделать замок который открывается через карту, но не закрывается через три секунды сам, как во втором источнике а проверяет состояние геркона, если дверь открыта серва не закрывает замок, если закрыта то и серва закрывает замок.
2) Скетч из первого примера лёгкий и там всё просто. А вот со вторым у меня что то не выходит. При компиляции скетча выдаёт ошибку и подсвечивает эту строку:
{
uidDecTemp = mfrc522.uid.uidByte[i];
uidDec = uidDec * 256 uidDecTemp;
}
Вот как я всё скоммутировал:

Помогите пожалуйста. Я только начинаю осваивать Arduino, а мигать светодиодиками уже надоело((
Заранее благодарен.
на том сайте почему то игнорятся все + в коде, а этот цикл for на который ошибка замените на
for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; }а весь скетч такой:
#include <Servo.h> #include <SPI.h> #include <MFRC522.h> // библиотека "RFID". #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); unsigned long uidDec, uidDecTemp; // для хранения номера метки в десятичном формате Servo servo; void setup() { Serial.begin(9600); Serial.println("Waiting for card..."); SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. servo.attach(6); servo.write(0); // устанавливаем серву в закрытое состояние } void loop() { // Поиск новой метки if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбор метки if ( ! mfrc522.PICC_ReadCardSerial()) { return; } uidDec = 0; // Выдача серийного номера метки. for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } Serial.println("Card UID: "); Serial.println(uidDec); // Выводим UID метки в консоль. if (uidDec == 3763966293) // Сравниваем Uid метки, если он равен заданному то серва открывает. { tone(5, 200, 500); // Делаем звуковой сигнал, Открытие servo.write(90); // Поворачивавшем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворачивавшем ключ и т.д.) delay(3000); // пауза 3 сек и механизм запирается. tone(5, 500, 500); // Делаем звуковой сигнал, Закрытие } servo.write(0); // устанавливаем серву в закрытое состояние }Попробую залить ваш код. А как сделать чтобы геркон в коде учитывался?
Хочется сделать замок который открывается через карту, но не закрывается через три секунды сам, как во втором источнике а проверяет состояние геркона, если дверь открыта серва не закрывает замок, если закрыта то и серва закрывает замок.
не много не понял вы наверное хотите так:
КАРТА ПРАВИЛЬНАЯ И ДВЕРЬ ЗАКРЫТА:
ДА: ОТКРЫВАЕМ ДВЕРЬ
НЕТ: НИЧЕГО НЕ ДЕЛАЯЕМ (ну или пищим и светодиодом моргаем)
КАРТА ПРАВИЛЬНАЯ И ДВЕРЬ ОТКРЫТА:
ДА: ЗАКРЫВАЕМ ДВЕРЬ
НЕТ: НИЧЕГО НЕ ДЕЛАЕМ
или хотите когда карта праильна и дваерь закрыта то открываем дверь
геркон у магнита то закрываем дверь
второе))
ц что уж давайте сами если что подскажу, если хотите чтобы за вас написали код то идите в http://arduino.ru/forumy/ishchu-ispolnitelya
попробую.
Как залил скетч, что вы исправили, проверил. Всё работает. Но заметил такую странность, как только обесточиваешь ардуинку и снова к ней питание подкидываешь не считывает карту, приходится снова заливать скетч и ребутить ардуину и только тогда она начинает работать
И то не всегда с первого раза. Ардуина подклченна к ПК по USB и плюс дополнительное питание от батарейки кроны.
Скорее всего причина в том, что не припаяны к считавателю штекеры.
да когда не были припаяны было и не такое...
вроде получилось. Вот что вышло:
#include <Servo.h>
#include <SPI.h>
#include <MFRC522.h> // библиотека "RFID".
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
unsigned long uidDec, uidDecTemp; // для хранения номера метки в десятичном формате
Servo servo;
int Door_Sensor_Pin = 6; // контакт для датчика
int Door_Sensor_State = 0; // Состояние геркона
const int CardsID_Max=2; //Максимальное количество доступных карт в массиве CardsID
unsigned long CardsID[CardsID_Max]; // Массив для IDшников карт
void setup() {
Serial.begin(9600);
Serial.println("\n-----------------------------------------------------------------------------------------\nSetup complete!");
SPI.begin(); // инициализация SPI / Init SPI bus.
mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card.
servo.attach(5);
servo.write(0); // устанавливаем серву в закрытое состояние
pinMode(Door_Sensor_Pin, INPUT); // установить Door_Sensor_Pin как вход
for(int i=0; i<CardsID_Max; i++) CardsID[i]=0;
CardsID[0]=3544330242;
CardsID[1]=2770378028;
}
void loop()
{
//delay(1000);
//Проверка геркона
//Serial.println("\nGerkon check.");
Door_Sensor_State = digitalRead(Door_Sensor_Pin);
if ( Door_Sensor_State == LOW) // читать Door_Sensor_Pin
{
//Serial.println("Gerkon closed");
servo.write(0); // устанавливаем серву в закрытое состояние
//tone(3, 100, 100);
Serial.println("SERVO: close");
// Поиск новой метки
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Выбор метки
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
uidDec = 0;
// Выдача серийного номера метки.
for (byte i = 0; i < mfrc522.uid.size; i++)
{
uidDecTemp = mfrc522.uid.uidByte[i];
uidDec = uidDec * 256 + uidDecTemp;
}
Serial.println("Card UID: ");
Serial.println(uidDec); // Выводим UID метки в консоль.
for(int i=0; i<CardsID_Max; i++)
{
if(CardsID[i] == uidDec)
{
tone(3, 100, 500); // Делаем звуковой сигнал, Открытие
servo.write(90); // Поворачивавшем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворачивавшем ключ и т.д.)
Serial.println("SERVO move 90");
break;
}
};
}
else
{
Serial.println("Gerkon: open");
}
Serial.println("Waiting 3 sec...\n");
delay(3000); //Время на открытие двери после того как карта принята
}
Только как то нестабильно это всё работает. То нормально считала карту открыл дверь, геркон в разрыве, замок не закрывается, то сам по себе закрывает замок когда дверь открыта. Может пару раз нормально отработать а третий раз глюкнет, или наоборот. Не могу понять в чём дело. Помогите разобраться.
наверное из за дребезга геркона напишите
и проверьте
pinMode(Door_Sensor_Pin, INPUT); // установить Door_Sensor_Pin как вход
вместо этой строки?
да
Попробую. Спасибо большое за помощь!!!
дребезг геркона - раз
серву не подключают к дуне по питанию. сделайте ей нормальное питание отдельное 5-6 вольт - два
Спасибо большое за наставления. А если крону к серве как питающий элемент, временный для опытов, подключить, то нормально будет?
Arduino
Сервопривод
5V *(к плюсу кроны)
Красный (Центральный)
GND (к минусу кроны)
Черный или Коричневый (Левый)
pin 5
Белый или Оранжевый (Правый)
Питание от отдельного БП на 5-6В (Крона - 9В), + только на серву, GND соединяем.
Ага понятно. Спасибо за помощь!!!
Вот так надо серву подключить. Извиняюсь что на картинке аккумулятор, просто во фризинге не нашёл блок питания.