Меня зовут Павел, в программировании конечно же новичок. Сделал по многочисленным примерам из сети автоматические рулонные шторы. Алгоритм: после включения 2 шторы поднимаются вверх пока не упрутся в концевики.
После есть 4 режима:
0-й автоматический по датчику света по умолчанию. Светло - открываются, темно закрываются.
1й- две шторы одновременно пульта ДУ или с кнопок на корпусе вверх-вниз;
2й- одна штора с пульта ДУ или с кнопок на корпусе вверх-вниз;
3й- вторая штора с пульта ДУ или с кнопок на корпусе вверх-вниз;
индикация режимов: оба светодиода не горят режим 0 автомат
оба светодиода горят режим 3, две шторы вместе вручную
по одному- первая или вторая штора отдельно вручную
Работает все замечательно за исключением кнопок на корпусе. Вот код
При удалении части кода для ИК пульта (строки 379-397) кнопки начинают работать так как и должны:
Кнопка Stop при удержании по очереди переключает меню. 0, 1, 2, 3.
Кнопки Vverh и Vniz работают вверх и вниз в режимах 1, 2, 3, кнопка Stop в этих режимах при однократном нажатии останавливает шторы во время движения.
а пульт соответственно перестает работать.
Подскажите в чем проблема, думаю что-то элементарное, но знаний не хватает пока.
После есть 4 режима:
0-й автоматический по датчику света по умолчанию. Светло - открываются, темно закрываются.
1й- две шторы одновременно пульта ДУ или с кнопок на корпусе вверх-вниз;
2й- одна штора с пульта ДУ или с кнопок на корпусе вверх-вниз;
3й- вторая штора с пульта ДУ или с кнопок на корпусе вверх-вниз;
индикация режимов: оба светодиода не горят режим 0 автомат
оба светодиода горят режим 3, две шторы вместе вручную
по одному- первая или вторая штора отдельно вручную
Работает все замечательно за исключением кнопок на корпусе. Вот код
C++:
//Настройка шаового двиателя------------------------------------------------
#include <CustomStepper.h> // Подключаем библиотеку управления шаговым двигателем. По умолчанию настроена на двигатель 28BYJ-48-5V
CustomStepper stepper1(12, 11, 10, 9); // Указываем пины, к которым подключен драйвер первого шагового двигателя
CustomStepper stepper2(5, 6, 7, 8); // Указываем пины, к которым подключен драйвер Второго шагового двигателя
#include "IRremote.h" // подключаем библиотеку ИК приемника
//--------------------------------------------------------------------------
//Настраиваем дисплей-------------------------------------------------------
//#include <LiquidCrystal_I2C.h> // Подключаем библиотеку дисплея
//LiquidCrystal_I2C lcd(0x3f,16,2);
//--------------------------------------------------------------------------
//Настройка нижнего и среднего положения штор---------------------------------------------------------------------------------------------------
//
#define niz1 120900 //Число шагов для нижнего положения штора 1
#define niz2 120800 //Число шагов для нижнего положения штора 2 //
//----------------------------------------------------------------------------------------------------------------------------------------------
//Настройка кнопок----------------------------------------------------------
#include <GyverButton.h> //Библиотека управления кнопками
#define BTN1 2 // кнопка Вверх подключена к 2 цифровому пину
#define BTN2 14 // кнопка Стоп подключена к 14 цифровому пину
#define BTN3 17 // кнопка Вниз подключена к 17 цифровому пину
GButton Vverh(BTN1);
GButton Stop(BTN2);
GButton Vniz(BTN3);
//Флаги для работы кнопок-----------------------------------------------------
boolean Kvverh = 0;
boolean Kstop = 0;
boolean Kvniz = 0;
boolean Stop1 = 0;
boolean Stop2 = 0;
boolean Flag = 0;
#define svet A1 // подключение датчика света
long schet1 = 0; //Счетчик шагов первой шторы
long schet2 = 0; //Счетчик шагов первой шторы
long hagi = 0;
unsigned long time1; //переменная для первого таймера
unsigned long pult; //переменная для кнопок пульта
word osveh;
byte meny = 0;
int receiver = 16; // Пин на котором сидит ИК приемник
IRrecv irrecv(receiver); // Создаём 'irrecv' это ИК приемник
decode_results results; // Создаем экземпляр 'decode_results' Это тоже нужно для ИК приемника
void setup() {
pinMode (4, INPUT_PULLUP); //Концевик 1 шторы
pinMode (3, INPUT_PULLUP); //Концевик 2 шторы
pinMode (18, OUTPUT); //светодиод индикации режимов
pinMode (19, OUTPUT); //светодиод индикации режимов
pinMode (A1, INPUT_PULLUP); //фоторезистор
pinMode (2, INPUT_PULLUP);
pinMode (14, INPUT_PULLUP);
pinMode (17, INPUT_PULLUP);
irrecv.enableIRIn(); // Инициализация приемника
Stop1 = digitalRead(4); //Опрашиваем концевик 1 шторы
Stop2 = digitalRead(3); //Опрашиваем концевик 2 шторы
Serial.begin(9600);
//Выставляем опрос кнопок в режим АВТО
Vverh.setTickMode(AUTO);
Stop.setTickMode(AUTO);
Vniz.setTickMode(AUTO);
//Калибровка шторы при включении, поднимаем пока не упремся в концевик
while (Stop1 == 1 && Stop2 == 1)
{ // Если опущены все шторы то даем команду на подъем всех штор
stepper1.setDirection(CCW);
stepper1.rotate();
stepper2.setDirection(CCW);
stepper2.rotate();
delayMicroseconds(850);
Stop1 = digitalRead(4);
Stop2 = digitalRead(3);
}
while (Stop1 == 1)
{
stepper1.setDirection(CCW);
stepper1.rotate();
delayMicroseconds(900);
Stop1 = digitalRead(4);
}
while (Stop2 == 1)
{
stepper2.setDirection(CCW);
stepper2.rotate();
delayMicroseconds(900);
Stop2 = digitalRead(3);
}
}
void loop() {
//Рыбор режима работы (АВТО,РУЧНОЙ)----------------------------------------------------
if (Stop.isHolded()) {
if (meny < 3) {
meny++;
} else {
meny = 0;
}
}
//-------------------------------------------------------------------------------------
if (irrecv.decode(&results)) // Если на ИК приемник пришел сигнал
{
Serial.println( results.value );
switch (results.value) // Значеник которое пришло на ИК приемник будет в results.value
{
/-----(Клавиша опускания)-----/
case 284123805:
pult = 2; // Вызываем функцию опускания шторы
break;
/-----(Клавиша поднятия)-----/
case 284103405:
pult = 1; // Вызываем пункцию поднятия шторы
break;
/-----(Клавиша стоп)-----/
case 284137575:
pult = 0; // Вызываем пункцию поднятия шторы
break;
/-----(Клавиша автоматического определения)-----/
case 284121255:
meny = 0; // Режим работы автоматический
break;
/-----(Клавиша меню две шторы вместе)-----/
case 284115135:
meny = 1; // две шторы одновременно ручные
break;
/-----(Клавиша меню 1 штора )-----/
case 284131455:
meny = 2; // первая штора ручная
break;
/-----(Клавиша меню 2 штора )-----/
case 284098815:
meny = 3; // вторая штора ручная
break;
}
irrecv.resume(); // Ждем следующего сигнала от ИК
}
//АВтоматический режим работы----------------------------------------------------------
if (meny == 0) {
if (millis() - time1 > 1000) {
time1 = millis();
digitalWrite (18, 0);
digitalWrite (19, 0);
osveh = analogRead(svet);
osveh = map(osveh, 0, 1023, 1023, 0);
if (osveh >= 400) {
hagi = 0;
}
if (osveh < 400) {
hagi = niz1, niz2;
}
//Serial.println (osveh);
}
}
if (meny == 1) {
digitalWrite (18, 1);
digitalWrite (19, 1);
if ( Vverh.isClick()) {
hagi = 0;
Serial.println( "vverh" );
}
if (Vniz.isClick()) {
hagi = niz1, niz2;
Serial.println( "vniz" );
}
if (Stop.isClick()) {
hagi = schet1, schet2;
Serial.println( "stop" );
}
/* if (pult == 2) {
hagi = niz1, niz2;
}
if (pult == 1) {
hagi = 0;
}
if (pult == 0) {
hagi = schet1, schet2;
}
*/
}
if (meny == 2) {
digitalWrite (18, 1);
digitalWrite (19, 0);
if ( Vverh.isClick()) {
hagi = 0;
}
if (Vniz.isClick()) {
hagi = niz1;
}
if (Stop.isClick()) {
hagi = schet1;
}
if (pult == 2) {
hagi = niz1;
}
if (pult == 1) {
hagi = 0;
}
if (pult == 0) {
hagi = schet1;
}
}
if (meny == 3) {
digitalWrite (18, 0);
digitalWrite (19, 1);
if ( Vverh.isClick()) {
hagi = 0;
}
if (Vniz.isClick()) {
hagi = niz2;
}
if (Stop.isClick()) {
hagi = schet2;
}
if (pult == 2) {
hagi = niz2;
}
if (pult == 1) {
hagi = 0;
}
if (pult == 0) {
hagi = schet2;
}
}
//Serial.println( pult );
// Исполнительный код движения штор-----------------------------------------------------
if (meny == 0 || meny == 1) {
if (schet1 < hagi && schet2 < hagi ) //Опускание шторы
{ stepper1.setDirection(CW);
stepper1.rotate();
stepper2.setDirection(CW);
stepper2.rotate();
schet1++;
schet2++;
delayMicroseconds(750);
}
if (schet1 < hagi && schet2 == hagi ) //Опускание шторы
{ stepper1.setDirection(CW);
stepper1.rotate();
stepper2.setDirection(STOP);
stepper2.rotate();
schet1++;
delayMicroseconds(750);
}
if (schet1 == hagi && schet2 < hagi ) //Опускание шторы
{ stepper1.setDirection(STOP);
stepper1.rotate();
stepper2.setDirection(CW);
stepper2.rotate();
schet2++;
delayMicroseconds(750);
}
if (schet1 > hagi && schet2 > hagi ) //Подъем шторы
{ stepper1.setDirection(CCW);
stepper1.rotate();
stepper2.setDirection(CCW);
stepper2.rotate();
schet1--;
schet2--;
delayMicroseconds(800);
}
if (schet1 > hagi && schet2 == hagi ) //Подъем шторы
{ stepper1.setDirection(CCW);
stepper1.rotate();
stepper2.setDirection(STOP);
stepper2.rotate();
schet1--;
delayMicroseconds(800);
}
if (schet1 == hagi && schet2 > hagi ) //Подъем шторы
{ stepper1.setDirection(STOP);
stepper1.rotate();
stepper2.setDirection(CCW);
stepper2.rotate();
schet2--;
delayMicroseconds(800);
}
if (schet1 > hagi && schet2 < hagi ) //
{ stepper1.setDirection(CCW);
stepper1.rotate();
stepper2.setDirection(CW);
stepper2.rotate();
schet1--;
schet2++;
delayMicroseconds(800);
}
if (schet1 < hagi && schet2 > hagi ) //
{ stepper1.setDirection(CW);
stepper1.rotate();
stepper2.setDirection(CCW);
stepper2.rotate();
schet1++;
schet2--;
delayMicroseconds(800);
}
if (schet1 == hagi && schet2 == hagi ) //СТОП
{ stepper1.setDirection(STOP);
stepper1.rotate();
stepper2.setDirection(STOP);
stepper2.rotate();
}
}
if (meny == 2) {
Flag = 0;
if (schet1 > hagi) //Подъем шторы
{ stepper1.setDirection(CCW);
stepper1.rotate();
stepper2.setDirection(STOP);
stepper2.rotate();
schet1--;
delayMicroseconds(800);
}
if (schet1 < hagi) //Опускание шторы
{ stepper1.setDirection(CW);
stepper1.rotate();
stepper2.setDirection(STOP);
stepper2.rotate();
schet1++;
delayMicroseconds(750);
}
if (schet1 == hagi) //СТОП
{ stepper1.setDirection(STOP);
stepper1.rotate();
stepper2.setDirection(STOP);
stepper2.rotate();
}
}
if (meny == 3) {
while (Flag == 0) {
hagi = schet2;
Flag = 1;
}
if (schet2 > hagi) //Подъем шторы
{ stepper2.setDirection(CCW);
stepper2.rotate();
stepper1.setDirection(STOP);
stepper1.rotate();
schet2--;
delayMicroseconds(800);
}
if (schet2 < hagi) //Опускание шторы
{ stepper2.setDirection(CW);
stepper2.rotate();
stepper1.setDirection(STOP);
stepper1.rotate();
schet2++;
delayMicroseconds(750);
}
if (schet2 == hagi) //СТОП
{ stepper2.setDirection(STOP);
stepper2.rotate();
stepper1.setDirection(STOP);
stepper1.rotate();
}
}
}
Кнопка Stop при удержании по очереди переключает меню. 0, 1, 2, 3.
Кнопки Vverh и Vniz работают вверх и вниз в режимах 1, 2, 3, кнопка Stop в этих режимах при однократном нажатии останавливает шторы во время движения.
а пульт соответственно перестает работать.
Подскажите в чем проблема, думаю что-то элементарное, но знаний не хватает пока.
Изменено: