• Система автоматизации с открытым исходным кодом на базе 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".
 
Сверху Снизу