- My React, Express, and Node skills
- Some mobile and desktop apps with react native
- TypeScript
- Laravel
- Next.js
- GraphQL
- Flutter
- Reading books 📖
- Drawing (I suck) 🖌️
- Music 🎶
- Fantasy movies/tv shows/books 🧙🏽♂️🪄
Sistema de sensoriamento genérico usando uma Raspberry Pi, uma ESP8266 e comunicação através do protocolo UART
instalei o edge
habilitei o tap to click no touchpad
instalei o vscode
instalei:
sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python
alterei a path editando ~/.profile
export PATH="$PATH:$HOME/esp/xtensa-lx106-elf/bin"
alterei a path editando ~/.profile
export IDF_PATH="$HOME/esp/ESP8266_RTOS_SDK"
instalei o pip2
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
python2 get-pip.py
instalei:
python -m pip install --user -r $IDF_PATH/requirements.txt
alterado permissões:
sudo usermod -a -G dialout $USER
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#ifndef STASSID
//#define STASSID "INTELBRAS"
//#define STAPSK "Pbl-Sistemas-Digitais"
#define STASSID "Fortaleza Digital"
#define STAPSK "marinfinito314"
#endif
const char* ssid = STASSID;
const char* password = STAPSK;
// Nome do ESP na rede
const char* host = "ESP-10.0.0.109";
// Definições de rede
IPAddress local_IP(10, 0, 0, 109);
IPAddress gateway(10, 0, 0, 1);
IPAddress subnet(255, 255, 0, 0);
void setup() {
Serial.begin(115200);
Serial.println("Booting");
// Configuração do IP fixo no roteador, se não conectado, imprime mensagem de falha
if (!WiFi.config(local_IP, gateway, subnet)) {
Serial.println("STA Failed to configure");
}
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println("Connection Failed! Rebooting...");
delay(5000);
ESP.restart();
}
// Port defaults to 8266
// ArduinoOTA.setPort(8266);
// Hostname defaults to esp8266-[ChipID]
ArduinoOTA.setHostname(host);
// No authentication by default
// ArduinoOTA.setPassword("admin");
// Password can be set with it's md5 value as well
// MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
// ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");
ArduinoOTA.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH) {
type = "sketch";
} else { // U_FS
type = "filesystem";
}
// NOTE: if updating FS this would be the place to unmount FS using FS.end()
Serial.println("Start updating " + type);
});
ArduinoOTA.onEnd([]() {
Serial.println("\nEnd");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("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");
}
});
ArduinoOTA.begin();
Serial.println("Ready");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
//Definindo pinos como entrada
pinMode(5, OUTPUT);
}
int counter = 0;
void loop() {
if (counter % 2 == 0) {
Serial.print("--");
} else {
Serial.print("++");
}
// Faz a leitura
String leitura = Serial.readString();
// Debug
//Serial.printf("\nLido: %s\n", Serial.readString());
if (leitura.length() > 0) {
int comando = leitura.charAt(0);
int endereco = leitura.charAt(1);
Serial.printf("comando: %i\n", comando);
Serial.printf("endereco: %i\n", endereco);
if (comando == 45) {
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
else if (comando == 43) {
Serial.printf("Pino GPIO5: %i", digitalRead(5));
}
else {
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
}
}
counter++;
// Limpa para que não haja ruido na proxima leitura
Serial.readString();
///Serial.flush();
//Serial.flush();
ArduinoOTA.handle();
}
@Timer regressivo que começa com o valor inicial 30 e exibe a contagem no display.
@Este código foi testado em uma Raspberry pi zero W e um display LCD HD44780U.
@Autores : Joanderson Santos, Daniel Santa Rosa e Alexandre Silva Caribé
@Definição das constantes
.equ pagelen, 4096 @ Tamanho da pagina de memoria paginada
.equ setregoffset, 28
.equ clrregoffset, 40
.equ prot_read, 1
.equ prot_write, 2
.equ map_shared, 1
.equ sys_open, 5 @ Numero da syscall para abrir arquivo
.equ sys_map, 192
.equ nano_sleep, 162 @ Numero da syscall para nanosleep
.equ level, 52 @ Offset para o registrador de niveis da GPIO
.equ off, 0
.equ on, 1
@Faz a chamada para o serviço de nanosleep do Linux
@Passa a referência para o timespec nos registradores r0 e r1.
.macro nanoSleep
LDR R0,=timespecsec
LDR R1,=timespecnano
MOV R7, #nano_sleep
SVC 0
.endm
.macro nanoSleep2 time
LDR R0, =\time
LDR R1, =\time
MOV R7, #nano_sleep
SVC 0
.endm
@Faz o mapeamento da memória referente ao endereço base da GPIO
@e move esse valor mapeado para o R8.
.macro MapAddressGPIO
@ opening the file
LDR R0, = fileName
MOV R1, #0x1b0
ORR R1, #0x006
MOV R2, R1
MOV R7, #sys_open
SVC 0
MOVS R4, R0
@ preparing the mapping
LDR R5, =gpioaddr
LDR R5, [R5]
MOV R1, #pagelen
MOV R2, #(prot_read + prot_write)
MOV R3, #map_shared
MOV R0, #0
MOV R7, #sys_map
SVC 0
MOVS R8, R0
.ltorg
.endm
@Seta um valor para um determinado pino da Gpio
.macro SetGpioValue pin, value
@Obtém os valores passados por parâmetro
MOV R1, \value
LDR R3, =\pin
@Verifica se o valor a ser enviado para o pino é 0 ou 1
@Se for zero utiliza o clrregoffset para selecionar o registrador clear (GPCLR0)
@Caso contrário utiliza o setregoffset para selecionar o registrador set (GPSET0)
MOV R2, R8
CMP R1,#0
ADDEQ R2, #clrregoffset
CMP R1,#1
ADDEQ R2, #setregoffset
@Manda o valor do pino no seu bit correspondente para o registrador selecionado acima.
MOV R0, #1
ADD R3, #8
LDR R3, [R3]
LSL R0, R3
STR R0, [R2]
.endm
@Seta um determinado pino da Gpio como output
.macro GPIODirectionOut pin
LDR R2, =\pin @Armazena o endereço referente ao pino que foi passado por parâmetro em R2
LDR R2, [R2] @Armazena o valor do pino citado acima
LDR R1, [R8, R2] @Armazena em R1 o endereço da GPIO base + offset referente ao pino
LDR R3, =\pin @Armazena o endereço referente ao pino que foi passado por parâmetro em R3
ADD R3, #4
LDR R3, [R3]
MOV R0, #0b111 @Move para R0 o valor b111 para realizar o mascaramento de bits
LSL R0, R3
BIC R1, R0 @Faz o clear de 3 bits
MOV R0, #1
LSL R0, R3
ORR R1, R0
STR R1, [R8, R2] @Armazena o valor de R1 com o valor do bit correspondente ao número do pino no endereço base
.endm @da GPIO
@Seta os pinos referentes ao display como output
.macro SetPinsDisplayOut
GPIODirectionOut pinEN
GPIODirectionOut pinRS
GPIODirectionOut pinD7
GPIODirectionOut pinD6
GPIODirectionOut pinD5
GPIODirectionOut pinD4
.ltorg
.endm
@Seta o display para operar em modo de 4 bits
.macro FunctionSet
SetGpioValue pinRS, #off
SetGpioValue pinD7, #off
SetGpioValue pinD6, #off
SetGpioValue pinD5, #on
SetGpioValue pinD4, #off
SetEnable
.ltorg
.endm
@Realiza um pulso de clock para o pino referente ao enable do display
.macro SetEnable
SetGpioValue pinEN, #off
nanoSleep
SetGpioValue pinEN, #on
nanoSleep
SetGpioValue pinEN, #off
.endm
@Liga o display e pisca o cursor
.macro OnDisplay
SetGpioValue pinRS, #off
SetGpioValue pinD7, #off
SetGpioValue pinD6, #off
SetGpioValue pinD5, #off
SetGpioValue pinD4, #off
SetEnable
SetGpioValue pinRS, #off
SetGpioValue pinD7, #on
SetGpioValue pinD6, #on
SetGpioValue pinD5, #on
SetGpioValue pinD4, #on
SetEnable
.endm
@Limpa todos os caracteres do display
.macro ClearDisplay
SetGpioValue pinRS, #off
SetGpioValue pinD7, #off
SetGpioValue pinD6, #off
SetGpioValue pinD5, #off
SetGpioValue pinD4, #off
SetEnable
SetGpioValue pinRS, #off
SetGpioValue pinD7, #off
SetGpioValue pinD6, #off
SetGpioValue pinD5, #off
SetGpioValue pinD4, #on
SetEnable
.endm
@Seta o display em mode de entrada
.macro EntrySetMode
SetGpioValue pinRS, #off
SetGpioValue pinD7, #off
SetGpioValue pinD6, #off
SetGpioValue pinD5, #off
SetGpioValue pinD4, #off
SetEnable
SetGpioValue pinRS, #off
SetGpioValue pinD7, #off
SetGpioValue pinD6, #on
SetGpioValue pinD5, #on
SetGpioValue pinD4, #off
SetEnable
.ltorg
.endm
@Seta os 4 primeiros bits mais significativos referente a um número
@com base na tabela ASCII
@0011
.macro SetUpperBitsDefaultNumber
SetGpioValue pinRS, #on
SetGpioValue pinD7, #off
SetGpioValue pinD6, #off
SetGpioValue pinD5, #on
SetGpioValue pinD4, #on
SetEnable
.endm
@Escreve um determinado número no display
.macro writeDigit value
SetUpperBitsDefaultNumber
SetGpioValue pinRS, #on @Manda nível lógico alto para o pino RS referente ao display
@indicando que ele irá receber um caractere
@O código a seguir obtém os 4 bits menos significativos do valor numérico a ser
@exibido no display, e seta cada bit referente ao pino correspondente do display
@Ex: Obtendo o 4º bit menos significativo do valor 9
@MOV R2,#1 -> 0000..., 0001
@LSL R2,#3 -> 0000..., 1000
@AND R1,R2,\value
@0000..., 1000
@0000..., 1001
@0000..., 1000
@LSR R1,#3 ->0000..., 0001
@SetGpioValue pinD7, R1 -> pinD7 = 1
MOV R2,#1
LSL R2,#3
AND R1,R2,\value
LSR R1,#3
SetGpioValue pinD7, R1
MOV R2,#1
LSL R2,#2
AND R1,R2,\value
LSR R1,#2
SetGpioValue pinD6, R1
MOV R2,#1
LSL R2,#1
AND R1,R2,\value
LSR R1,#1
SetGpioValue pinD5, R1
MOV R2,#1
AND R1,R2,\value
SetGpioValue pinD4, R1
SetEnable
.ltorg
.endm
@Escreve um caractere qualquer no display, dado seu valor, este referente a tabela ASCII
.global write_char
write_char:
push {lr}
MOV R6, R0
SetGpioValue pinRS, #on
MOV R2,#1
LSL R2,#7
AND R1,R2, R6
LSR R1,#7
SetGpioValue pinD7, R1
MOV R2,#1
LSL R2,#6
AND R1,R2,R6
LSR R1,#6
SetGpioValue pinD6, R1
MOV R2,#1
LSL R2,#5
AND R1,R2,R6
LSR R1,#5
SetGpioValue pinD5, R1
MOV R2,#1
LSL R2,#4
AND R1,R2,R6
LSR R1,#4
SetGpioValue pinD4, R1
SetEnable
SetGpioValue pinRS, #on
MOV R2,#1
LSL R2,#3
AND R1,R2,R6
LSR R1,#3
SetGpioValue pinD7, R1
MOV R2,#1
LSL R2,#2
AND R1,R2,R6
LSR R1,#2
SetGpioValue pinD6, R1
MOV R2,#1
LSL R2,#1
AND R1,R2,R6
LSR R1,#1
SetGpioValue pinD5, R1
MOV R2,#1
AND R1,R2,R6
SetGpioValue pinD4, R1
SetEnable
pop {pc}
@Inicia o display
.global init_display
init_display:
push {lr}
MapAddressGPIO
SetPinsDisplayOut
ClearDisplay
FunctionSet
FunctionSet
FunctionSet
OnDisplay
EntrySetMode
pop {pc}
@ Definição das variáveis
.data
@Definição dos valores referentes aos times
time1s:
.word 1
.word 000000000
time100ms:
.word 0
.word 100000000
timespecsec: .word 0
timespecnano: .word 015000000
@Definição do nome do arquivo para realizar o mapeamento da memória
@e o endereço base da GPIO
fileName: .asciz "/dev/mem"
gpioaddr: .word 0x20200
@Definição dos valores dos pinos referentes ao display
pinD4: @Valor do pino na GPIO -> 12
.word 4 @Offset para selecionar o registrador de função (GPFSEL1)
.word 6 @Bit offset referente ao pino no registrador selecionado
.word 12 @Bit offset referente ao pino no registrador set e clr (GPSET0) e (GPCLR0)
pinD5: @Valor do pino na GPIO -> 16
.word 4
.word 18
.word 16
pinD6: @Valor do pino na GPIO -> 20
.word 8
.word 0
.word 20
pinD7: @Valor do pino na GPIO -> 21
.word 8
.word 3
.word 21
pinRS: @Valor do pino na GPIO -> 25
.word 8
.word 15
.word 25
pinEN: @Valor do pino na GPIO -> 1
.word 0
.word 3
.word 1
#include <stdio.h>
#include <string.h>
enum sensor_type { Undefined, Analogic, Digital };
struct sensor_data {
char name[17];
char default_name[2];
char description[255];
int value;
int id;
enum sensor_type type;
};
typedef struct sensor_data Sensor;
/**
* Lê uma string e salva o valor como o nome do
* Sensor recebido como argumento. O tamanho
* maximo da string é de 16 caracteres; (exeto \0).
*/
void get_sensor_name(Sensor *s) {
char v[255];
gets(v);
int length = (int) strlen(v);
for (int i = 0; i < length && i < 16; i++) {
s->name[i] = v[i];
}
s->name[length] = "\0";
}
/**
* Lê uma string e salva o valor como o nome do
* Sensor recebido como argumento. O tamanho
* maximo da string é de 16 caracteres; (exeto \0).
*/
void get_sensor_description(Sensor *s) {
char v[255];
gets(v);
int length = (int) strlen(v);
for (int i = 0; i < length && i < 254; i++) {
s->description[i] = v[i];
}
s->description[length] = "\0";
}
void readSerialBytes(char v[100]) {
static unsigned char bu[100] = "LDDsdjf laksdjf çalsdkf";
for (int i = 0; i < strlen(bu) && i < 100; i++) {
v[i] = bu[i];
}
v[strlen(bu)] = "\0";
}
void readID(char v[100]) {
static unsigned char bu[100] = "0�Dsdjf laksdjf çalsdkf";
for (int i = 0; i < strlen(bu) && i < 100; i++) {
v[i] = bu[i];
}
v[strlen(bu)] = "\0";
}
void readqt(char v[100]) {
static unsigned char bu[100] = "02Dsdjf laksdjf çalsdkf";
for (int i = 0; i < strlen(bu) && i < 100; i++) {
v[i] = bu[i];
}
v[strlen(bu)] = "\0";
}
int get_number_of_sensors() {
char aux[100];
readqt(aux);
int response_lenght = strlen(aux);
if (response_lenght < 2) {
return -1;
}
char val[] = "00";
val[0] = aux[0];
val[1] = aux[1];
return atoi(val);
}
int get_sensor_id(int sensor_index) {
// sendo comando S3
sleep(0.01);
char aux[100];
readID(aux);
int response_lenght = strlen(aux);
if (response_lenght < 2) {
return -1;
}
return (int) aux[1];
}
int get_sensor_default_name(int sensor_id, char n[2]) {
// sendo N sensor id
char aux[100];
readSerialBytes(aux);
int response_lenght = strlen(aux);
if (response_lenght < 2) {
return -1;
}
n[0] = aux[0];
n[1] = aux[1];
return 0;
}
int command_to_int(char a, char b) {
int val = a;
val = val << 8;
return val | b;
}
void readSeriaval(char v[100]) {
static unsigned char bu[100] = "LDDsdjf laksdjf çalsdkf";
int total = 1024;
char a = total >> 8;
char b = total;
bu[0] = a;
bu[1] = b;
for (int i = 0; i < strlen(bu) && i < 100; i++) {
v[i] = bu[i];
}
v[strlen(bu)] = "\0";
}
int get_analogic_val(int sensor_id) {
// sendo N sensor id
char aux[100];
readSeriaval(aux);
int response_lenght = strlen(aux);
if (response_lenght < 2) {
return -1;
}
return command_to_int(aux[0], aux[1]);
}
void configure_sensors(Sensor sensores_digitais[31], int quantidade_sensores_digitais) {
for (int i = 0; i < quantidade_sensores_digitais; i++) {
sensores_digitais[i].type = Digital;
sensores_digitais[i].id = get_sensor_id(i);
get_sensor_default_name(sensores_digitais[i].id, sensores_digitais[i].default_name);
printf("Nome: %s\nid: %i\ntipo: %i\n", sensores_digitais[i].default_name, sensores_digitais[i].id, sensores_digitais[i].type);
// iguala nome ao nome padraõ
sensores_digitais[i].name[0] = sensores_digitais[i].default_name[0];
sensores_digitais[i].name[1] = sensores_digitais[i].default_name[1];
}
}
int print_selection_menu(int quantidade_sensores_digitais, Sensor sensor[]) {
printf("Selecione o numero da porta onde há um sensor digita: l\n\n");
for (int i = 0; i < quantidade_sensores_digitais; i++) {
printf("%i - %s\n", i + 1, sensor[i].default_name);
}
printf("%i - %s\n", quantidade_sensores_digitais + 1, "Não adicionar mais sensores");
printf("Digite o numero da opção: ");
char s[31];
gets(s);
int selected = atoi(s);
if (selected < 1 || selected > quantidade_sensores_digitais + 2) {
return -1;
}
return selected;
}
int main() {
Sensor sensores_digitais[31];
int quantidade_sensores_digitais = 0;
// recebe da node a quantidade de sensores digitais disponiveis
quantidade_sensores_digitais = get_number_of_sensors();
// dada a quantidade de sensores, solicita ao node mscu, o nome
// da entrada (D1, D2, D3) onde se pode ligar o sensor, o endereço
// e o tipo como digitais
configure_sensors(sensores_digitais, quantidade_sensores_digitais);
int qt_sensores_adicionaods = 0;
// adicionar sensores digitais
while(1) {
int opcao = print_selection_menu(quantidade_sensores_digitais, sensores_digitais);
if (opcao != -1 && opcao < quantidade_sensores_digitais + 1 && opcao > 0) {
printf("Digite o nome do sensor. Se deseja manter o padrão, apenas aperte entrer\n");
printf("Nome: ");
get_sensor_name(&sensores_digitais[opcao - 1]);
//increementa a quantidade de sensores adicionados
qt_sensores_adicionaods++;
} else if (opcao == quantidade_sensores_digitais + 1) {
// termina a selecçãõ de sendores
break;
}
}
quantidade_sensores_digitais = qt_sensores_adicionaods;
// lendo valores
for (int i = 0; i < quantidade_sensores_digitais; i++) {
sensores_digitais[i].value = get_analogic_val(sensores_digitais[i].id);
//printf("\nNome: %s\nid: %i\ntipo: %i\nvalor: %i\n", sensores_digitais[i].name, sensores_digitais[i].id, sensores_digitais[i].type, sensores_digitais[i].value);
}
// printando os sensodres
for (int i = 0; i < quantidade_sensores_digitais; i++) {
printf("\nNome: %s\nid: %i\ntipo: %i\nvalor: %i\n", sensores_digitais[i].name, sensores_digitais[i].id, sensores_digitais[i].type, sensores_digitais[i].value);
}
/*printf("number of sensors: %i\n", get_sensor_id(1));
printf("Valor antes: %s\n\n", sensors[0].name);
get_sensor_name(&sensors[0]);
get_sensor_description(&sensors[0]);
printf("Valor depois: %s\n\n", sensors[0].name);
printf("des depois: %s\n\n", sensors[0].description);
char ler[100];
readSerialBytes(ler);
printf("\nLEEEER: %s\n", ler);*/
printf("\n\nNenhum sensor adicionado para leitura!!");
return 0;
}
Projeto de sensor analógico/digital em microcontrolador utilizando comunicação serial.
Implementando de um protótipo de sistema de sensoriamento genérico de uma plataforma baseada na NodeMCU para confecção das unidades de sensoriamento modular comandado por um Single Board Computer (SBC), capaz de controlar o acionamento de um conjunto variável de sensores, assim como monitorar o seu funcionamento, de forma automatizada por meio de uma comunicação UART
Abaixo segue o que foi utilizado na criação deste projeto:
Para conseguir rodar o projeto, siga os passos abaixo.
Antes de seguirmos, é preciso que você tenha o ambiente configurado para criar e testar aplicações em C.
No ambiente da SBC (considerando a Raspberry Pi rodando um sistema baseado no Debian) caso não tenha o tooling to GCC, execute:
$ sudo apt install build-essential
https://arduino.esp8266.com/stable/package_esp8266com_index.json
A estrutura de arquivos está da seguinte maneira:
ESP8266_ES
├── NodeMCU/
│ ├── NodeMCU.cpp
├── Raspberry/
│ ├── display.h
│ ├── makefile
│ ├── display.o
│ └── main.c
├── .gitignore
└── README.md
Serão explicados os arquivos e diretórios na seção de Edição.
$ git clone https://github.com/DanielSRS/ESP8266_ES
$ cd ESP8266_ES
$ cd Raspberry
$ make all
$ make run
Nesta seção haverão instruções caso você queira editar o projeto, explicando para que os diretórios são utilizados e também os arquivos de configuração.
NodeMCU - Após execução do projeto, o analizador léxico irá gerar arquivos de saída neste diretório contendo as informações processadas em cada arquivo de entrada.
Raspberry - Diretório contendo todos os arquivos da aplicação executada na SBC (Raspberry Pi),
main.c - Codigo da aplicação executada na SBC e responsável pelo controle da NodeMCU enviando comandos, lendo e exibindo as informações coletadas.
makefile - Arquivo de configuração makefile com as instruções de build do projeto.
display.h - Arquivo de cabeçalho da biblioteca de comunicação com o display 16x2.
display.o - Biblioteca para comunicação com o display 16x2.
.gitignore - Arquivo de configurção do git contendo informções de arquivos que não devem ser versionados junto com o codigo fonte;
README.md - Este arquivo. Aqui é feito a documentação basica do projeto com instruções de instalação, configuração e execução.
Ainda no diretório raiz, navegue para o diretorio Raspberry:
$ cd Raspberry
Faça o build da aplicação
$ make all
Faça o build e rode a aplicação
$ make run
Execute manualmente a aplicação informando o sensor analógico e dois digitais conectados
$ sudo ./Rasp -analogic -d."D0".16 -d."D1".5
Ou liste as portas digitais disponíveis
$ sudo ./Rasp -l
ESP8266 Arduino Core Documentation
Documentação de Referência da Linguagem Arduino
CONFIG_IDF_TARGET_ESP8266=y
CONFIG_IDF_TARGET="esp8266"
CONFIG_SDK_TOOLPREFIX="xtensa-lx106-elf-"
CONFIG_SDK_PYTHON="python"
CONFIG_BOOTLOADER_INIT_SPI_FLASH=y
CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y
CONFIG_LOG_BOOTLOADER_LEVEL=3
CONFIG_BOOTLOADER_STORE_OFFSET=0x0
CONFIG_ESPTOOLPY_PORT="/dev/ttyUSB0"
CONFIG_ESPTOOLPY_BAUD_115200B=y
CONFIG_ESPTOOLPY_BAUD_OTHER_VAL=115200
CONFIG_ESPTOOLPY_BAUD=115200
CONFIG_ESPTOOLPY_COMPRESSED=y
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
CONFIG_ESPTOOLPY_FLASHMODE="dio"
CONFIG_SPI_FLASH_MODE=0x0
CONFIG_ESPTOOLPY_FLASHFREQ_40M=y
CONFIG_ESPTOOLPY_FLASHFREQ="40m"
CONFIG_SPI_FLASH_FREQ=0x0
CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y
CONFIG_ESPTOOLPY_FLASHSIZE="2MB"
CONFIG_SPI_FLASH_SIZE=0x200000
CONFIG_ESPTOOLPY_BEFORE_RESET=y
CONFIG_ESPTOOLPY_BEFORE="default_reset"
CONFIG_ESPTOOLPY_AFTER_HARD_RESET=y
CONFIG_ESPTOOLPY_AFTER="hard_reset"
CONFIG_ESPTOOLPY_MONITOR_BAUD_74880B=y
CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER_VAL=74880
CONFIG_ESPTOOLPY_MONITOR_BAUD=74880
CONFIG_PARTITION_TABLE_SINGLE_APP=y
CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv"
CONFIG_PARTITION_TABLE_OFFSET=0x8000
CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp.csv"
CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y
CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y
CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y
CONFIG_APP_UPDATE_CHECK_APP_SUM=y
CONFIG_APP_COMPILE_TIME_DATE=y
CONFIG_ESP_TLS_USING_MBEDTLS=y
CONFIG_ESP8266_NMI_WDT=y
CONFIG_ESP8266_XTAL_FREQ_26=y
CONFIG_ESP8266_XTAL_FREQ=26
CONFIG_ESP8266_DEFAULT_CPU_FREQ_160=y
CONFIG_ESP8266_DEFAULT_CPU_FREQ_MHZ=160
CONFIG_ESP_FILENAME_MACRO_NO_PATH=y
CONFIG_USING_NEW_ETS_VPRINTF=y
CONFIG_ETS_PRINTF_EXIT_WHEN_FLASH_RW=y
CONFIG_SOC_IRAM_SIZE=0xC000
CONFIG_ESP_PANIC_PRINT_REBOOT=y
CONFIG_RESET_REASON=y
CONFIG_WIFI_PPT_TASKSTACK_SIZE=5120
CONFIG_ESP8266_CORE_GLOBAL_DATA_LINK_IRAM=y
CONFIG_ESP8266_TIME_SYSCALL_USE_FRC1=y
CONFIG_SCAN_AP_MAX=99
CONFIG_WIFI_TX_RATE_SEQUENCE_FROM_HIGH=y
CONFIG_ESP8266_WIFI_RX_BUFFER_NUM=16
CONFIG_ESP8266_WIFI_LEFT_CONTINUOUS_RX_BUFFER_NUM=16
CONFIG_ESP8266_WIFI_RX_PKT_NUM=7
CONFIG_ESP8266_WIFI_TX_PKT_NUM=6
CONFIG_ESP8266_WIFI_NVS_ENABLED=y
CONFIG_ESP8266_WIFI_CONNECT_OPEN_ROUTER_WHEN_PWD_IS_SET=y
CONFIG_ESP8266_WIFI_ENABLE_WPA3_SAE=y
CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y
CONFIG_ESP_PHY_INIT_DATA_VDD33_CONST=33
CONFIG_ESP8266_PHY_MAX_WIFI_TX_POWER=20
CONFIG_ESP_ERR_TO_NAME_LOOKUP=y
CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32
CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2048
CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584
CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584
CONFIG_ESP_CONSOLE_UART_DEFAULT=y
CONFIG_ESP_CONSOLE_UART_NUM=0
CONFIG_ESP_CONSOLE_UART_BAUDRATE=74880
CONFIG_ESP_TASK_WDT=y
CONFIG_ESP_TASK_WDT_PANIC=y
CONFIG_ESP_TASK_WDT_TIMEOUT_15N=y
CONFIG_ESP_TASK_WDT_TIMEOUT_S=15
CONFIG_ESP_EVENT_POST_FROM_ISR=y
CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y
CONFIG_HTTP_BUF_SIZE=512
CONFIG_HTTPD_MAX_REQ_HDR_LEN=512
CONFIG_HTTPD_MAX_URI_LEN=512
CONFIG_OTA_BUF_SIZE=256
CONFIG_FATFS_CODEPAGE_437=y
CONFIG_FATFS_CODEPAGE=437
CONFIG_FATFS_LFN_NONE=y
CONFIG_FATFS_FS_LOCK=0
CONFIG_FATFS_TIMEOUT_MS=10000
CONFIG_FATFS_PER_FILE_CACHE=y
CONFIG_FMB_COMM_MODE_TCP_EN=y
CONFIG_FMB_TCP_PORT_DEFAULT=502
CONFIG_FMB_TCP_PORT_MAX_CONN=5
CONFIG_FMB_TCP_CONNECTION_TOUT_SEC=20
CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND=150
CONFIG_FMB_MASTER_DELAY_MS_CONVERT=200
CONFIG_FMB_QUEUE_LENGTH=20
CONFIG_FMB_PORT_TASK_STACK_SIZE=4096
CONFIG_FMB_SERIAL_BUF_SIZE=256
CONFIG_FMB_PORT_TASK_PRIO=10
CONFIG_FMB_CONTROLLER_SLAVE_ID_SUPPORT=y
CONFIG_FMB_CONTROLLER_SLAVE_ID=0x00112233
CONFIG_FMB_CONTROLLER_NOTIFY_TIMEOUT=20
CONFIG_FMB_CONTROLLER_NOTIFY_QUEUE_SIZE=20
CONFIG_FMB_CONTROLLER_STACK_SIZE=4096
CONFIG_FMB_EVENT_QUEUE_TIMEOUT=20
CONFIG_FMB_TIMER_GROUP=0
CONFIG_FMB_TIMER_INDEX=0
CONFIG_FREERTOS_UNICORE=y
CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF
CONFIG_FREERTOS_HZ=100
CONFIG_FREERTOS_MAX_HOOK=2
CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1024
CONFIG_FREERTOS_ISR_STACKSIZE=512
CONFIG_FREERTOS_GLOBAL_DATA_LINK_IRAM=y
CONFIG_FREERTOS_TIMER_STACKSIZE=2048
CONFIG_TASK_SWITCH_FASTER=y
CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK=y
CONFIG_LIBSODIUM_USE_MBEDTLS_SHA=y
CONFIG_LOG_DEFAULT_LEVEL_INFO=y
CONFIG_LOG_DEFAULT_LEVEL=3
CONFIG_LOG_COLORS=y
CONFIG_LWIP_LOCAL_HOSTNAME="espressif"
CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y
CONFIG_LWIP_TIMERS_ONDEMAND=y
CONFIG_LWIP_MAX_SOCKETS=10
CONFIG_LWIP_SO_REUSE=y
CONFIG_LWIP_SO_REUSE_RXTOALL=y
CONFIG_LWIP_IP4_FRAG=y
CONFIG_LWIP_IP6_FRAG=y
CONFIG_LWIP_ESP_GRATUITOUS_ARP=y
CONFIG_LWIP_GARP_TMR_INTERVAL=60
CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32
CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y
CONFIG_LWIP_DHCPS_LEASE_UNIT=60
CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8
CONFIG_LWIP_NETIF_LOOPBACK=y
CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8
CONFIG_LWIP_MAX_ACTIVE_TCP=16
CONFIG_LWIP_MAX_LISTENING_TCP=16
CONFIG_LWIP_TCP_MAXRTX=12
CONFIG_LWIP_TCP_SYNMAXRTX=6
CONFIG_LWIP_TCP_MSS=1440
CONFIG_LWIP_TCP_TMR_INTERVAL=250
CONFIG_LWIP_TCP_MSL=60000
CONFIG_LWIP_TCP_SND_BUF_DEFAULT=2880
CONFIG_LWIP_TCP_WND_DEFAULT=5760
CONFIG_LWIP_TCP_RECVMBOX_SIZE=6
CONFIG_LWIP_TCP_QUEUE_OOSEQ=y
CONFIG_LWIP_TCP_OVERSIZE_MSS=y
CONFIG_LWIP_TCP_RTO_TIME=3000
CONFIG_LWIP_MAX_UDP_PCBS=16
CONFIG_LWIP_UDP_RECVMBOX_SIZE=6
CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=2048
CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y
CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF
CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3
CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5
CONFIG_LWIP_MAX_RAW_PCBS=16
CONFIG_LWIP_DHCP_MAX_NTP_SERVERS=1
CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000
CONFIG_LWIP_ESP_LWIP_ASSERT=y
CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y
CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y
CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384
CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096
CONFIG_MBEDTLS_HAVE_TIME=y
CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y
CONFIG_MBEDTLS_TLS_SERVER=y
CONFIG_MBEDTLS_TLS_CLIENT=y
CONFIG_MBEDTLS_TLS_ENABLED=y
CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y
CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA=y
CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y
CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y
CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y
CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y
CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y
CONFIG_MBEDTLS_SSL_RENEGOTIATION=y
CONFIG_MBEDTLS_SSL_PROTO_TLS1=y
CONFIG_MBEDTLS_SSL_PROTO_TLS1_1=y
CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y
CONFIG_MBEDTLS_SSL_ALPN=y
CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y
CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y
CONFIG_MBEDTLS_AES_C=y
CONFIG_MBEDTLS_RC4_DISABLED=y
CONFIG_MBEDTLS_CCM_C=y
CONFIG_MBEDTLS_GCM_C=y
CONFIG_MBEDTLS_PEM_PARSE_C=y
CONFIG_MBEDTLS_PEM_WRITE_C=y
CONFIG_MBEDTLS_X509_CRL_PARSE_C=y
CONFIG_MBEDTLS_X509_CSR_PARSE_C=y
CONFIG_MBEDTLS_ECP_C=y
CONFIG_MBEDTLS_ECDH_C=y
CONFIG_MBEDTLS_ECDSA_C=y
CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y
CONFIG_MBEDTLS_ECP_NIST_OPTIM=y
CONFIG_ESP_AES=y
CONFIG_ESP_MD5=y
CONFIG_ESP_ARC4=y
CONFIG_MQTT_PROTOCOL_311=y
CONFIG_MQTT_TRANSPORT_SSL=y
CONFIG_MQTT_TRANSPORT_WEBSOCKET=y
CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y
CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y
CONFIG_NEWLIB_NANO_FORMAT=y
CONFIG_OPENSSL_ASSERT_DO_NOTHING=y
CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5
CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072
CONFIG_PTHREAD_STACK_MIN=768
CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread"
CONFIG_SPIFFS_MAX_PARTITIONS=3
CONFIG_SPIFFS_CACHE=y
CONFIG_SPIFFS_CACHE_WR=y
CONFIG_SPIFFS_PAGE_CHECK=y
CONFIG_SPIFFS_GC_MAX_RUNS=10
CONFIG_SPIFFS_PAGE_SIZE=256
CONFIG_SPIFFS_OBJ_NAME_LEN=32
CONFIG_SPIFFS_USE_MAGIC=y
CONFIG_SPIFFS_USE_MAGIC_LENGTH=y
CONFIG_SPIFFS_META_LENGTH=4
CONFIG_SPIFFS_USE_MTIME=y
CONFIG_IP_LOST_TIMER_INTERVAL=120
CONFIG_TCPIP_ADAPTER_GLOBAL_DATA_LINK_IRAM=y
CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y
CONFIG_VFS_SUPPORT_TERMIOS=y
CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1
CONFIG_SEMIHOSTFS_HOST_PATH_MAX_LEN=128
CONFIG_WL_SECTOR_SIZE_4096=y
CONFIG_WL_SECTOR_SIZE=4096
CONFIG_LTM_FAST=y
CONFIG_WPA_MBEDTLS_CRYPTO=y
CONFIG_TARGET_PLATFORM="esp8266"
CONFIG_TOOLPREFIX="xtensa-lx106-elf-"
CONFIG_FLASHMODE_QIO=y
CONFIG_MONITOR_BAUD_74880B=y
CONFIG_MONITOR_BAUD_OTHER_VAL=74880
CONFIG_MONITOR_BAUD=74880
CONFIG_OPTIMIZATION_LEVEL_DEBUG=y
CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y
CONFIG_STACK_CHECK_NONE=y
CONFIG_MAIN_TASK_STACK_SIZE=3584
CONFIG_CONSOLE_UART_DEFAULT=y
CONFIG_CONSOLE_UART_NUM=0
CONFIG_CONSOLE_UART_BAUDRATE=74880
CONFIG_TASK_WDT=y
CONFIG_TASK_WDT_PANIC=y
CONFIG_TASK_WDT_TIMEOUT_S=15
CONFIG_MB_MASTER_TIMEOUT_MS_RESPOND=150
CONFIG_MB_MASTER_DELAY_MS_CONVERT=200
CONFIG_MB_QUEUE_LENGTH=20
CONFIG_MB_SERIAL_TASK_STACK_SIZE=4096
CONFIG_MB_SERIAL_BUF_SIZE=256
CONFIG_MB_SERIAL_TASK_PRIO=10
CONFIG_MB_CONTROLLER_SLAVE_ID_SUPPORT=y
CONFIG_MB_CONTROLLER_SLAVE_ID=0x00112233
CONFIG_MB_CONTROLLER_NOTIFY_TIMEOUT=20
CONFIG_MB_CONTROLLER_NOTIFY_QUEUE_SIZE=20
CONFIG_MB_CONTROLLER_STACK_SIZE=4096
CONFIG_MB_EVENT_QUEUE_TIMEOUT=20
CONFIG_MB_TIMER_GROUP=0
CONFIG_MB_TIMER_INDEX=0
CONFIG_ESP_GRATUITOUS_ARP=y
CONFIG_GARP_TMR_INTERVAL=60
CONFIG_TCPIP_RECVMBOX_SIZE=32
CONFIG_TCP_MAXRTX=12
CONFIG_TCP_SYNMAXRTX=6
CONFIG_TCP_MSS=1440
CONFIG_TCP_MSL=60000
CONFIG_TCP_SND_BUF_DEFAULT=2880
CONFIG_TCP_WND_DEFAULT=5760
CONFIG_TCP_RECVMBOX_SIZE=6
CONFIG_TCP_QUEUE_OOSEQ=y
CONFIG_TCP_OVERSIZE_MSS=y
CONFIG_UDP_RECVMBOX_SIZE=6
CONFIG_TCPIP_TASK_STACK_SIZE=2048
CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y
CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF
CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5
CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072
CONFIG_ESP32_PTHREAD_STACK_MIN=768
CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread"
CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y
CONFIG_SUPPORT_TERMIOS=y
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.