Конструктор кода позволяет написать свой модуль на языке Си.
Например добавить свой датчик или алгоритм действий. Перед сборкой прошивкой необходимо сначала написать код.
Конструктор кода не поддерживает архитектуру языка 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() | Уровень сигнала WI-FI |
rfidd | Данные с RFID |