• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Управление оборотами вытяжного вентиялтора

Geremy

New member
К сожалению, они не приводят схему. На фотографиях присутствуют три детальки:
- голубой цилиндр с полосками - очевидно, двухваттный резистор 100 Ом (к сожалению, не проволочный, но и такой сойдет)
- коричневая блямба - конденсатор 0.01 мкФ на 630 Vdc (не идеально, но сгодится)
- голубой кругляш - невесть что, может, варистор (это было бы хорошо), а может, конденсатор (это было бы плохо); больше похож на варистор

Соответственно, ответ такой: скорей всего можно. Включить его надо параллельно силовому симистору.
Один из покупателей пишет, что снаббер состоит из: варистор 470В, резистор 1Вт 220Ом и конденсатор 100nF 630В.

Стоит брать или может взять и что-то заменить самому чтобы получить нормальный модуль?
 

=AK=

New member
Подскажите правильно ли я изобразил подключение? Выходы снаббера к стоку и истоку симистора?
У симистора нет стока и истока. Нужные для подключения электроды симистора выведены на терминалы. Надо только отследить по дорожкам на печатной плате на какие.

triac_snubber.png
 

nikolz

Well-known member

Сергей_Ф

Moderator
Команда форума
@Geremy правильно. В любом случае ничего страшного не случится. Включайте - проверяйте.
 

nikolz

Well-known member
если посмотреть схему
https://robotdyn.com/pub/media/0G-0.../Schematic==0G-00005677==Mod-Dimmer-5A-1L.pdf
https://robotdyn.com/pub/media/0G-0...OCS/PINOUT==0G-00005677==Mod-Dimmer-5A-1L.pdf
и сравнить ее со схемой выше
то легко определить, что RC (39 ом и 0.01 uF) цепочку надо включить D G Q1. Это контакты 1 разъема J1(AC-N) - подключены резисторы R1|| R3
и контакт 2 разъема J2(Load) .
Верно.
 

Geremy

New member
Пишу продолжение...
Получил я снуббер, подключил и вот что получил.

При включении ESP при подачи 220В на плату диммера, ESPшка не может подключится к MQTT и выводит бесконечно:
Код:
Connecting to myWiFi
..
WiFi connected
IP address:
192.168.1.55

Booting Sketch...

Exception (0):
epc1=0x40202a34 epc2=0x00000000 epc3=0x40201248 excvaddr=0x00000000 depc=0x00000000

ctx: cont
sp: 3ffffb40 end: 3fffffd0 offset: 01a0

>>>stack>>>
3ffffce0:  4022b9da 3fff03fc 3fff03fc 40214fa9 
3ffffcf0:  3fff0020 00000000 3ffeffdc 40217f00 
3ffffd00:  3ffefa04 3ffefa39 3ffe9213 3ffe920d 
3ffffd10:  00000001 4022aa93 3fff03fc 3ffefe44 
3ffffd20:  00000000 4021e8eb 3ffed9ec 3ffefa04 
3ffffd30:  4010668a 0104a8c0 3ffefa04 402180e6 
3ffffd40:  c0037035 00000001 00000006 3ffee13c 
3ffffd50:  3ffe91bc 3ffe91bc 3ffefa04 00000022 
3ffffd60:  3fffc200 40106650 3fffc258 4000050c 
3ffffd70:  400043e6 00000030 00000016 ffffffff 
3ffffd80:  400044ab 3fffc718 3ffffe70 08000000 
3ffffd90:  60000200 08000000 08000000 00000000 
3ffffda0:  0000ffff 00042035 00002035 003fe000 
3ffffdb0:  40240da0 0000049c 003fe000 00000030 
3ffffdc0:  4022422f 00000001 00000010 00000003 
3ffffdd0:  00000003 00000001 402242bf 3fff00e2 
3ffffde0:  00000000 00000000 00000000 4021f7a8 
3ffffdf0:  3fff00dc 4021f78a 3fff00dc 401068b0 
3ffffe00:  4021df68 0104a8c0 3ffee880 4022d1e1 
3ffffe10:  3ffffe60 00000010 4021f9d1 3fff0034 
3ffffe20:  3fff0d64 dfffffff c0fe010b 3fff03cc 
3ffffe30:  3fff0034 3fff0034 3fff0d64 3ffedc5c 
3ffffe40:  3ffffe60 4022d92f 3ffed9ec 3fff0d64 
3ffffe50:  00000000 4000444e 3ffee0a8 00000000 
3ffffe60:  00000002 401054b3 00000001 60000200 
3ffffe70:  00000002 4000410f 00001001 00000205 
3ffffe80:  3fffc718 40004a3c 000003fe 40240da0 
3ffffe90:  3fffc718 40105744 000003fe 401068e4 
3ffffea0:  4023380c 000003fe 00000000 402337f5 
3ffffeb0:  3fff100c 402338df 3fff08c4 0000049c 
3ffffec0:  000003fd 3ffe84f7 3fff08c4 402338c2 
3ffffed0:  ffffff01 55aa55aa 00000001 00000020 
3ffffee0:  ffffffff 00000050 ffffffff aa55aa55 
3ffffef0:  000003ff 402336ec 00000003 00000003 
3fffff00:  00000001 00000003 00000003 40233663 
3fffff10:  3ffe84e8 00000001 00000001 3fff08c4 
3fffff20:  40233772 00000003 00000003 00000001 
3fffff30:  40203420 3ffef31c 3ffef3b8 40209664 
3fffff40:  3701a8c0 00ffffff 3ffef3b8 3ffeeec0 
3fffff50:  3ffe84e8 3ffef31c 3ffef3b8 4020304d 
3fffff60:  40202d34 3701a8c0 4020ae6c 4020ae54 
3fffff70:  feefeffe feefeffe feefeffe feefeffe 
3fffff80:  feefeffe feefeffe feefeffe feefeffe 
3fffff90:  00000003 feefeffe feefeffe feefeffe 
3fffffa0:  feefeffe feefeffe feefeffe 3ffef478 
3fffffb0:  3fffdad0 00000000 3ffef471 4020aafc 
3fffffc0:  feefeffe feefeffe 3ffe85f8 40100739 
<<<stack<<<
H!⸮⸮1⸮D⸮
⸮
Причем если включить ESPшку без 220В, то все подключается нормально и обороты регулируются.
 

Geremy

New member
Вот мой скетч:
Код:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

#include "Timer.h"  // Замена стандартному delay

// ~~~ Для обновления по воздуху - BEGIN ~~~
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include "hw_timer.h" //Либа для robodyn диммера

//Для robodyn диммера
const byte zcPin = 12;  // Zero-cross pin
const byte pwmPin = 13; // PWM pin
byte fade = 1;
byte state = 1;
volatile uint8_t tarDimmerVal = 255;
volatile uint8_t curDimmerVal = 0;
volatile uint8_t zcState = 0; // 0 = ready; 1 = processing;

const char* host = "esp8266-webupdate";

ESP8266WebServer server(80);

const char* serverIndex = "<form method='POST' action='/update' enctype='multipart/form-data'><input type='file' name='update'><input type='submit' value='Update'></form>";
// ~~~ Для обновления по воздуху - END ~~~

// ~~~ Чтобы избавиться от delay - BEGIN ~~~
Timer t;
// ~~~ Чтобы избавиться от delay - END ~~~

const char* ssid     = "ssid";
const char* password = "password";

const char* mqtt_server = "192.168.1.160";
const char* topicForSubscribe = "esp8266_wifi-dimmer-fan/cmnd/tarDimmerVal"; // Топик, который слушаем
WiFiClient espClient;
PubSubClient client(espClient);

char msgBufferPPM[10];          // буфер для отправки на MQTT сервер
String msg; // Переменная для отправки по MQTT

void setup() {
  Serial.println("Starting ...");
  Serial.begin(9600);

// ~~~ Dimmer BEGIN ~~~
  pinMode(zcPin, INPUT_PULLUP); //Инициализируем порт для zero-cross
  pinMode(pwmPin, OUTPUT);  //Инициализируем PWM (ШИМ)
  attachInterrupt(zcPin, zcDetectISR, RISING);    // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
  hw_timer_init(NMI_SOURCE, 0);
  hw_timer_set_func(dimTimerISR);
// ~~~ Dimmer END ~~~

  // We start by connecting to a WiFi network
  wifi_station_set_hostname("WiFi_Dimmer_Fan"); // Задаем имя устройству
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  /* Explicitly set the ESP8266 to be a WiFi-client, otherwise, it by default,
     would try to act as both a client and an access-point and could cause
     network-issues with your other WiFi-devices on your WiFi-network. */
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  // Инициализируем MQTT сервер
    client.setServer(mqtt_server, 1883);
    client.setCallback(callback);

  // ~~~ Настраиваем обновление по воздуху - BEGIN ~~~
  Serial.println();
  Serial.println("Booting Sketch...");
  WiFi.mode(WIFI_AP_STA);
  WiFi.begin(ssid, password);
  if (WiFi.waitForConnectResult() == WL_CONNECTED) {
    MDNS.begin(host);
    server.on("/", HTTP_GET, []() {
      server.sendHeader("Connection", "close");
      server.send(200, "text/html", serverIndex);
    });
    server.on("/update", HTTP_POST, []() {
      server.sendHeader("Connection", "close");
      server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
      ESP.restart();
    }, []() {
      HTTPUpload& upload = server.upload();
      if (upload.status == UPLOAD_FILE_START) {
        Serial.setDebugOutput(true);
        WiFiUDP::stopAll();
        Serial.printf("Update: %s\n", upload.filename.c_str());
        uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000;
        if (!Update.begin(maxSketchSpace)) { //start with max available size
          Update.printError(Serial);
        }
      } else if (upload.status == UPLOAD_FILE_WRITE) {
        if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
          Update.printError(Serial);
        }
      } else if (upload.status == UPLOAD_FILE_END) {
        if (Update.end(true)) { //true to set the size to the current progress
          Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
        } else {
          Update.printError(Serial);
        }
        Serial.setDebugOutput(false);
      }
      yield();
    });
    server.begin();
    MDNS.addService("http", "tcp", 80);

    Serial.printf("Ready! Open http://%s.local in your browser\n", host);
    Serial.print("If doesn't work, for update firmware go to " + WiFi.localIP());
   
  } else {
    Serial.println("WiFi Failed");
  }
  // ~~~ Настраиваем обновление по воздуху - END ~~~

  client.setCallback(callback);   // Для получения ответа по MQTT
  pinMode(2, OUTPUT); // Инициируем внутренний светодиод
  t.oscillate(2, 500, HIGH, 5); // Моргаем 5 раз встроенным светодиодом
}

void loop() {
if (!client.connected()) {
     delay(1000);
    reconnect();
  }
  client.loop();

  server.handleClient();  // Обрабатываем запрос с вебсерверу

  t.update();  // Необходимо для нормальной работы Timer
}

// Функция отправки значений диммера
void SendDimmerStatus(){
  msg = String(tarDimmerVal);
  msg.toCharArray(msgBufferPPM, msg.length()+1);
  client.publish("esp8266_wifi-dimmer-fan/dimmer/tarDimmerVal", msgBufferPPM); // отправляем в топик целевое значение диммера
  msg = String(curDimmerVal);
  msg.toCharArray(msgBufferPPM, msg.length()+1);
  client.publish("esp8266_wifi-dimmer-fan/dimmer/curDimmerVal", msgBufferPPM); // отправляем в топик текущее значение диммера
}

void reconnect(){
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      // client.publish("outTopic", "hello world");
      // ... and resubscribe
      client.subscribe(topicForSubscribe);
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

// Метод для получения сообщения по MQTT в Nodemcu
void callback(char *topic, byte *payload, unsigned int length) {  //payload - массивы byte (byte[])
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();

  String stringMsg; // Получаем сообщение в виде String
  for (int i = 0; i < length; i++) {
     stringMsg += (char)payload[i];
  }

  tarDimmerVal = stringMsg.toInt();

  Serial.print("tarDimmerVal - ");
  Serial.println(tarDimmerVal);

  stringMsg = "";

  if(sizeof(payload) > 1){  // Проверяем длину массива в байтах
    t.oscillate(2, 500, HIGH, 2); // Моргаем 5 раз встроенным светодиодом
    SendDimmerStatus(); // Отправляем данные
  }
}

// Метод для моргания
void blinks() {
  digitalWrite(2, HIGH);
  delay(500);
  digitalWrite(2, LOW);
  delay(500);
}

// Функция для WiFi диммера
void dimTimerISR() {
    if (fade == 1) {
      if (curDimmerVal > tarDimmerVal || (state == 0 && curDimmerVal > 0)) {
        --curDimmerVal;
      }
      else if (curDimmerVal < tarDimmerVal && state == 1 && curDimmerVal < 255) {
        ++curDimmerVal;
      }
    }
    else {
      if (state == 1) {
        curDimmerVal = tarDimmerVal;
      }
      else {
        curDimmerVal = 0;
      }
    }
   
    if (curDimmerVal == 0) {
      state = 0;
      digitalWrite(pwmPin, 0);
    }
    else if (curDimmerVal == 255) {
      state = 1;
      digitalWrite(pwmPin, 1);
    }
    else {
      digitalWrite(pwmPin, 1);
    }
   
    zcState = 0;
}

// Функция для WiFi диммера
void zcDetectISR() {
  if (zcState == 0) {
    zcState = 1;

    if (curDimmerVal < 255 && curDimmerVal > 0) {
      digitalWrite(pwmPin, 0);
     
      int dimDelay = 30 * (255 - curDimmerVal) + 400;//400
      hw_timer_arm(dimDelay);
    }
  }
}
Подозреваю что проблема в скетче, но понять не могу как наличие 220В на диммере мешает подключиться к MQTT и вводит в бесконечную перезагрузку.
 

nikolz

Well-known member
Вот мой скетч:
Подозреваю что проблема в скетче, но понять не могу как наличие 220В на диммере мешает подключиться к MQTT и вводит в бесконечную перезагрузку.
На основе чего такой вывод?
подключили кондер с резистором , а виновата программа?
Смотрите что конкретно изменилось.
Предположу что потребление либо помехи .
Если RC отключаете то нормально а включаете то глюки. Верно?
тогда ищите там где подключаете.
 

Geremy

New member
И в чем здесь смысл ?
Ошибка, поправил , убрал
  • WiFi.mode(WIFI_STA);
  • WiFi.begin(ssid, password);

Но все рано не могу понять. Беру пример для диммера из Examples ардуины:
Код:
#include <RBDdimmerESP8266.h>//

#define outPin  16 // pin for dimming don't use pins A0, D3(GPIO00), D4(GPIO2)
#define ZCPin   14 // Zero-Cross don't use pins A0, D0(GPIO16), D3(GPIO00), D4(GPIO2)

dimmerLampESP8266 dimmer(outPin, ZCPin); //initialase port for dimmer

int outVal = 0;

void setup() {
  Serial.begin(9600);
  dimmer.begin(NORMAL_MODE, ON); //dimmer initialisation: name.begin(MODE, STATE)
  Serial.println("Dimmer Program is starting...");
  Serial.println("Set value");
}

void printSpace(int val)
{
  if ((val / 100) == 0) Serial.print(" ");
  if ((val / 10) == 0) Serial.print(" ");
}

void loop() {
  int preVal = outVal;

  if (Serial.available())
  {
    int buf = Serial.parseInt();
    if (buf != 0) outVal = buf;
    delay(200);
  }
  dimmer.setPower(outVal); // setPower(0-100%);

  if (preVal != outVal)
  {
    Serial.print("% lampValue -> ");
    printSpace(dimmer.getPower());
    Serial.print(dimmer.getPower());

  }
  delay(50);

}
1. При значении 100(%), напряжение на колодке load 0.9В, поставил значение 65(%), напряжение поднялось до 202В (тут видимо косяк самого примера для диммера)
2. На снаббере напряжение 320В
3. При этом вентилятор крутится еле-еле.
 

=AK=

New member
1. При значении 100(%), напряжение на колодке load 0.9В, поставил значение 65(%), напряжение поднялось до 202В (тут видимо косяк самого примера для диммера)
2. На снаббере напряжение 320В
3. При этом вентилятор крутится еле-еле.
Если 100% дает 0 на выходе, значит, 65% откроет симистор за 3.5 мс до зеро-кроссинга, sin(0.35*п) = 0.891. При амплитуде сетевого 310 В, в момент открытия симистора напряжение равно 276 В. Ну а поскольку ваш мультиметр показывает не действующее напряжение, а пиковое, да еще и врет при этом, вы видите на нем 202 В.

В посте #25 я ванговал, что после 6 мс мотор вряд ли сможет стартовать. А вы его включаете при 6.5 мс, и он еще крутится, радоваться надо.
 

nikolz

Well-known member
для справки.
вот несколько ответов разработчиков на вопросы пользователей:
1)Почему наблюдается короткий импульс, когда запускается PWM (ШИМ)?
--------------------
Имейте в виду, что PWM генерируется программно, и малый выброс может быть вызван в результате измерения разрешающей способности, которой может достичь PWM. В режиме высокой точности (high accuracy) разрешающая способность может быть до 22222 отсчетов. Однако скважность никогда не может достичь 100%.
-----------------------------------------
2) Почему медленно меняется скважность импульсов PWM?
------------------
Если Вы используете программное API, как в примере из SDK demo (light_set_aim и light_set_aim_r), то эти API оптимизированы для приложений освещения, и поэтому в них реализованы плавные переходы скважности.
Для применения в других приложениях, где требуется быстрое регулирование PWM, используйте pwm_set_duty для установки скважности, и
вызовите pwm_start, чтобы немедленно применить новую скважность цикла PWM.
--------------------------
 

Const

Member
Проблема в этой теме решена или нет? Столкнулся с такой же ситуацией.
 

VovanPiterskt

New member
там движок на 500Вт, а у вас на 100.
Кстати, все регуляторы для вентиляторов имеют обратную характеристику. Т.е. при включении запускают на полную мощность и потом убавляют обороты при регулировке. Это нужно для надежного старта двигателя. Не забудьте об этом в скетче - старт только на максимуме и потом выставление оборотов.
из опыта есть понимание на какой период времени при старте подавать 100% шим ??? 100 мс, 1 с, 5 с ??? после которого уже устанавливать желаемый шим оборотов
 

enjoynering

Well-known member
Все зависит он момента инерции вашего вентилятора и усталости подшипников. Начните с ШИМ 100%
в течении 1..5 сек. Как раскрутится, можно начинать уменьшать ШИМ. Именно такой алгоритм у компьютерных кулеров.
 

VovanPiterskt

New member
спасибо
понял
то есть это секунды, а не милисекунды
делэем эту задержку можно делать? типа delay(5000)?
 
Сверху Снизу