• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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)?
 
Сверху Снизу