Самый доступный метод автоматизации штор

от автора

За развитием современных систем домашней автоматизации от именитых брендов не угнаться, но цена и определенный функционал заставляет применять свои навыки на практике домашних самоделкиных. Я не стал исключением, техника и работа с программным обеспечением в настоящее время стала доступнее, есп, ардуино, стм и прочее бесконечное множество предлагаемых платформ дает возможности для решения практически любых технических задач. Не так давно переехал в новую квартиру на окраине города, зал с видом на пустырь и заброшенную стройку, на которой зимой гуляли фазаны, все быстро меняется и строится, за окном вырос дом, окно в окно.



Отсутствие желания стать предметом чужого внимания сподвигло запилить автоматические шторы. Итак, что я хотел от штор, первое, подъем и опускание по выставленному времени, управление в том числе через интернет, хотя последние нужно было для реализации голосового управления. Что в итоге, в интернете много интересного, но так как я слаб в программировании, понять многие решения не смог, да и не все соответствовало требованиям. Решение делать самостоятельно пришло постепенно, здесь я постепенно наступил на все грабли но все же пришел к результатам. Были куплены рулонные шторы, разобрана старая поворотная камера видеонаблюдения снятая с объекта, из нее я добыл два ноунейма-китайские шаговые двигатели чьи характеристики не смог найти в интернете.

Разобравшись с движками, для их управления использовал nodemcu, которая посылает сигналы для управления силовой части на драйвер ln298n, простенький скетч работает на платформе Blynk, начальное положение шторы отсчитывается от сигнала с геркона, до нижнего положения проходит определенное количество шагов. Время подъема и опускания отличается в пару секунд и составляет полторы минуты, достаточно медленно, зато без звука! Плата имеет встроенный wifi модуль, а платформа блинк позволила синхронизироваться со временем в зависимости от часового пояса, как результат один виджет позволил максимум упростить схему. Голосовое управление выполнено на ассистенте Дуся, в качестве платформы пока использую телефон, есть периодические ложные сработки, не критично, в будущем возможно заменю платформу (если разберусь с расбери) и заменю микрофон, есть задумки.

Прошло пару месяцев эксплуатации, все работает, шаги не пропускает, на шторы уже не обращаю внимание, что не скажешь о моем коте, у него они вызывают стабильный интерес. Какие минусы, шторы не работают в отсутствии интернета (плата за доступную реализацию) нет обратной связи, пока не реализовал, не понятно в каком положении шторы, открыты или закрыты. Хотя это не смертельно если шторы открыты или закрыты и подать повторно команду ничего не произойдет. В любом случае реализация оправдана исходя из сложившейся цены на рынке. Ну что, как говорится, всем добра!

Ниже приведен код для есп:

#define BLYNK_PRINT Serial #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h>  #include <ESP8266mDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> //OTA Библиотека для OTA-прошивки  #include <AccelStepper.h> #define motor1 D1 #define motor2 D2 #define motor3 D3 #define motor4 D4 AccelStepper Stepper1(4, D1, D2, D3, D4);   static int buttonPin = D5;  // с цифрового выхода датчика Холла //unsigned long runTime1; // время с запуска платы Arduino, мс unsigned long runTime2; int current = 20800;// кол-во шагов определяется опытным путем static bool newZeroPoint = true; // Флаг указывающий, что надо найти сначала нулевую позицию, а потом делать остальное.  char auth[] = ""; char ssid[] = ""; char pass[] = "";      void setup() {  Serial.begin(9600);   Blynk.begin(auth, ssid, pass);      pinMode(buttonPin, INPUT);   pinMode(motor1, OUTPUT);   pinMode(motor2, OUTPUT);   pinMode(motor3, OUTPUT);   pinMode(motor4, OUTPUT);       ArduinoOTA.setHostname("ESP8266-00002"); //OTA Задаем имя сетевого порта   //ArduinoOTA.setPassword((const char *)"0000"); //OTA Задаем пароль доступа для удаленной прошивки   ArduinoOTA.begin(); //OTA Инициализируем OTA           Stepper1.setMaxSpeed(200);     //устанавливаем максимальную скорость вращения ротора двигателя (шагов/секунду) Stepper1.setAcceleration(180); //устанавливаем ускорение (шагов/секунду^2)    } void ZeroPoint(){   if (newZeroPoint)   // Поиск начальной позиции.         if (digitalRead(buttonPin))        {           // Если концевик сработал, то выставляем нуливую позицию и завершаем поиск.           Stepper1.setCurrentPosition(0);           newZeroPoint = false;           //Serial.println("true");       } else       {         // Двигаемся влево на один шаг, до тех пор пока не сработает концевик.         if (Stepper1.distanceToGo() == 0) {Stepper1.moveTo(Stepper1.currentPosition() + 1000);}         Stepper1.run();         //Serial.println("false");       }   }  BLYNK_WRITE(V0) {   int button = param.asInt(); // read button     if (button == 1){ Stepper1.move(-Stepper1.currentPosition());}   }           BLYNK_WRITE(V1) {   int button = param.asInt(); // read button     if (button == 1){       Stepper1.moveTo(-current);  Stepper1.run();  }  } BLYNK_WRITE(V2) {   int button = param.asInt(); // read button     if (button == 1){   Stepper1.stop();}  }         void Out()//Эта часть кода снимает напряжение с обмоток шаговика через заданное время после его работы  {   if (Stepper1.run())   runTime2 = millis();    if (millis() - runTime2 > 5000)    {runTime2 = millis();   digitalWrite (5, LOW);   digitalWrite (4, LOW);   digitalWrite (0, LOW);   digitalWrite (2, LOW);     } }  void loop() {   Blynk.run();  Stepper1.run();     ZeroPoint();      Out();     ArduinoOTA.handle();            }

ссылка на оригинал статьи https://habr.com/ru/post/494728/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *