Конструктор кода (обновлено: 02 Feb 2022, 07:13:32)

Конструктор кода позволяет написать свой модуль на языке Си.

Например добавить свой датчик или алгоритм действий. Перед сборкой прошивкой необходимо сначала написать код.

Конструктор кода не поддерживает архитектуру языка Arduino, хотя и некоторые функции и называются аналогично.

Примеры пользователей вы можете найти здесь - тут

В конструкторах ESP32 и ESP8266RTOS программирование(набор и синтаксис системных функций) полностью одинаковый так как используют одинаковую операционную систему RTOS. Отличие только в аппаратных устройствах, их наличие или их синтаксис функций. Код на ESP8266 noOS и Linux с ними не совместим.


Пример кода для ESP8266 noOS, все 3 функции должны обязательно присутствовать в коде:

void ICACHE_FLASH_ATTR
startfunc(){// выполняется один раз при старте модуля.
}

void ICACHE_FLASH_ATTR
 timerfunc(uint32_t  timersrc) {
// место для вставки кода, который будет выполнятся каждую 1 секунду.
if(timersrc%30==0){// место для вставки кода, который будет выполнятся каждые 30 секунд.
}
}

void webfunc(char *pbuf) {
os_sprintf(HTTPBUFF,"Hello world"); // вывод данных на главной модуля
}


Пример кода для ESP32 и ESP8266 RTOS, приложение Linux, все 3 функции должны обязательно присутствовать в коде:
void startfunc(){// выполняется один раз при старте модуля.
}

void timerfunc(uint32_t  timersrc) {// выполнение кода каждую 1 секунду
if(timersrc%30==0){// выполнение кода каждые 30 секунд
}
 delay(1000); // обязательная строка, минимальное значение для RTOS систем- 10мс
}
void webfunc(char *pbuf) {
os_sprintf(HTTPBUFF,"Hello world"); // вывод данных на главной модуля
} 


Описание основных функций

Стандартные ардуиноподобные функции:

digitalRead(x) - чтение состояния входа или выхода GPIO. Прямой доступ к аппаратным GPIO, кроме GPIO16 у ESP8266 noOS

digitalWrite(x,y) - установка GPIO. Прямой доступ к аппаратным GPIO, кроме GPIO16 у ESP8266 noOS

GPIO_ALL_GET(x) - чтения состояния входа или выхода GPIO, в том числе расширителей портов.

GPIO_ALL(x,y) - установка GPIO , в том числе и виртуальных и расширителей портов.

analogWrite(x,y) -Управление встроенными ШИМ напрямую. Должен быть установлен модуль программного ШИМ. Указывается номер ШИМ, а не номер GPIO !

PWM_ALL_SET(x,y,f) -управление всеми ШИМопободными опциями модуля, x - номер ШИМ, y -уровень, f - 0- нет записи во флешь, 1 - есть запись во флеш(не у всех ШИМ)

analogRead()-Внутренний АЦП модуля. analogRead(X) для ESP32

delayMicroseconds(x) - пауза микросекунды. Останавливает код

delay(x) - пауза миллисекунды. Останавливает код

micros() - возвращает тики в микросекундах.

Глобальные переменные время:

time_loc.hour, time_loc.min, time_loc.sec

Глобальные переменные календарь:

time_loc.day ,time_loc.month, time_loc.year, time_loc.dow

time_loc.dow - день недели, 0 - понедельник.

Глобальные переменные датчики:

Список переменных датчиков находится в таблице в конце статьи. Данные датчиков хранятся в int , а не float типе, и могут быть умножены на 10,100 или 1000 в зависимости от количества знаков, которое можно подсмотреть на главной странице(исключение - ds18b20 - умножено на 100 всегда). Чтобы преобразовать такие показания с одним знаком в стандартную строку используется функция fltostr(int).

Пример вывода данных с датчиков на OLED дисплей используя fltostr:

char data[32];
os_sprintf(data,"ROOM: %s t ",fltostr(dht_t1));
// выводим через две os_sprintf и склеиваем , т.к. две fltostr() в одной не работает.
os_sprintf(data+os_strlen(data),"%s %",fltostr(dht_h1));
// нулевая строка, шрифт номер 1.
OLED_print(0,data, 1);
Пример вывода на дисплей OLED без fltostr, делением на 10 с выводом без десятых долей:
char data[32];
os_sprintf(data,"ROOM: %d t %d %",dht_t1/10,dht_h1/10);
// нулевая строка, шрифт номер 1.
OLED_print(0,data, 1);

Описание вывода данных на дисплеи:

Вывод своего текста на LCD 1602/1604/2004:
LCD_print(номер строки,текст);

Вывод своего текста на TFT дисплее:

TFT_print(номер строки,текст,шрифт,цвет,центр 1/0);
Вывод своего текста на MAX7219 и HT1632:
MATRIX_print (текст,1 , скорость бегущей строки);
Вывод своего текста на NEXTION:
NEXTION_print ("v1",текст);
Пример работы с таймером (только для ESP8266 noOS):

void ICACHE_FLASH_ATTR read_esp(){
// тут пишем код, который будет вызываться по таймеру
}

static os_timer_t esp_timer; // глобально объявим таймер esp_timer
// запуск таймера:
os_timer_disarm(&esp_timer);
os_timer_setfn(&esp_timer, (os_timer_func_t *)read_esp, NULL); // read_esp -функцию, которую нужно вызвать по таймеру.
os_timer_arm(&esp_timer, 1000, 1); // 1000 миллисекунд. 1 - многократно. 0 -однократно.

Создание задач (для ESP32 и ESP8266 RTOS)

void runtask(){
while (1) { // задача в цикле
delay(100); // пауза в цикле нужна, если задача долгосрочная или требуется замедление задачи

if(условие) break; // заканчиваем цикл и задачу
}

vTaskDelete(NULL); // вырубаем задачу
}   

// создаем задачу (добавляем строку в startfunc:
xTaskCreate(runtask, "runtask1", 2048, NULL, 5, NULL); // 2048 - размер буфера

Работа с MQTT

Позволяет отправлять и принимать данные и команды.

Отправляем данные:

ESP8266 noOS: 

MQTT_Publish(&mqttClient,топик, данные, длина, флаг qos, флаг retain,режим);

ESP32, ESP8266 RTOS и Linux:

MQTT_Publish(топик, данные, длина, флаг qos, флаг retain,режим);

Режим всегда равен 0. Если длина указана 0, то она рассчитывается автоматически. Топик автоматически добавляет логин и имя модуля, если в начале строки топика есть знак '!' (восклицательный знак) , топик их не содержит.

Принимаем данные:

void testmqtt(char *topicBuf,char *dataBuf){ // Функция должна находиться выше функции startfunc
ESP_LOGI("mqtttest","%s:%s",topicBuf,dataBuf); // вывод строки для примера, только для RTOS
// тут пишем условия и действия
char lwt[64];
uint16_t lentopic=os_sprintf(lwt,"%s/%s" topicwrite "/",sensors_param.mqttlogin,sensors_param.hostname);
char *topic = (char *)os_strstr(topicBuf,lwt);
if(topic!=NULL) {
                topic+=lentopic;
                //Тут topic не содержит логин и имя модуля.
                if (!strcoll(topic,"testtopic")){ // событие прихода топика логин/имя_модуля/testtopic
// обрабатываем полученное значение топика dataBuf , например через atoi
}
                }
}
//Добавляем строку в startfunc:
cb_mqtt_funs=testmqtt; // имя функции, созданной выше

Описание дополнительных функций

При сборке прошивки  кроме самого кода можно указать дополнительные параметры:

При указании количества переменных, отличного от нуля в поле "Количество настроек" в веб интерфейсе появляется страница настроек для указания своих переменных, которые сохраняются в энергонезависимую память. Имя переменной sensors_param.cfgdes[X] , где X - номер переменной начиная от нуля. Тип переменной int32_t .

Для того, чтобы передавать свои данные из конструктора кода необходимо указать их количество в поле "глобальные переменные". Переменные передаются на сервера Mqtt и MajorDoMo, имена переменных смотрите в таблице ниже. Тип переменной int32_t.

Установка переменных через MQTT: email/hostname/[set/]valdesX для valdes[X], где X -номер переменной. Добавление топика Set требуется, если включены отдельный топик на запись.

Установка переменных через GET:  ip/valdes?int=X&set=Y, где X -номер переменной, Y - значение.

Глобальные переменные выбирается при сборке прошивки, название в КК: valdes[0-19]

В самом КК переменные считаются от 0 согласно синтаксису языка Си. Вывод и установка в системах модуля считается от 1.

Подробнее на homes-smart.ru 


Свои переменные в системе

Позволяет вывести свои переменные во ВСЕ системы модуля. Переменная появляется на вкладке Metrics.

Пример, его вставляем в самый вверх редактора кода:

uint16_t mysensor; // ваша переменная, можем в неё потом что-то писать.
#define ADDLISTSENS {200,LS_MODE_NA,"MYSENSOR","mysensor",&mysensor,NULL},
Если необходимо еще несколько переменных, то дописываем аналогично в конце после запятой.

Синтаксис строки: {X,Y,"имя в селекторах","краткое имя",&Z,NULL},

Где:

X - номер переменной, рекомендуемое значение - начиная от 200.

Y - тип переменной(температура или влажность и тд., а так же количество знаков, документация)

Z - указатель на имя переменной.


Список системных переменных:

Variable / Function Description
system_get_free_heap_size() Свободное ОЗУ
timersrc Время работы
wifi_station_get_rssi() Уровень сигнала WI-FI
rfidd Данные с RFID