Конструктор кода (обновлено: 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() Уровень сигнала (нет на старых SDK)
apds_c APDS9960 Освещенность
apds_r APDS9960 Освещенность красный
apds_g APDS9960 Освещенность зеленый
apds_b APDS9960 Освещенность синий
CCS_CO2 CO2 датчика CCS811
CCS_TVOC TVOC датчика CCS811
lrsens[x][y] Метрики LORA
max31865data MAX31865 Температура
hdc_t Температура датчика HDC1080
hdc_h Влажность датчика HDC1080
pms_pm10 PM1.0
pms_pm25 PM2.5
pms_pm100 PM1.00
vl53l0x Расстояние VL53L0X
mbstval[y][x] ModBus метрики
tempowm Температура воздуха OpenWeatherMap
humidityowm Влажность воздуха OpenWeatherMap
pressureowm Давление воздуха OpenWeatherMap
windowm Скорость ветра OpenWeatherMap
descrowm Описание погоды OpenWeatherMap
cloudsowm Облачность OpenWeatherMap
feelsowm Температура по ощущениям OpenWeatherMap
rain3howm Количество осадков 3 часа OpenWeatherMap
rain1howm Количество осадков 1 часа OpenWeatherMap
rain3howm Видимость OpenWeatherMap
as5600 Угол AS5600
gpslat Широта GPS приемник
gpslon Долгота GPS приемник
heightgps Высота GPS приемник
speedgps Скорость GPS приемник
coursegps Курс GPS приемник
numsatgps Количество спутиков GPS приемник
btXrssi BT HUB RSSI
btXt BT HUB Температура
btXl BT HUB Освещенность
btXf BT HUB Плодородие
btXm BT HUB Влажность(почвы)
btXh BT HUB Влажность
btXb BT HUB Заряд батареи
shtc3_t Температура SHTC3
shtc3_h Влажность SHTC3
- Данные с Device to Device(D2D)
cse_v Напряжение на CSE7766
cse_c Ток на CSE7766
cse_e Потребление суммарно CSE7766
- Apparent Power CSE7766
cse_a Active Power CSE7766
- Power Factor CSE7766
system_adc_read() Внутренний АЦП (ESP8266)
adc1_get_raw(x) Внутренние АЦП (ESP32)
lmt Температура с датчика LM75 или DS1621
ina_v Напряжение с датчика INA219
ina_a Ток с датчика INA219
dht_tX Температура датчиков DHT22 DHT11
dht_hX Влажность датчиков DHT22 DHT11
bmp_t Температура датчиков BMP180/085
bmp_p Давление датчиков BMP180/085
count60end[x] Данные с счетчика 60
bh_l Освещенность с датчика BH1750
am_t Температура с датчика AM2321
am_h Влажность с датчика AM2321
data1wire[x] Температура датчиков DS18B20
bme_t Температура с датчика BME280
bme_h Влажность с датчика BME280
bme_p Давление с датчика BME280
sht_t Температура с датчика SHT21
sht_h Влажность с датчика SHT21
sht30_t Температура с датчика SHT30
sht30_h Влажность с датчика SHT30
maxtemp Температура с термопары MAX6675
cccvv Напряжение с устройства CC/CV
cccvc Ток с устройства CC/CV
pmv,pmvf Напряжение с устройства Power Monitor
pmcn,pmcf Ток с устройства Power Monitor
pmw Мощность с устройства Power Monitor
pmwh Расход с устройства Power Monitor
rfidd Данные с RFID
sht10_t Температура SHT1x
sht10_h Влажность SHT1x
co2data Датчики CO2 MH-Z1x
vsens[y][x] Данные с датчиков Virtual SENS
ADCdata[x] Данные с АЦП PCF8591
RC_KEYSND Прием кода с радио пульта
temp_DS3231 Температура DS3231
rssigsm RSSI GSM
IR_KEYSND Прием кода с ИК пульта
pcf_countX Счетчик импульсов PCF8583
pcf_county[x] Счетчик импульсов PCF8583 на вчера
rcsendata[x] Температура с модулей RC датчик
rcsendata[x] Влажность с модулей RC датчик
rcsendata[x] АЦП с модулей RC датчик
countint[x] Счетчики импульсов.
pwm_state(x) Состояние ШИМ
digitalRead(x) Состояние GPIO входа (MajorDoMo)
digitalRead(x) Состояние GPIO входа (MQTT)
valdes[x] Глобальные переменные конструктора кода
hx711 Весы HX711
datamcp1 Данные с АЦП MCP3201
smsmsg Текст входящей SMS GSM модуля
ADSDATA[x] Данные с АЦП ADS1115
vz89co2 CO2 VZ-89T
vz89co2 Датчик VZ-89T CO2
vz89tvoc Датчик VZ-89T tvoc
nootemp[x] Температура с датчиков NooLite
noohum[x] Влажность с датчиков NooLite
readsonar HC-SR04
tsllux Данные с TSL2561
IMAPMESSAGES Количество сообщений в электронном ящике
IMAPUNSEEN Количество непрочитанных сообщений в электронном ящике
ibdata ID iButton ключа
ups_vi Данные с UPS Монитора. Напряжение на входе.
ups_vf Данные с UPS Монитора. Напряжение на входе.
ups_vo Данные с UPS Монитора. Напряжение на выходе.
ups_hz Данные с UPS Монитора. Частота сети
ups_t Данные с UPS Монитора. Температура в корпусе
ups_bat Данные с UPS Монитора. Напряжение батареи.
ups_st Данные с UPS Монитора. Нагрузка
mlx_o Температура объекта MLX90614
mlx_a Температура окружающая MLX90614
vw_t[x][y] Температура с VirtualWire
vw_h[x][y] Влажность с VirtualWire
vw_c[x][y] Счетчики с VirtualWire
vw_a[x][y] АЦП с VirtualWire
vw_b[x][y] Один байт с VirtualWire
hlw_w HLW8012 (Sonoff POW) Мощность
hlw_v HLW8012 (Sonoff POW) Напряжение
hlw_c HLW8012 (Sonoff POW) Ток
hlw_wh() HLW8012 (Sonoff POW) Ватт/ч