Помогите со скетчем управление жалюзи.
- Войдите на сайт для отправки комментариев
Сб, 03/08/2019 - 14:19
Решил сделать жалюзи управляемые радио брелком 433 мгц, нашол готовый проект на сайте амперка http://wiki.amperka.ru/projects:irjalousie
но вот этот проект управляется с телевизионного пульта, а нужно с с радио брелка.Пытался сам переделать но нечего не получилось.Кто разбирается помагите со скетчем.
вот радиомодуль
вот брелок
вот сам скетч
// Мы будем использовать библиотеки для работы с ИК и с сервоприводами
#include <IRremote.h>
#include <Servo.h>
// Определим номера используемых пинов
#define RECV_PIN 2
#define SERV_PIN 3
#define BUZZER_PIN 4
// Определим тип «действие»
enum Command
{
CMD_NONE = 0,
CMD_OPEN = 1,
CMD_CLOSE = 2
};
// Создадим объект для пользования ИК-библиотекой
IRrecv irrecv(RECV_PIN);
decode_results results;
// Создадим переменные, которые будут хранить коды кнопок пульта
unsigned long codeOpen = 0;
unsigned long codeClose = 0;
// Определим переменные для хранения полученной команды и времени её получения
unsigned long cmdStartTime;
unsigned char cmd;
// Создадим объект для управления сервоприводом постоянного вращения
Servo srv;
// Из-за особенностей реализации нельзя использовать библиотеку IRremote
// вместе с функцией beep (они используют одно и тоже прерывание). Чтобы
// справиться с этой бедой мы, не используя прерываний, реализовали свою версию
// функции beep.
void beeep(int pin, int freq, unsigned long duration)
{
unsigned long start;
// Переводит пин в выход
pinMode(pin, OUTPUT);
// Запоминаем момент начала выполнения
start = millis();
// В течение duration миллисекунд пищим
while (millis() - start < duration) {
// Частота писка определяется паузами между изменениями состояния пина
digitalWrite(pin, HIGH);
delay(1000/freq/2);
digitalWrite(pin, LOW);
delay(1000/freq/2);
}
// На всякий случай переводит пин обратно в режим чтения
pinMode(pin, INPUT_PULLUP);
}
// Функция "обучения" устройства (запоминания кодов кнопок открытия/закрытия)
void learn(void)
{
// Ждём получения корректной команды
// (условие окончания цикла находится в его теле)
while (true) {
if (irrecv.decode(&results)) {
// Получили какой-то код. Сообщим библиотеке, что мы обработали событие.
irrecv.resume();
// Пропускаем коды короче 16 бит (наши пульты давали коды 16 или 32 бита,
// остальные считаем ошибочными)
if (results.bits >= 16) {
// Сохраняем пришедший код как код на открытие
codeOpen = results.value;
// В знак подтверждения пикаем
beeep(BUZZER_PIN, 500, 100);
break;
}
// Ждём 100 мс, чтобы пропустить случайный приём пачки одинаковых кодов
delay(100);
}
}
// На всякий случай ждём 200 мс (пользователь явно быстрее не будет на кнопки
// нажимать)
delay(200);
// Таким же методом принимаем второй код (на закрытие)
while (true) {
if (irrecv.decode(&results)) {
irrecv.resume();
if (results.bits >= 16 && results.value != codeOpen) {
codeClose = results.value;
beeep(BUZZER_PIN, 500, 100);
break;
}
delay(100);
}
}
}
// Функция инициализации устройства
void setup(void)
{
// Запускаем библиотеку IRRemote
irrecv.enableIRIn();
// Инициализируем команду (не было команды)
cmd = CMD_NONE;
// Сообщаем пользователю, что мы запустились тройным пиком
beeep(BUZZER_PIN, 500, 100); delay(100);
beeep(BUZZER_PIN, 500, 100); delay(100);
beeep(BUZZER_PIN, 500, 100); delay(100);
// Запускаем процедуру "обучения"
learn();
// Пищим в знак окончания процедуры обучения
beeep(BUZZER_PIN, 2000, 1000);
}
// Пуск сервопривода постоянного вращения
void start(void)
{
srv.attach(SERV_PIN);
srv.write(cmd == CMD_OPEN ? 0 : 120);
}
// Остановка мотора
void stop(void)
{
// Самый простой способ остановить серву постоянного вращения — отсоединиться
// от неё
srv.detach();
}
// Рабочий цикл программы
void loop(void)
{
unsigned long codeValue;
int codeLen;
// Запускаем сканирование команды по ИК
if (irrecv.decode(&results)) {
// Сообщаем библиотеке, что приняли её информацию
irrecv.resume();
// Получаем код и длину кода
codeValue = results.value;
codeLen = results.bits;
// Отсеиваем неправильные коды
if (codeLen >= 16) {
// Если пришёл код на открытие и на данный момент привод не крутится в
// противоположную сторону, включаем открытие.
if (codeValue == codeOpen && cmd != CMD_CLOSE) {
cmd = CMD_OPEN;
cmdStartTime = millis();
start();
} else if (codeValue == codeClose && cmd != CMD_OPEN) {
// Если пришёл код на закрытие и на данный момент привод не крутится в
// противоположную сторону, включаем открытие.
cmd = CMD_CLOSE;
cmdStartTime = millis();
start();
}
// Если приходит команда на резкую смену направления вращения — спасаем
// серву от смерти, игнорируя такую плохую команду.
} else if (codeLen == 0 && (cmd == CMD_OPEN || cmd == CMD_CLOSE)) {
// Некоторые пульты при удержании кнопки в нажатом состоянии посылают код
// нулевой длины. Будем считать это повтором команды.
cmdStartTime = millis();
}
delay(100);
}
// Здесь мы выключаем привод через 500 мс после последней полученной команды
if (cmd == CMD_OPEN || cmd == CMD_CLOSE) {
if (millis() - cmdStartTime > 500) {
cmd = CMD_NONE;
stop();
// Дождёмся полной остановки привода
delay(1000);
}
}
}
не обязательно такойже ,главное чтоб сервопривод при нажатии на кнопку поварачивался в одну сторону а при нажатии на вторую закрывался.


Решил сделать жалюзи управляемые радио брелком 433 мгц, нашол готовый проект на сайте амперка http://wiki.amperka.ru/projects:irjalousie
но вот этот проект управляется с телевизионного пульта, а нужно с с радио брелка.Пытался сам переделать
#include <Servo.h> #include <RCSwitch.h> #define ServoPin 9 #define SHAG 1 RCSwitch mySwitch = RCSwitch(); Servo myServo; int angle = 0; void setup() { myServo.attach(ServoPin); myServo.write(angle); pinMode(ServoPin); mySwitch.enableReceive(0); } void loop() { if (mySwitch.available()) { int value = mySwitch.getReceivedValue(); if ( mySwitch.getReceivedValue() == 12566533) digitalWrite(ServoPin)angle = angle + SHAG; if ( mySwitch.getReceivedValue() == 12566534) digitalWrite(ServoPin)angle = angle - SHAG; if (angle > 180) angle = 180; if (angle < 0) angle = 0; myServo.write(angle); delay(300); }схема
#include <Servo.h> #include <RCSwitch.h> #define ServoPin 9 #define SHAG 1 RCSwitch mySwitch = RCSwitch(); Servo myServo; int angle = 0; void setup() { myServo.attach(ServoPin); myServo.write(angle); pinMode(ServoPin); mySwitch.enableReceive(0); } void loop() { if (mySwitch.available()) { int value = mySwitch.getReceivedValue(); if ( mySwitch.getReceivedValue() == 12566533) digitalWrite(ServoPin)angle = angle + SHAG; if ( mySwitch.getReceivedValue() == 12566534) digitalWrite(ServoPin)angle = angle - SHAG; if (angle > 180) angle = 180; if (angle < 0) angle = 0; myServo.write(angle); delay(300); }и что?
не принимается ничего?
принимается что-то, но не 12566533 ?
принимается что-то, но не 12566534 ?
или?
подсказка: есть такая штука "монитор последовательного порта" и понятие "отладочная информация"
конешно принимается .
кнопки срабатывают пока сервопривод в скеч не вписываю,там при компиляции сразу ошибка выскакивает.
на 17 строку ругается?
да на 17
да на 17
внимательно изучите http://arduino.ru/Reference/PinMode
а это http://arduino.ru/Reference/DigitalWrite для 28 и 30 строк. А вообще-то непонятно что вы пытаетесь в этих строках делать?
7
7
Изучилите ссылки, что вам давали?