• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

OTA и прерывания

pvvx

Активный участник сообщества
Часы всего 65мА, без всяких шлюзов. Цена esp8266, драйверов с матрицами около $8. У вас шлюз 250ма и еще BLE сверху. Про цену я не говорю, тут и так понятно.
И с кем же они соединены - бегом измерять. Или не умеете? раз других просите?

Только что ещё попробовал - RTL8722 аж в Arduino соединяется с XiaomiLYWSD03MMC и без включения каких-либо режимов понижения питания и кушает около 40 мА. Принимает от брелка температуру и влажность и передает обратно, но с обменом позиций цифр на LCD. Прост для прикола и теста...
Код:
Initializing WIFI ...
05:31:35.021 -> WIFI initialized
05:31:35.021 -> [BLE Device] Local BT addr: 70:1d:08:0b:ff:9d
05:31:35.336 -> [BLE Device] GAP scan start
05:31:35.336 -> Found BLE Device at address A4:C1:38:0B:5E:ED
05:31:39.325 -> [BLE Device] GAP scan stop
05:31:39.325 -> [BLE Device] Connected conn_id 0
05:31:39.780 -> Discovering services of connected device..Conn ID 0 client error: Service fe95 has no characteristics to add descriptor to
05:31:44.810 ->
05:31:45.440 -> '1F1F' characteristic found
05:31:50.426 -> Characteristic Notifications Enabled...
05:31:52.922 -> UUID: 1f1f Battery: 3271 mV , Temp: 28.08C, Humi: 29.59%, Count: 437
05:32:04.970 -> UUID: 1f1f Battery: 3306 mV , Temp: 28.05C, Humi: 29.55%, Count: 438
05:32:05.871 -> 295
05:32:05.871 -> Send ext. cmd UUID: 1f1f Blk id 34, len 8
05:32:15.020 -> UUID: 1f1f Battery: 3309 mV , Temp: 28.04C, Humi: 29.46%, Count: 439
05:32:17.009 -> 294
05:32:17.009 -> Send ext. cmd UUID: 1f1f Blk id 34, len 8
05:32:25.132 -> UUID: 1f1f Battery: 3310 mV , Temp: 28.00C, Humi: 29.41%, Count: 440
05:32:27.076 -> 294
05:32:27.076 -> Send ext. cmd UUID: 1f1f Blk id 34, len 8
...
Итог - в помойку ваши часы, а чип ESP8266 выньте и на шею на веревочку... У вас же любовь к ним - всегда будет ближе к телу, а тема то вооще-то про dimmer, которому мешает OTA. Я вот всё жду когда TC выполнит свой спортивный интерес...
У меня за всю жизнь используется всего один диммер на 10 кВт, т.к. без него в загородном поместье в обычную розетку не врубить бак с тэном что-то на более 5 кВт. А с ним вся проводка жужит, греется, но работает и пакетник на 16 А не отключается, да и розетка не выгорает. А так более и не вижу смысла в диммерах и не имею их, даже "по любви" как вы свои часы с ESP :) Называть диммером всякие регуляторы оборотов и прочие пусковые устройства для больших электромоторов "как-то рука не подымается" - но с ними копался...
 

pvvx

Активный участник сообщества
Цена esp8266, драйверов с матрицами около $8. У вас шлюз 250ма и еще BLE сверху. Про цену я не говорю, тут и так понятно.
Поглядел на счет цены - минимально полезный роутер с WiFi ныне в магазинах от 12 тысяч. руб. Это ещё самая дешевка, которая не отработает и пяти лет.
 

enjoynering

Well-known member
А вы весёлый. И похоже совсем не умеете проигрывать. Вам бы к специалисту.

По теме. Так и у вас шлюз с тем же соединен. :) Поэтому роутер я не учитывал. Идем дальше. У вас пассивный ЖКИ который не видно в темноте с потреблением максимум 2мА. У меня активный светодиодный дисплей (с матрицей на 320 светодиодов!). Странно, что такие вещи приходится вам объяснять. Как бы сравнивать ваше и моё без поправок на тип экрана уже не корректно.

Складываем. Ваши 40ма BLE со слепым в темноте ЖКИ. Сюда прицепом идет 250мА шлюз тк без, него BLE в интернет не может (роутер я не учитываю). ИТОГО - 290мА. У меня адын esp8266 с активным матричным дисплеем (который легко видно темноте с 5 метров). Общее потреблением esp8266 плюс 320 светодиодов - 65мА. Шлюз Esp8266 не нужен. Он сам соединяется с роутером и тянет от туда погоду, да хоть котировки валют.
 

pvvx

Активный участник сообщества
А вы весёлый. И похоже совсем не умеете проигрывать. Вам бы к специалисту.

По теме. Так и у вас шлюз с тем же соединен. :) Поэтому роутер я не учитывал. Идем дальше. У вас пассивный ЖКИ который не видно в темноте с потреблением максимум 2мА. У меня активный светодиодный дисплей (с матрицей на 320 светодиодов!). Странно, что такие вещи приходится вам объяснять. Как бы сравнивать ваше и моё без поправок на тип экрана уже не корректно.

Складываем. Ваши 40ма BLE со слепым в темноте ЖКИ. Сюда прицепом идет 250мА шлюз тк без, него BLE в интернет не может (роутер я не учитываю). ИТОГО - 290мА. У меня адын esp8266 с активным матричным дисплеем (который легко видно темноте с 5 метров). Общее потреблением esp8266 плюс 320 светодиодов - 65мА. Шлюз Esp8266 не нужен. Он сам соединяется с роутером и тянет от туда погоду, да хоть котировки валют.
Вы ошиблись в сравнении (попы с пальцем) на одну букву "к" - Не 2 мА, а максимум 2 мкА потребляет пассивный LCD.
В сумме, с датчиком (которой в одиночной продаже дороже чем готовое устройство) среднее потребление всего устройства от CR2032 и есть 17..18 мкА.
И инет у многих 3/4/5G, да бывает и прямо WiFi от прова и нет никаких проводных роутеров. Можно и оптику. Проводной инет уперся в 100 Мбит/сек, т.к. выше для покрытия тех-же 100 метров требует дорогого кабеля, а сильно не повышает и там физ.предел до пары Гбит/с.
А про попу с пальцем:
  • уже указано и замерено - RTL872xDx жрет 1 мА при активном соединении с AP на 2 или 5 ГГц. Но этого не достаточно для автономного устройства (надо до 40 мкА если CR2032)
  • на ESP8266 невозможен dimmer, а мной перечислены чипы на которых возможен полу- или полностью аппаратный диммер. (а это касается тематики темы, а не просто спам от enjoynering)
 

pvvx

Активный участник сообщества
@enjoynering - вы уж там потрудитесь и вернитесь к теме - напишите пример как на ваших часах сделать dimmer.
 

pvvx

Активный участник сообщества
@enjoynering - По теме хвастовства часами на светодиодах – у меня в городском доме безлимитный доступ к общему инет от разных провайдеров 3-х видов: WiFi, 4G и проводный.

Меня не интересует, сколько там оно жрет у провайдеров, а интересует автономность своих бытовых устройств. Привязка к розетке с проводом раздражает – желательно чтобы оно жило само, даже холодильник. Но пока с “холодильником” это не реально для простого обывателя, т.к. ядерные батарейки дороги, а удовлетворительной передачи энергии на расстояние не придумали.

Сколько потребляет скрипт на внешнем сервере мне тоже безразлично. А доступ к нескольким внешним серверам у меня есть. Так-же есть и свой частный корпоративный сервак с полным доступом, включая физический. По этому, решения ваших задач у меня происходят совсем по другому – скриптом на внешнем сервере.

И с чем вы сравниваете свои часы, сделанные на чужом коде по типовому проекту для баловства в Arduino – мне непонятно. Но понятно одно - если вы делаете такие "часы" и пользуете Arduino c ESP8266, то в вашей жизни и возникают проблемы с ценой для всего что используете в хобби.
 

Melandr

Member
Добрый вечер, вернемся все-таки к нашим баранам :)
Выкладываю код скетча, который работает.
Код:
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <Ticker.h>
#include "RemoteDebug.h"

#include "gpio.h"

// Instance of RemoteDebug
RemoteDebug Debug;
Ticker blinker;

#define GPIO_OUT_W1TS (*(volatile uint32_t *)0x60000304)
#define GPIO_OUT_W1TC (*(volatile uint32_t *)0x60000308)

//#define CAYENNE_PRINT Serial    // Comment this out to disable prints and save space
#include <CayenneMQTTESP8266.h>                                     // Include library file for MQTT

#define HOST_NAME "remotedebug"

#define TRIAC_PIN     2         //GPIO2         управление симистором
#define ZC_PIN        1         //GPIO1 - TXD   детектор перехода через "0"
#define BUTTON_PIN    3         //GPIO3 - RXD   кнопка

#define TIME_PULSE 5

void ICACHE_RAM_ATTR zero_crosss_int();
void ICACHE_RAM_ATTR onTimerISR();

#ifndef STASSID
#define STASSID "ASUS"
#define STAPSK  "gCU8YNZs"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

char username[] = "60267f30-21f2-11eb-8779-7d56e82df461";           // Your MQTT cayenne username
char Password[] = "a9631607be6b7979c4c117bbdadc76683b9dbf97";       // Your MQTT cayenne Password
char clientID[] = "bf444650-21fc-11eb-883c-638d8ce4c23d";           // Your MQTT cayenne clientID

volatile int DIMMING_VALUES = 30;
volatile int DIMMING_TIME = 0;
int BUTTON = 0;

byte lightState = 1;           //состояние объекта: 0 - выключен, 1 - включен
int power = 0;
int val = 100;                                       // переменная задающая мощность от 0 до 100

volatile unsigned long countZeroCross = 0;
unsigned long lastMillis = 0;

void setup() {
  Serial.begin(230400);
  /*
    gpio_init();
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
    gpio_output_set(0, 0, (1 << TRIAC_PIN), 0);
    GPIO_OUT_W1TC = BIT(TRIAC_PIN);
  */
  //настраиваем пины ESP в зависимости от назначения
  pinMode(TRIAC_PIN, OUTPUT);                                         
  digitalWrite(TRIAC_PIN, LOW);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  pinMode(ZC_PIN, INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(ZC_PIN), zero_crosss_int, RISING);   // Choose the zero cross interrupt egde selection

  timer1_attachInterrupt(onTimerISR);
  timer1_enable(TIM_DIV16, TIM_EDGE, TIM_SINGLE);

  Cayenne.begin(username, Password, clientID, ssid, password);               // Setup cayenne server for MQTT protocol

  Serial.println("Booting");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(500);
    ESP.restart();
  }

  initializeOTA();

  // Initialize RemoteDebug
  Debug.begin(HOST_NAME); // Initialize the WiFi server
  Debug.setResetCmdEnabled(true); // Enable the reset command
  Debug.showProfiler(true); // Profiler (Good to measure times, to optimize codes)
  Debug.showColors(true); // Colors
}

void loop() {

  ArduinoOTA.handle();

  Cayenne.loop();

  if (millis() - lastMillis > 5000) {
    lastMillis = millis();

    debugV("power = %u", power);
    debugV("val = %u", val);
    debugV("countZeroCross = %u", countZeroCross);
    debugV("uptime = %u", millis() / 1000);
    debugV("lihgtState = %u", lightState);
    /*   debugV("countSysTimer = %u", countSysTimer);*/
  }
  BUTTON = digitalRead(BUTTON_PIN);

  // RemoteDebug handle
  Debug.handle();
}

//функция инициализаци прошивки по "воздуху"
void initializeOTA() {

  noInterrupts();

  ArduinoOTA.onStart([]() {
    Serial.println("* OTA: Start");
  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\n*OTA: End");
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("*OTA: Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("*OTA: Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
    else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
    else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
    else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
    else if (error == OTA_END_ERROR) Serial.println("End Failed");
  });

  // Begin
  ArduinoOTA.begin();

  interrupts();
}

void ICACHE_RAM_ATTR zero_crosss_int()                   //функция, которая запускается при пересечении нуля, чтобы изменить яркость света
{
  power = 49500 - 490 * val;
  timer1_write(power);
  countZeroCross++;
}

void ICACHE_RAM_ATTR onTimerISR()  // обработчик прерывания таймера
{
  if (lightState == 1)
  {
    digitalWrite(TRIAC_PIN, HIGH);
    delayMicroseconds(TIME_PULSE);
    digitalWrite(TRIAC_PIN, LOW);

    timer1_write(50000);//10мс при тике - 0,2 мкс
  }
}

CAYENNE_OUT_DEFAULT()
{
  // Запишите данные в Cayenne здесь. В этом примере просто отправляется текущее время безотказной работы в миллисекундах на виртуальном канале 0.
  Cayenne.virtualWrite(V0, millis() / 1000);
  Cayenne.virtualWrite(V1, BUTTON);
  Cayenne.virtualWrite(V2, countZeroCross);
}

CAYENNE_IN(1)
{
  int Dimm_Val = getValue.asInt();
  val = Dimm_Val;
}

CAYENNE_IN(2)
{
  lightState = getValue.asInt();
  if (lightState == 1)
  {
    digitalWrite(TRIAC_PIN, 1);  // to get the value from the website
  }
  else
  {
    digitalWrite(TRIAC_PIN, 0);  // to get the value from the website
  }
}
Да наблюдается джиттер управляющего импульса на симисторе. Но используются медленные функции работы с пинами и библиотека Ticker для формирования импульса задержки. Сейчас необходимо отказаться от медленных функций digitaWrite и перейти на управление выводами через регистры. Обрыв обновления прошивки по воздуху вроде бы устранил запретом прерывания в начали OTA и разрешением в конце.
В идеале использовать аппаратный таймер, отказавшись от софтовых задержек.
 

Melandr

Member
pvvx, если не трудно подскажите, при инициализации заменяю код
Код:
  pinMode(TRIAC_PIN, OUTPUT);                                         
  digitalWrite(TRIAC_PIN, LOW);
на код
Код:
    gpio_init();
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
    gpio_output_set(0, 0, (1 << TRIAC_PIN), 0);
    GPIO_OUT_W1TC = BIT(TRIAC_PIN);
А в самом коде функцию digitalWrite(TRIAC_PIN, HIGH); заменяю на GPIO_OUT_W1TS = BIT(TRIAC_PIN);
а функцию digitalWrite(TRIAC_PIN, LOW); на функцию GPIO_OUT_W1TC = BIT(TRIAC_PIN);
И работа программы ломается.
Смотрю на Ваш код, который вы давали ранее и не могу понять, в чем разница.
Правда еще используется пин для отслеживания перехода через "0", возможно, необходимо и его использование переписать, но пока не сообразил как.
 

pvvx

Активный участник сообщества
pinMode и digitalWrite могут использовать свои побрякушки и откладывать свои яйца, а прерыванию нужны свои.
Я не собираюсь лезть в глупые либы Arduino и вычислять какие там зависимости и как реализована совместимость настроек с кодом прерывания и прочих функций.
Скорее всего никак, а используется своя экосистема (меж-процедурные и прочие завязки) и от неё не шагу.
В концепции Arduino нельзя использовать альтернатив. Варианты ограничены "делай как я" и копией скетча с малыми изменениями только букв в стрингах (имен AP и типа.).
Именно по этому в примере я не использовал ни одной из функций Arduino.
 

pvvx

Активный участник сообщества
В Arduino нельзя менять местами функции или ещё как редактировать предоставляемые примеры, тем более смешивать разные либы. Оно создано не для этого и ничем не отличается от сборки мебели из Икея по инструкции. т.е. строго по приведенному скетчу в примере руководства по Arduino и без модификаций. Иначе будут проблемы. Их вы и наблюдаете в виде вопросов на всех форумах Arduino.
 

pvvx

Активный участник сообщества
Все альтернативы в Arduino запрещены. Вы загнаны в рамки использования типовых вариантов и ни шагу в сторону. Иначе как вырастить рабов лилеящих типовую похлебку и действующих строго по инструкции?
Спросите у enjoynering - он вам найдет типовой пример "диммера" для Arduino ESP8266. Я в таких сортах г. не разбираюсь.
 

Melandr

Member
pvvx, посмотрите, переделал код на прямое управление регистрами
Код:
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <Ticker.h>
#include "RemoteDebug.h"

#include "ets_sys.h"
#include "gpio.h"

// Instance of RemoteDebug
RemoteDebug Debug;
Ticker blinker;

#define GPIO_OUT_W1TS (*(volatile uint32_t *)0x60000304)
#define GPIO_OUT_W1TC (*(volatile uint32_t *)0x60000308)
#define GPIO_STATUS (*(volatile uint32_t *)0x6000031C)
#define GPIO_STATUS_W1TC (*(volatile uint32_t *)0x60000324)

//#define CAYENNE_PRINT Serial    // Comment this out to disable prints and save space
#include <CayenneMQTTESP8266.h>                                     // Include library file for MQTT

#define HOST_NAME "remotedebug"

#define TRIAC_PIN     2         //GPIO2         управление симистором
#define ZC_PIN        1         //GPIO1 - TXD   детектор перехода через "0"
#define BUTTON_PIN    3         //GPIO3 - RXD   кнопка

#define TIME_PULSE 5

void ICACHE_RAM_ATTR zero_crosss_int(void *arg);
void ICACHE_RAM_ATTR onTimerISR();

#ifndef STASSID
#define STASSID "ASUS"
#define STAPSK  "gCU8YNZs"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

char username[] = "60267f30-21f2-11eb-8779-7d56e82df461";           // Your MQTT cayenne username
char Password[] = "a9631607be6b7979c4c117bbdadc76683b9dbf97";       // Your MQTT cayenne Password
char clientID[] = "bf444650-21fc-11eb-883c-638d8ce4c23d";           // Your MQTT cayenne clientID

volatile int DIMMING_VALUES = 30;
volatile int DIMMING_TIME = 0;
int BUTTON = 0;

byte lightState = 1;           //состояние объекта: 0 - выключен, 1 - включен
int power = 0;
int val = 100;                                       // переменная задающая мощность от 0 до 100

volatile unsigned long countZeroCross = 0;
unsigned long lastMillis = 0;

void setup() {
  Serial.begin(230400);

  gpio_init();
  PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
  PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_GPIO1);
  PIN_PULLUP_EN(PERIPHS_IO_MUX_U0TXD_U);
  gpio_output_set(0, 0, (1 << TRIAC_PIN), (1 << ZC_PIN));
  GPIO_OUT_W1TC = BIT(TRIAC_PIN);

  //настраиваем пины ESP в зависимости от назначения
  /*  pinMode(TRIAC_PIN, OUTPUT);
    digitalWrite(TRIAC_PIN, LOW);
    pinMode(BUTTON_PIN, INPUT_PULLUP);
    pinMode(ZC_PIN, INPUT_PULLUP);

    attachInterrupt(digitalPinToInterrupt(ZC_PIN), zero_crosss_int, RISING);   // Choose the zero cross interrupt egde selection
  */
  gpio_pin_intr_state_set(ZC_PIN, GPIO_PIN_INTR_POSEDGE);
  ets_isr_attach(ETS_GPIO_INUM, zero_crosss_int, NULL);

  timer1_attachInterrupt(onTimerISR);
  timer1_enable(TIM_DIV16, TIM_EDGE, TIM_SINGLE);

  Cayenne.begin(username, Password, clientID, ssid, password);               // Setup cayenne server for MQTT protocol

  Serial.println("Booting");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(500);
    ESP.restart();
  }

  initializeOTA();

  // Initialize RemoteDebug
  Debug.begin(HOST_NAME); // Initialize the WiFi server
  Debug.setResetCmdEnabled(true); // Enable the reset command
  Debug.showProfiler(true); // Profiler (Good to measure times, to optimize codes)
  Debug.showColors(true); // Colors

  ets_isr_unmask(BIT(ETS_GPIO_INUM));
}

void loop() {

  ArduinoOTA.handle();

  Cayenne.loop();

  if (millis() - lastMillis > 5000) {
    lastMillis = millis();

    debugV("power = %u", power);
    debugV("val = %u", val);
    debugV("countZeroCross = %u", countZeroCross);
    debugV("uptime = %u", millis() / 1000);
    debugV("lihgtState = %u", lightState);
    /*   debugV("countSysTimer = %u", countSysTimer);*/
  }
  //  BUTTON = digitalRead(BUTTON_PIN);

  // RemoteDebug handle
  Debug.handle();
}

//функция инициализаци прошивки по "воздуху"
void initializeOTA() {

  //  noInterrupts();
  //  ets_isr_mask(BIT(ETS_GPIO_INUM));
  ETS_GPIO_INTR_DISABLE();

  ArduinoOTA.onStart([]() {
    Serial.println("* OTA: Start");
  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\n*OTA: End");
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("*OTA: Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("*OTA: Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
    else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
    else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
    else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
    else if (error == OTA_END_ERROR) Serial.println("End Failed");
  });

  // Begin
  ArduinoOTA.begin();

  //  interrupts();
  //  ets_isr_unmask(BIT(ETS_GPIO_INUM));
  ETS_GPIO_INTR_ENABLE();
}

void ICACHE_RAM_ATTR zero_crosss_int(void *arg)                   //функция, которая запускается при пересечении нуля, чтобы изменить яркость света
{
  (void)arg;
  uint32_t tmp = GPIO_STATUS;
  GPIO_STATUS_W1TC = tmp;
  if (tmp & BIT(ZC_PIN))
  {
    power = 49500 - 490 * val;
    timer1_write(power);
    countZeroCross++;
  }
}

void ICACHE_RAM_ATTR onTimerISR()  // обработчик прерывания таймера
{

  if (lightState == 1)
  {
    //    digitalWrite(TRIAC_PIN, HIGH);
    GPIO_OUT_W1TS = BIT(TRIAC_PIN);
    delayMicroseconds(TIME_PULSE);
    //    digitalWrite(TRIAC_PIN, LOW);
    GPIO_OUT_W1TC = BIT(TRIAC_PIN);

    timer1_write(50000);//10мс при тике - 0,2 мкс
  }
}

CAYENNE_OUT_DEFAULT()
{
  // Запишите данные в Cayenne здесь. В этом примере просто отправляется текущее время безотказной работы в миллисекундах на виртуальном канале 0.
  Cayenne.virtualWrite(V0, millis() / 1000);
  Cayenne.virtualWrite(V1, BUTTON);
  Cayenne.virtualWrite(V2, countZeroCross);
}

CAYENNE_IN(1)
{
  int Dimm_Val = getValue.asInt();
  val = Dimm_Val;
}

CAYENNE_IN(2)
{
  lightState = getValue.asInt();
  if (lightState == 1)
  {
    //    digitalWrite(TRIAC_PIN, 1);  // to get the value from the website
    GPIO_OUT_W1TS = BIT(TRIAC_PIN);
  }
  else
  {
    //    digitalWrite(TRIAC_PIN, 0);  // to get the value from the website
    GPIO_OUT_W1TC = BIT(TRIAC_PIN);
  }
}
В принципе работает, но почему-то амплитуда управляющего импульса на симистор при использовании управления через регистры в 2 раза меньше
SDS00001.pngSDS00002.pngSDS00003.png
А вот при использовании вышеуказанного кода с использованием функций pinMode и digitalWrite , развертку на осциллографе не менял
SDS00004.png
SDS00005.pngSDS00006.png

Что я делаю не так? Управляющий импульс по командам управления перемещается по полупериоду. Я так понимаю, что либо что-то не добавил, либо добавил лишнего в прямом управлении через регистры. Но что?
 

iG2019

New member
Я в таких сортах г. не разбираюсь.
Уважаемый pvvx, ответьте на вопрос - если вам так не нравится esp8266 что вы здесь делаете? Почему не идете на ресурс посвященный вашим BLE-вотным моудлям? Может потому что там нет nikolz-а и нескем меряться пиписьками? Или у тамошних леммингов пиписька может оказаться больше вашей? Не нравятся вам эти esp-шки проходите мимо, чего вы везде лезете со своей ble-вотиной? Когда китайцы начнут штамповать их килограммами как ардуинки и прочее, вот тогда народ может и перейдет на них. А пока каждый использует то что его вполне устраивает.
 

pvvx

Активный участник сообщества
Уважаемый pvvx, ответьте на вопрос - если вам так не нравится esp8266 что вы здесь делаете?
Я сдесь живу. А форум начинался без Ардуинщиков. Вот вы и катитесь от седова на форум Arduino. Понаехали тут - лимита :)
Когда китайцы начнут штамповать их килограммами как ардуинки и прочее, вот тогда народ может и перейдет на них.
Вот я делаю чтобы народ прознал, да чтобы китайцы начали штамповать их килограммами и уже второй эшелон смог сделать вам Arduino. Аналогично и с ESP8266.
А пока каждый использует то что его вполне устраивает.
А глубже пояснить "вполне устраивает" можно? Или стесняетесь?

PS: Спасибо за ваше супер информационное и особо техническое сообщение. :) :)
 

pvvx

Активный участник сообщества
Может потому что там нет nikolz-а и нескем меряться пиписьками? Или у тамошних леммингов пиписька может оказаться больше вашей?
Нет. Потому что у nikolz-а пиписька не выросла, а её ему выращиваю. А тамошние леминги меня не интересуют, т.к. спецов мало и в каждой области их раз и обчелся. Тем более они все, в околотематике малых SoC мне известны.
А вот от вас никакого толку, даже по половым признакам. Но о народе (и других системах/обществах) судят по отстающим. Я тут и подымаю эту планку. А вы?
 

pvvx

Активный участник сообщества
iG2019 Как я понял, читая ваши сообщения на форуме, что вы настолько тупы, что не понимаете о чем в данных темах разговор. Ok – перевожу:
Описаны проблемы текущей Arduino. За много лет и версий Arduino для ESP8266 её писаки так и не смогли сделать нормальный “dimmer”. Я дал пример и указал что не так и что надо поправить в вашей горячо любимой Arduino для ESP8266. А остальное – это работа второго эшелона лемингов. Не для вас и не для nikolz-ов – вы на это не годитесь.
 

pvvx

Активный участник сообщества
Ещё для таких как iG2019 обращаю внимание – доменное имя сайта не определяет его тематики. Откройте глаза и прозрите – есть и большая часть тем:

Я её не создавал. Но вот она не движется. Что надо чтобы оно проросло?
  • По вашему - Напечатать кучу чипов. Но это уже сделано.
  • Дать исходники с примерами к тем-же ESP – не сделано, т.к. представители поколения Arduino и iG2019 считают это платным и закрытым.
  • Дать возможность модификации разнообразных датчиков народу для включения в сеть вумного дома Xiaomi – Открыто и с примерами пока сделано только с одним девайсом и не без моего участия...
  • Прогнать и забанить таких как iG2019 на данном форуме.
 

pvvx

Активный участник сообщества
посмотрите, переделал код на прямое управление регистрами
В принципе работает, но почему-то амплитуда управляющего импульса на симистор при использовании управления через регистры в 2 раза меньше

А вот при использовании вышеуказанного кода с использованием функций pinMode и digitalWrite , развертку на осциллографе не менял
Что я делаю не так? Управляющий импульс по командам управления перемещается по полупериоду. Я так понимаю, что либо что-то не добавил, либо добавил лишнего в прямом управлении через регистры. Но что?
Время-длительность импульса в первом случае меньше, чем во втором. Осел так отображает. Разверните на осле на более короткий интервал.
 

Melandr

Member
5 мс - цена деления одной ячейки. Ниже желтым показаны результаты измерений. Первые 3 скриншота - 1,7 В, следующие 3 скриншота - 3 В.
 

pvvx

Активный участник сообщества
Melandr ещё есть подозрение, что вывод используется в режиме "открытый коллектор". Надо дописать переключение режима вывода на "push-pull". Возможно что-то в SDK или Arduino по инициализации меняет режим вывода, а мы его не восстановили в "push-pull".
 
Сверху Снизу