AC Light Dimmer Module от RobotDyn и Arduino nano

mario512
Offline
Зарегистрирован: 29.10.2019

Добрый день. Не могу заставить работать диммер: AC Light Dimmer Module, 1 Channel, 3.3V/5V logic, AC 50/60hz, 220V/110V.

при попытке залит данный скетч, получаю нехватку памяти. Либа офф. от производителя модуля.

Код:

#include <RBDdimmer.h>

dimmerLamp dimmer1(4); //initialase port for dimmer: name(PinNumber);

void setup() {
  Serial.begin(9600);
  dimmer1.begin(NORMAL_MODE, OFF); //dimmer initialisation: name.begin(MODE, STATE) 
  Serial.println("--- Simple dimmer example ---");
  dimmer1.setPower(50); // setPower(0-100%);
  dimmer1.setState(ON); // setState(ON/OFF);
  pinMode(5, INPUT);
}
void loop() {
  
  if (digitalRead(5) == 1) 
  {
    dimmer1.changeState(); //changes state on the opposite: name.changeState(); 
  }
  Serial.print("Dimmer state: ");
  Serial.println(dimmer1.getState());
  delay(1000);
}

 

Есть варианты заставить его работать?

 

Гриша
Offline
Зарегистрирован: 27.04.2014

mario512 пишет:

 Либа офф. от производителя модуля.

я хз, у меня такой либы нет, делитесь или либой или ссылкой на нее 

mario512
Offline
Зарегистрирован: 29.10.2019
Гриша
Offline
Зарегистрирован: 27.04.2014

1) сразу вопрос по плате и камню на ней - что используете с каким МК.

2) в либе куча примеров они все не работают?

3) версия ИДЭ

mario512
Offline
Зарегистрирован: 29.10.2019

Arduino Nano V3.0, Камень ATmega328. Версия IDE 1.8.9. 

После добавления строк в проект, пишет что не хватает места.

#include <RBDdimmer.h>

dimmerLamp dimmer1(4); //initialase port for dimmer: name(PinNumber);



 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Под 1.8.3 места для скетча из начального сообщения - завались! Мож глюк какой 1.8.9 ? Попробуйте другую версию.

renoshnik
Offline
Зарегистрирован: 11.04.2013

 

mario512
Offline
Зарегистрирован: 29.10.2019

Поставил IDE той же версии что и дома, и скетч из примера компилится. Переустановлю на домашнем компе. Тема закрыта.

mario512
Offline
Зарегистрирован: 29.10.2019

Переустановил IDE. Поставил 1.8.6. Ошибка не устранена. Есть Идеи?

nik182
Offline
Зарегистрирован: 04.05.2015

Идея простая. Открыть файл библиотеки и посмотреть куда она девает всю память и если не нужно столько выделять то уменьшить буфера. Не надо библиотек боятся. Частенько их пишут начинаюшие с большими амбициями и коротенькими знаниями. Вот и получается как всегда-памяти нет. И строку в скобках оберните в F() - на 30 байт уменьшит занимаемую память. 

mario512
Offline
Зарегистрирован: 29.10.2019

На данном этапе своих познаний C++ в либе мне нечего ловить. Парадокс в том, что на рабочем компе данный скетч компилиться без проблем.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

mario512 пишет:
на рабочем компе данный скетч компилиться без проблем.

А скока памяти использует?

mario512
Offline
Зарегистрирован: 29.10.2019

10 процентов

kalapanga
Offline
Зарегистрирован: 23.10.2016

Да ничего там в библиотеке особенного нет. Одна табличка на 100 байт. В норме скетч компилируется например так (1.8.3):

Скетч использует 3402 байт (10%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 463 байт (22%) динамической памяти, оставляя 1585 байт для локальных переменных. Максимум: 2048 байт.

А вот почему у него под некоторыми версиями IDE 463 байта аж в 2139 превращаются - непонятно.

mario512
Offline
Зарегистрирован: 29.10.2019

попробую 1.8.3 поставить. Засада.

renoshnik
Offline
Зарегистрирован: 11.04.2013

mario512 пишет:
попробую 1.8.3 поставить. Засада.

В чем проблема поставить 1.8.10   ???

kalapanga
Offline
Зарегистрирован: 23.10.2016

Да, уж начните лучше с актуальной.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

под 1.8.9

на закрузчике miniCore (LTO - disable)
Скетч использует 4058 байт (12%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 557 байт (27%) динамической памяти, оставляя 1491 байт для локальных переменных. Максимум: 2048 байт.

(LTO -enable)
Скетч использует 3256 байт (10%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 441 байт (21%) динамической памяти, оставляя 1607 байт для локальных переменных. Максимум: 2048 байт.
 

ардуино нано (old loader)
Скетч использует 3300 байт (10%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 443 байт (21%) динамической памяти, оставляя 1605 байт для локальных переменных. Максимум: 2048 байт.

 

mario512
Offline
Зарегистрирован: 29.10.2019

На ней не работала  #include "DHT.h" библиотека. Для DHT22

P.S. на актуальной такая же борода...

kalapanga
Offline
Зарегистрирован: 23.10.2016

mario512 пишет:

На ней не работала  #include "DHT.h" библиотека. Для DHT22

P.S. на актуальной такая же борода...

Вот ещё и вместе с этим вся ситуация наводит на мысль, что что-то Вы у себя сами "накрутили"! С чего бы это ей не работать? Вот только что скачал 1.8.10. Ваш скетч:

Скетч использует 3278 байт (10%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 443 байт (21%) динамической памяти, оставляя 1605 байт для локальных переменных. Максимум: 2048 байт.

Может вычистить все следы предыдущих установок и начисто установить последнюю версию?

mario512
Offline
Зарегистрирован: 29.10.2019

Прошу сильно не пинать, но подозреваю что я, олень, дома сохранил либу из другого источника... А в посте привел ссыль на оф. репозитарий РоботДин. Дома качал по ссылке, которую дал продавец диммера... Вечером проверю... На работе компилится на любой версии IDE...

mario512
Offline
Зарегистрирован: 29.10.2019

mario512 пишет:

Прошу сильно не пинать, но подозреваю что я, олень, дома сохранил либу из другого источника... А в посте привел ссыль на оф. репозитарий РоботДин. Дома качал по ссылке, которую дал продавец диммера... Вечером проверю... На работе компилится на любой версии IDE...

Проблема была в моей невнимательности...

mario512
Offline
Зарегистрирован: 29.10.2019

Накидал скетч, который управляет канальным вентилятором, регулируя мощность в зависимости от уровня влажности. Использую датчик АМ2302(DHT22), RTC1302, AC Light Dimmer Module от RobotDyn, LCD Nokia 5101. Проблема в том, что в момент считывания данных с датчика DHT22 происходит просадка напряжения на выходе из диммира в среднем на 60-70 вольт. Подключенная лампа мигает один раз в пять секунд. В этот момент на Arduino Nano 3.0 "блымает" диод (TX).  Что посоветуете? Не пинайте за код, в первой с этим имею дело.

AC Light Dimmer Module от RobotDyn: vcc-5v, gnd-gnd, z-0 - D2 pin, PWM - D11.

DHT22: vcc - 5v, data - D12, gnd-gnd.

Скетч:

#include <iarduino_RTC.h>
#include <LCD5110_Basic.h>
#include "DHT.h"
#include  <TimerOne.h>
#define DHTPIN 12 // номер пина, к которому подсоединен датчик

extern uint8_t BigNumbers[];
extern uint8_t MediumNumbers[];
extern uint8_t SmallFont[];

unsigned long timing2;
int minuts;
int days;
int hourse;
int g_fan_speed = 0;
int g_fan_stat = 0;

volatile int i = 0;             // Variable to use as a counter volatile as it is in an interrupt
volatile boolean zero_cross = 0; // Boolean to store a "switch" to tell us if we have crossed zero
int AC_pin = 11;                // Output to Opto Triac
int dim = 128;                    // Dimming level (0-128)  0 = on, 128 = 0ff
int inc = 1;                    // counting up or down, 1=up, -1=down

int freqStep = 75;    // This is the delay-per-brightness step in microseconds.
int h = 0;
int t = 0;

/* SCK / CLK, MOSI / DIN, DC, RST, CS */
LCD5110 lcd(3, 4, 5, 7, 6);

byte myList[][24] = {
 // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23//часы
  { 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0}, //будние
  { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0}, //выходные
};

byte SpeedFan[][10] = {
  {128, 110, 100, 90, 80, 70, 60, 50, 40, 30},
};


DHT dht(DHTPIN, DHT22);

iarduino_RTC time(RTC_DS1302, 10, 8, 9);

void setup() {
  delay(300);
  pinMode(AC_pin, OUTPUT);                          // Set the Triac pin as output
  attachInterrupt(0, zero_cross_detect, RISING);    // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
  Timer1.initialize(freqStep);                      // Initialize TimerOne library for the freq we need
  Timer1.attachInterrupt(dim_check, freqStep);
  Serial.begin(9600);
  dht.begin();
  lcd.InitLCD(60);
  time.begin();
  //time.settime(0,13,16,13,11,19,3);
  minuts = time.minutes;
  lcd_stat_change(0, 0, 1);
  lcd_stat_change(0, 0, 2);
  statvent(0, 0);
  driver_fan(hourse, days);
}

void zero_cross_detect() {
  zero_cross = true;               // set the boolean to true to tell our dimming function that a zero cross has occured
  i = 0;
  digitalWrite(AC_pin, LOW);       // turn off TRIAC (and AC)
}

// Turn on the TRIAC at the appropriate time
void dim_check() {
  if (zero_cross == true) {
    if (i >= dim) {
      digitalWrite(AC_pin, HIGH); // turn on light
      i = 0; // reset time step counter
      zero_cross = false; //reset zero cross detection
    }
    else {
      i++; // increment time step counter
    }
  }
}

void statvent(int stat_fan, int speed_fan) {
  Serial.println((String)"Val:" + stat_fan + "Fan: " + speed_fan);
  if (stat_fan == 1) {
    lcd.clrRow(5, 10);
    lcd.print((String)"Fan:on" + " Spd:" + speed_fan, LEFT, 40);
  } else {
    lcd.clrRow(5, 10);
    lcd.print("Fan:off", LEFT, 40);
  };
}

void lcd_stat_change(int h, int t, int m) {
  if (m == 1) {
    lcd.clrScr();
  }
  lcd.setFont(SmallFont);
  lcd.print(time.gettime("d-m-y, D"), 0, 0);
  if (m == 2 ) {
    lcd.clrRow(1, 10);
    lcd.clrRow(2, 10);
    lcd.setFont(MediumNumbers);
    lcd.print(time.gettime("H"), 15, 15);
    lcd.setFont(SmallFont);
    lcd.print(":", CENTER, 20);
    lcd.setFont(MediumNumbers);
    lcd.print(time.gettime("i"), 45, 15);
  }
  if (m == 3) {
    lcd.clrRow(4, 10);
    lcd.setFont(SmallFont);
    lcd.printNumI(h, LEFT, 35);
    lcd.printNumI(t, 45, 35);
    lcd.print("%", 15, 35);
    lcd.print("C", 60, 35);
  }
}

void driver_fan(int h, int d) {
  int Int;
  if ( d == 0 || d == 6) {
    Int = 1;
  } else {
    Int = 0;
  }
  int stat = myList[Int][h];
  if ( stat == 1 ) {
    g_fan_stat = 1;
  } else {
    g_fan_stat = 0;
  }
}

void driver_fan_speed(int vl) {
  Serial.println((String)"g_fan_stat : " + g_fan_stat);
  Serial.println((String)"vl : " + vl);
  if (g_fan_stat > 0) {
    int speed_fan = round(vl / 10);
    dim = SpeedFan[0][speed_fan];
    g_fan_speed = (speed_fan * 10);
    Serial.println((String)"пиздец" + g_fan_speed);
  } else {
    dim = 128;
  }
}

void loop() {
  time.gettime();
  int nd = time.weekday;
  int nh = time.Hours;
  int mh = time.minutes;
  if (millis() - timing2 > 5000) { 
    timing2 = millis();
    h = dht.readHumidity();
    t = dht.readTemperature();
    Serial.println(round(h / 10));
    lcd_stat_change(h, t, 3);
    statvent(g_fan_stat, g_fan_speed);
    driver_fan_speed(h);
  }
  if (days != time.day) {
    days = time.day;
    lcd_stat_change(h, t, 1);
    lcd_stat_change(h, t, 3);
    lcd_stat_change(h, t, 2);
  }
  if (minuts != time.minutes) {
    minuts = time.minutes;
    Serial.println((String)g_fan_stat + " : " + g_fan_speed);
    lcd_stat_change(h, t, 2);
  }
  if (hourse != time.Hours) {
    hourse = time.Hours;
    driver_fan(hourse, days);
  }
}

nik182
Offline
Зарегистрирован: 04.05.2015

Библиотека DHT запрещает прерывания на время чтения датчика. Так что или температура или диммер. На одной нане совместить не получится. Берите блюпил. На нем всё работает без проблем.

mario512
Offline
Зарегистрирован: 29.10.2019

Блюпил не гуглится))) втф?)))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

mario512 пишет:
Блюпил не гуглится))) втф?)))

Bluepill stm32 патамуш. 

vvadim
Offline
Зарегистрирован: 23.05.2012

от тс ещё и стм осваивать)))))

ну вы мужики со своими советами выдали))))))

nik182
Offline
Зарегистрирован: 04.05.2015

А что делать? Можно 2 наны взять. С одной на другую гнать температуру по сериалу или ещё как. Можно датчик поменять на без прерывания.

mario512
Offline
Зарегистрирован: 29.10.2019

nik182 пишет:

А что делать? Можно 2 наны взять. С одной на другую гнать температуру по сериалу или ещё как. Можно датчик поменять на без прерывания.

А есть такой датчик? Вычитал, что в Arduino Due есть возможность на некоторых пинах запрещать прерывание

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

mario512 пишет:
Блюпил не гуглится))) втф?)))

вот тут к IDE прикручивают

mario512
Offline
Зарегистрирован: 29.10.2019

Проще читать раз в пять минут влажность, или due прикупить)))) Там либы переписывать и питальник для 5v модулей юзать. Это только очевидные моменты...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

mario512 пишет:
Проще читать раз в пять минут влажность, или due прикупить)))) Там либы переписывать и питальник для 5v модулей юзать. Это только очевидные моменты...

а у DUE ядро какое )))

b707
Offline
Зарегистрирован: 26.05.2017

mario512 пишет:

А есть такой датчик?

термистор типа NTC точно работает без прерываний. И еще DS18B20 - если читать его напрямую, без библиотеки

Оба этих варианта явно проще. чем 2 отдельных ардуины...

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

b707 пишет:

 И еще DS18B20 - если читать его напрямую, без библиотеки

Ну, совсем без запрещения прерываний 1 Wire не сделаешь если спец железа нет. Тайминги не выдержать. Но в ардуиновской библиотеке прерывания запрещаются всего на десятки микросекунд, что на АС диммер практически не влияет.

Цитата:
Оба этих варианта явно проще. чем 2 отдельных ардуины...

Сделать 1-Wire протокол самому, да еще  и без запрета прерываний это проще чем соединить 2 ардуины по I2C, SPI или UART ?  Ну вы, батенька, знаете толк в извращениях!

b707
Offline
Зарегистрирован: 26.05.2017

asam пишет:

Сделать 1-Wire протокол самому, да еще  и без запрета прерываний

не, полагаю если сделать на стандартной ардуиновской либе, с запретом прерываний только на время передачи по шине - DS18B20 и диммер увполне уживутся вместе.

Так что никаких извращений - уровень чуть продвинутого любителя, не более

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

b707 пишет:

 И еще DS18B20 - если читать его напрямую, без библиотеки

b707 пишет:

не, полагаю если сделать на стандартной ардуиновской либе, с запретом прерываний только на время передачи по шине - DS18B20 и диммер увполне уживутся вместе.

Уважаемый, так вы уж определитесь - "напрямую без библиотеки" или "на стандартной ардуиновской либе".

 

 

b707
Offline
Зарегистрирован: 26.05.2017

asam пишет:

Уважаемый, так вы уж определитесь - "напрямую без библиотеки" или "на стандартной ардуиновской либе".

определяюсь :) - речь о разных библиотеках

Вот тут:

b707 пишет:

 И еще DS18B20 - если читать его напрямую, без библиотеки

имел в виду без библиотеки DallasTemperature.h

А вот тут

b707 пишет:

не, полагаю если сделать на стандартной ардуиновской либ

речь о OneWire.h

 

 

mario512
Offline
Зарегистрирован: 29.10.2019

Блинский. Смирился я с блыманьем. Увеличил интервал. Но столкнулся с неведанным колдунством. Лампой диммер управляет, вопросов нет, но каковым же было мое удивление, когда я подключил все эти потроха к канальному вентилятору!
Он молотит в полную, игнорируя диммер. Замеряю напряжение, подключив лампу, на контактах нагрузки, 60 вольт. А подключив вентилятор, напряжение поднимается до 260!
ВТФ!!???

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

индуктивная нагрузка однако )))

mario512
Offline
Зарегистрирован: 29.10.2019

Уже понял, что имею дело с однофазным асинхронным двигателем. Есть готовые решения для управления такими моторами?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

mario512 пишет:
Уже понял, что имею дело с однофазным асинхронным двигателем. Есть готовые решения для управления такими моторами?

ага, частотник называется

mario512
Offline
Зарегистрирован: 29.10.2019

Ткните носом, где купить.

bwn
Offline
Зарегистрирован: 25.08.2014

mario512 пишет:
Ткните носом, где купить.

Нахуа?

mario512
Offline
Зарегистрирован: 29.10.2019

А есть другой вариант?))))

bwn
Offline
Зарегистрирован: 25.08.2014

Ну вытягивает он на полной мощности, это так страшно? Или у вас там труба аэродинамическая, клиенты улетают?))))

mario512
Offline
Зарегистрирован: 29.10.2019

да шумит, просто. Дома стоит, на кухне. Мощность избыточная. К нему есть в продаже регулятор оборотов от производителя с крутилкой, но это не кошерно рукой двигать. Я же не зря ардуин накупил.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

b707 пишет:

asam пишет:

Уважаемый, так вы уж определитесь - "напрямую без библиотеки" или "на стандартной ардуиновской либе".

определяюсь :) - речь о разных библиотеках

Вот тут:

b707 пишет:

 И еще DS18B20 - если читать его напрямую, без библиотеки

имел в виду без библиотеки DallasTemperature.h

А вот тут

b707 пишет:

не, полагаю если сделать на стандартной ардуиновской либ

речь о OneWire.h

 

DallasTemperature  сама по себе прерывания не запрещает, а вот OneWire запрещает. Так что неиспользование DallasTemperature ситуацию с прерываниями не улучшает никак.

bwn
Offline
Зарегистрирован: 25.08.2014

mario512 пишет:
да шумит, просто. Дома стоит, на кухне. Мощность избыточная. К нему есть в продаже регулятор оборотов от производителя с крутилкой, но это не кошерно рукой двигать. Я же не зря ардуин накупил.

Крутилку, сервой крутить.)))) Или наберите "Частотный преобразователь", на такие маленькие мощности, не уверен.

mario512
Offline
Зарегистрирован: 29.10.2019

Вот инфа от производителя:
"Вентилятор управляется при помощи комнатного выключателя освещения. Выключатель в комплект поставки не входит.
Регулировка скорости может осуществляться с помощью тиристорного регулятора РС-1-300 или РС-1-400 (для моделей, не
оборудованных таймером). Регулировка скорости для моделей вентиляторов ВЕНТС Квайтлайн 100 Дуо, ВЕНТС Квайтлайн 125 Дуо, ВЕНТС Квайтлайн 150 Дуо, ВЕНТС Квайтлайн 150 Экстра также может осуществляться с помощью переключателя скоростей П2-1-300 (см. раздел «Электрические принадлежности»)"
Может просто димер не тот?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

собери сам на BTA16-600 + Моська + не забудь поставить снаббер параллельно нагрузке, такак она индуктивная.  У меня Домовент (22Вт) прекрасно работает на 100% и 70% (ночью) мощности, не гудит и не греется.  Важно понимать, что таким диммером асинхронник прям с 0% мощности не регулируется, с 0 и примерно до 50%  мощности вентилятор не крутится, только угрожающе гудит и греется, и только потом начинает нехотя вертеца.  Без снаббера движок не крутится и греется примерно до 75% мощности, так что ставить его обязательно.  А в твоем модуле, я как раз снаббера и не вижу, зато вижу нах не нужный диодный мост.  Это не для мотора диммер, а для простой чесной лампочки, не являющейся индуктивной нагруской. 

mario512
Offline
Зарегистрирован: 29.10.2019

На данном этапе моих познаний мне проще купить готовое решение. Вот заказал: https://github.com/serhiy23412/AC_dimmer-dmr-0.2.1/blob/master/AC_Dimmer_Docum.docx?raw=true

Утверждают, что работать будет. Не вводят в заблуждение?