Конструктор кода позволяет написать свой модуль на языке Си.
Например добавить свой датчик или алгоритм действий. Перед сборкой прошивкой необходимо сначала написать код.
Конструктор кода не поддерживает архитектуру языка 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"); // вывод данных на главной модуля }
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 -однократно.
void runtask(){
while (1) { // задача в цикле
delay(100); // пауза в цикле нужна, если задача долгосрочная или требуется замедление задачи
if(условие) break; // заканчиваем цикл и задачу
}
vTaskDelete(NULL); // вырубаем задачу
}
// создаем задачу (добавляем строку в startfunc:
xTaskCreate(runtask, "runtask1", 2048, NULL, 5, NULL); // 2048 - размер буфера
Отправляем данные:
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.
Позволяет вывести свои переменные во ВСЕ системы модуля. Переменная появляется на вкладке 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) Ватт/ч |