WIND OF CHANGE

Источник.

Общий план выполнения работы:

  1. Разработать схему устройства, способного управлять скоростью вращения кулера.
  2. Реализовать данную схему.
  3. Написать программу для микроконтроллера.
  4. Провести тестирование устройства. 

 Непосредственное выполнение работы: 

Познакомьтесь с особенностями подключения вентилятора

Необходимые материалы:

  1. Плата NodeMCU - 1 шт.
  2. Вентилятор 4 пин - 1 шт.
  3. Источник питания 12V - 1шт.
  4. Провода - 4 шт (2 "папа - папа", 2 "мама - мама").
  5. Вариативно: питание для платы. Если от компьютера, то шнур USB - microUSB. Если от сети, то адаптер питания 5V/0.5А.

Возьмите неоюходимые материалы. Удобно расположите микроконтроллер, кулер, источник питания.Аккуратно, без сильных нажимов, во избежании поломки материалов, подсоедините каждый элемент как показано на схеме.  Внимательно проверьте, правильно ли подключены элементы, проверьте полярность элементов, посмотрите, заземлена ли цепь.

Схема лабораторной установки:

GND платы и кулера идут на "минус" источника, PWM кулера присоединяется к D1 платы, 12V кулера - на "плюс" источника.

Задание на самостоятельную работу: разработайте и соберите схему для подключения четырёх вентиляторов. Ниже представлен скетч именно для такой схемы.

Разработка скетча.

Для дальнейшей работы Вам необходимо ознакомиться с платформой NodeMCU, переписать скетч с учётом её особенностей, а также повторить лабораторную работу с использованием данной платформы.

Для управления ветром с помощью приложения Alterozoom Вам необходимо скачать его c официального сайта. Чтобы получить лицензию, пишите на почту branislava.jankovic.1998@ gmail.com

Повторите эту и эту лабораторную работу.

Создаём новый скетч и называем его, например, Wind_of_Change. Проверяем правильность выбранной платы и порта.

Подключаем необходимые бибилиотеки, создаём глобальные переменные и константы.

   #include <ARpcESP8266WiFiDevice.h>

   const char* ssid="wifi_name";
   const char* key="wifi_key";
   int fan1 = D1;
   int fan2 = D2;
   int fan3 = D3;
   int fan4 = D4;
   int sun = D5;    //при желании к плате можно подключить солнце. Но нужно будет доработать скетч.
   const char *deviceName="winds";//имя устройства
   const ARpcUuid deviceId("7730d277b45d485fa1aaed2d58744ed9");//идентификатор устройства
 
Описание интерфейса управления:
 
   const char *interfaceStr="<controls><group title=\"Device controls\">"
   "<control command=\"fan1\" title=\"FAN1\">"//команда fan1
   "<param type=\"dial\" title=\"speed\"><attributes max=\"1023\" min=\"0\"/></param>"//параметр - "крутилка"
   "</control>"
   "<control command=\"fan2\" title=\"FAN2\">"//команда blink
   "<param type=\"dial\" title=\"speed\"><attributes max=\"1023\" min=\"0\"/></param>"//параметр - "крутилка"
   "</control>"
   "<control command=\"fan3\" title=\"FAN3\">"//команда blink
   "<param type=\"dial\" title=\"speed\"><attributes max=\"1023\" min=\"0\"/></param>"//параметр - "крутилка"
   "</control>"
   "<control command=\"fan4\" title=\"FAN4\">"//команда blink
   "<param type=\"dial\" title=\"speed\"><attributes max=\"1023\" min=\"0\"/></param>"//параметр - "крутилка"
   "</control>"
   "</group></controls>";
   class SerialWriteCb
       :public ARpcIWriteCallback
   {
   public:
       void writeData(const char *d,unsigned long sz)override
       {
            Serial.write(d,sz);
       }
       void writeStr(const char *str)override
       {
           Serial.print(str);
       }
       void writeStr(const __FlashStringHelper *str)override
        {
           Serial.print(str);
        }
   }serialCb;

   ARpcESP8266WiFiDevice wifiDev(300,200,&deviceId,deviceName);
   ARpcDevice serialDev(300,&serialCb,&deviceId,deviceName);
 
Callback-класс для обработки команд:
 
   class EventsCb
       :public ARpcIDevEventsCallback
    {
   public:
        explicit EventsCb(ARpcDevice *d)
       {
           dev=d;
       }
    
       virtual void processCommand(const char *cmd,const char *args[],unsigned char argsCount)override
        {
           if(strcmp(cmd,"fan1")==0&&argsCount>=1)//
           {
               int dl=String(args[0]).toInt();
               if(dl<0)dl=0;
               else if(dl>1023)dl=1023;
               analogWrite(fan1,dl);
               //сообщаем об успешном выполнении команды
               dev->disp().writeOk();
            }
           else if(strcmp(cmd,"fan2")==0&&argsCount>=1)//
           {
               int dl=String(args[0]).toInt();
               if(dl<0)dl=0;
               else if(dl>1023)dl=1023;
               analogWrite(fan2,dl);
               //сообщаем об успешном выполнении команды
               dev->disp().writeOk();
            }
           else if(strcmp(cmd,"fan3")==0&&argsCount>=1)//
           {
               int dl=String(args[0]).toInt();
               if(dl<0)dl=0;
               else if(dl>1023)dl=1023;
               analogWrite(fan3,dl);
               //сообщаем об успешном выполнении команды
               dev->disp().writeOk();
           }
           else if(strcmp(cmd,"fan4")==0&&argsCount>=1)//
           {
               int dl=String(args[0]).toInt();
               if(dl<0)dl=0;
               else if(dl>1023)dl=1023;
               analogWrite(fan4,dl);
               //сообщаем об успешном выполнении команды
               dev->disp().writeOk();
           }
       }

       virtual void onSyncMsg()
       {
           wifiDev.onSyncMsg();
       }

   private:
       ARpcDevice *dev;
   }serialEcb(&serialDev),wifiEcb(&wifiDev);

   void wifiDbgFunc(const char *str)
   {
       serialDev.disp().writeInfo(str);
   }

Функция setup():

   void setup()
   {
       Serial.begin(9600);
       wifiDev.setDebugOutputFunction(&wifiDbgFunc);
       wifiDev.disp().installDevEventsHandler(&wifiEcb);
       wifiDev.disp().setControls(interfaceStr);
       serialDev.disp().installDevEventsHandler(&serialEcb);
       serialDev.disp().setControls(interfaceStr);
       strcpy(wifiDev.ssid,ssid);
       strcpy(wifiDev.key,key);

       wifiDev.setup();
       serialDev.resetStream();
   }

Функция loop():

   void loop()
   {
       while(Serial.available())
            serialDev.putByte(Serial.read());
       wifiDev.loop();
       delay(1);
   }

 

/messages/6069