發表文章

目前顯示的是有「ESP8266」標籤的文章

ESP8266_RTOS - WIFI篇(2) station 模式

前言    station模式為WIFI設備中很重要的功能,station與AP的差異在上一篇比較過了,直接看程式碼 程式碼 主程式 void app_main() { ESP_ERROR_CHECK(nvs_flash_init()); ESP_LOGI(TAG, "ESP_WIFI_MODE_STA" ); wifi_init_sta(); } station 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 void wifi_init_sta ( void ) { s_wifi_event_group = xEventGroupCreate(); tcpip_adapter_init(); ESP_ERROR_CHECK(esp_event_loop_create_default()); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init( & cfg)); ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, & event_handler, NULL )); ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, & event_handler, NULL )); wifi_config_t wifi_config = { .sta = { .ssid = EXAMPLE_ESP_WIFI_SSID, .password = EXAMPLE_ESP_WIFI_PASS },...

ESP8266_RTOS - WIFI篇(1) softAP

前言     softAP為WIFI模組最主要的功能之一,任何wifi產品通常都是由AP模式開始 AP模式與STATION模式簡單的區分就是: AP模式: 當ESP8266為AP模式,可以把他想像成喔個WIFI路由器,啟用時會有一個WIFI名稱,讓裝置(手機/電腦/其他設備)可以連線,連上的裝置,ESP8266就會分配一組虛擬IP給設備(通常都是192.168.x.x)。 STATION模式: 當ESP8266為station模式,就是去連AP的角色,連上後會得到一組虛擬IP AP+STATIO模式 :此模式為上述兩種的結合,使用時機通常為透過其他設備來讓ESP8266連線到其他WIFIAP 程式碼  程式碼為ESP8266_RTOS_SDK中的example,在此做個筆記 主程式 1 2 3 4 5 6 7 void app_main () { ESP_ERROR_CHECK(nvs_flash_init()); ESP_LOGI(TAG, "ESP_WIFI_MODE_AP" ); wifi_init_softap(); } ncs_flash_init()為出數默認的nvs區塊,wifi_Init_softap()為AP模式的重要副函示 副函示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 void wifi_init_softap () { tcpip_adapter_init(); ESP_ERROR_CHECK(esp_event_loop_create_default()); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init( & cfg)); //wifi初始化 ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, & wifi_event_handler, NULL )); wif...

ESP8266_RTOS - 儲存篇(3) spiffs文件系統

前言   spiffs是一個用於SPI NOR FLAH設備的文件系統,支持磨損均衡與文件系統一致的功能。 雖然是文件系統,不過目前不支持目錄 程式碼 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 void app_main ( void ) { ESP_LOGI(TAG, "Initializing SPIFFS" ); esp_vfs_spiffs_conf_t conf = { .base_path = "/spiffs" , .partition_label = NULL , .max_files = 5 , .format_if_mount_failed = true }; // Use settings defined above to initialize and mount SPIFFS filesystem. // Note: esp_vfs_spiffs_register is an all-in-one convenience function. esp_err_t ret = esp_vfs_spiffs_register( & conf); if (ret != ESP_OK) { if (ret == ESP_FAIL) { ESP_LOGE(TAG, "Failed to mount or format filesystem" ); } else if (ret == ESP_ERR_NOT_FOUND) { ...

ESP8266_RTOS - 儲存篇(2) nvs 操作 nvs_set&vs_get

前言 Non-volatile storage(NVS) NVS庫主要用於在flash中儲存鑑值格式的數據,NVS也是基於flash(read/write/erase)做的處理 詳情請看官方文檔: 文檔 程式碼 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 void nvs_write_data_to_flash ( void ) { nvs_handle handle; static const char * NVS_CUSTOMER = "date1" ; static const char * DATA1 = "param1" ; static const char * DATA2 = "param2" ; static const char * DATA3 = "param3" ; int32_t value_for_store = 666 ; wifi_config_t wifi_config_to_store = { .sta = { .ssid = "ssid:hello_YEE" , .password = "password:12345678" , }, }; printf( "set size:%u \r\n " , sizeof (wifi_config_to_store)); ESP_ERROR_CHECK( nvs_open( NVS_CUSTOMER, NVS_READWRITE, & handle) ); ESP_ERROR_CHECK( nvs_set_str( handle, DATA1, "i am a string." ) ); ESP_ERROR_CHECK( nvs_set_i32( handle, DATA2, value...

ESP8266_RTOS - 儲存篇(1) spi_flash_write& spi_flash_read

圖片
   前言      要做一個專案,儲存是一個很重要的功能,目前據我所了解的,ESP8266有3種方式可以用: 直接寫入flash nvs spiffs 此篇為flash的讀寫筆記 正文 可以看到有三個函式可以用,分別為: spi_flash_erase_sector spi_flash_write spi_flash_read 要注意的是flash的使用,是以 4K 為一個單位進行讀寫 程式碼 用結構(struct)儲存在flash #include <esp_spi_flash.h> //一定要加 ================= 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 static void setup_tests () { if (start == 0 ) { start = 0x7C * 4 * 1024 ; printf( "Test data partition @ 0x%x \n " , start); } } typedef struct test{ int a; int b; }TT; void test () { setup_tests(); spi_flash_erase_sector(start); TT tet = { .a = 123 , .b = 666 }; ESP_ERROR_CHECK(spi_flash_write(start,( uint8_t * ) & tet, sizeof ( struct test))); TT read = { 0 }; ESP_ERROR_CHECK(spi_flash_read(start,( uint8_t * ) & read, sizeof ( struct test))); } --------------------------- 上述程式碼中,第23行與26行中  ( uint8_t * )一定要加,不加會crash!!

ESP8266_RTOS - UART 篇 將log改到uart1

圖片
    此篇為筆記如何將esplog訊息從默認的uart0換到uart1     下圖可以看到esp8266有兩組uart,分別是uart0跟uart1 腳位分別為        -UART0: GPIO1(U0TXD) GPIO3(U0RXD)      -UART1: GPIO2(U1TXD) 也就是說另一組UART是沒有rx功能的,拿來當LOG剛剛好 設定步驟 make menuconfig  --> Component config --> Common ESP-related --> UART for console output(Defauot:UART0,TX=GPIO1,TX=GPIO3)  --> 改成CUSTOM UART periphera to use for console output(0-1)(UART0)  --> 改成UART1 設定baud rate: (74880)UART console baud rate  --> 改成自己要的baud rate   即可完成

ESP8266_RTOS -使用esp-idf下,新增子資料夾的步驟

圖片
   專案開始前先做一些準備會更方便,寫專案一定有一個需求就是用不同的資料夾將眾多.c檔功能或需求分開放,方便閱讀與維護。     由於CMAKE並沒有很熟,閱讀官方文章與摸索後才將其完成,在這裡小小做個筆記  -官方文章    需要修改的文件就是 CMakeLists.txt、component.mk以及 ESP8266_RTOS_SDK/make/project.mk 這幾個資料夾內的參數 --------------------------------------------------------------------------------- 先將hello_world專案從examples中拉到ESP8266_RTOS_SDK中: 在hello_world中新增一個資料夾 test 新增檔案: -新增test.c -新增資料夾inc,在inc下新增一個test.h -從資料夾main中複製 CMakeLists.txt與component.mk         -新增test.c與test.h內容      用記事本打開component.mk -加上此段   COMPONENT_ADD_INCLUDEDIRS += inc  打開 ESP8266_RTOS_SDK/make/project.mk -找到 COMPONENT_DIRS -後面加上  $(PROJECT_PATH)/test        打開CMakeLists.txt -set(COMPONENT_ADD_INCLDEDIRS include inc) -------------------------------------------------------------------------------------------- 到此步驟,準備就緒 準備build c...

ESP8266 RTOS 環境架設

圖片
        最近重新接觸ESP8266,之前是永AiThinker架設好的 eclipse環境編譯,雖然方便可是SDK太舊,升級SDK也很麻煩,到官網看一下發現有新的環境可以使用(ESP-EDF)與ESP8266_RTOS SDK。 1.先下載 MSYS32     -官方提供的載點: 連結 (下面範例將msys32放在C:\) 2.下載 toolcahin:      - 載點 (xtensa-lx106-elf)     -如果SDK低於3.0版         - 載點 (xtensa-lx106-elf) 3.打開 c:\msys32\mingw32.exe 4.創建一個資料夾"esp":      - mkdir -p ~/esp       -進到資料夾          -cd esp 5.Get ESP8266_RTOS_SDK     -git clone  --recursive https://github.com/espressif/ESP8266_RTOS_SDK.git    ESP8266_RTOS_SDK 會下載到 ~/esp/ESP8266_RTOS_SDK中 5.設定路徑 IDF_PATH:    - export IDF_PATH="D:/msys32/home/f4568/esp/ESP8266_RTOS_SDK" 6.安裝 Python packages     - python -m pip install --user -r $IDF_PATH /requirements.txt 7.專案開始 copy get-started/hello_world  到~/esp    -cd ~/esp    -cp -r $IDF_PATH /...

ESP8266 RTOS 筆記(三)-如何在sdk中將.c放入自己的資料夾

圖片
        有時候寫code會想要新增一個資料夾來放自己的 lib 在esp8266中需要一些步驟才能成功編譯 ======================================================== 假設我在我的專案中新增一個資料夾叫做my_lib 在裡面新增一個.c檔跟一個show()函式,build code會出現以下訊息: 很明顯可以看到找不到show()。 解決方法如下: 先打開user資料夾,裡面會有一個Makefile檔案,將Makefile複製到資料夾mylib 打開在mylib資料夾中的Makefile: 在前面的地方會有 將 GEN_LIBS = libuser.a 改成 GEN_LIBS = libmylib.a 接下來打開專案的Makefile 先找到 SUBDIRS= 新增自己新增的資料夾 my_lib 到下面找 COMPONENTS_eagle.app.v6 = 新增  my_lib/libmylib.a 現再進行build code,就可以成功通過了! 自己遇到這問題時,不知道該怎麼處理 直到前陣子自己稍微完一下Makeflie與GCC,對Makefile有稍微了解 所以回頭來看這問題就很自然的從makefile中下手,就設定完成了 最大的原因還是自己經驗不夠,對makefile不熟 技術這條路真的永遠也走不完!!

ESP8266 RTOS 筆記(三)-GPIO(3)_input使用

這篇直接講解怎麼設定esp8266 gpio input 中斷如何使用 實例: void gpio_intr_handler(void) {     _xt_isr_mask(1<<ETS_GPIO_INUM);    //disable interrupt     os_delay_us(20*1000);//delay 20ms     if(!GPIO_INPUT_GET(GPIO_ID_PIN(12)))     {         printf( "\r\n receive gpio12 press!\n" );     }     if(!GPIO_INPUT_GET(GPIO_ID_PIN(13)))     {     printf( "\r\n receive gpio13 press!\n" );     }     if(!GPIO_INPUT_GET(GPIO_ID_PIN(2)))     {     printf( "\r\n receive gpio2 press!\n" );     }     if(!GPIO_INPUT_GET(GPIO_ID_PIN(14)))     {     printf( "\r\n receive gpio14 press!\n" );     }     GPIO_REG_WRITE(             GPIO_STATUS_W1TC_ADDRESS,GPIO_Pin_2|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14 ); //clear interrupt mask     _xt_isr_unmask(1 << ET...

ESP8266 RTOS 筆記(二)-GPIO(2)_OUTPUT設定與介紹

    此章節為記錄 esp8266的gpio output部分 從關方手冊可以看到幾個有關GPIO的registers: Output enable register: GPIO_ENABLE_W1TS Output disable register: GPIO_ENABLE_W1TC Output low level register GPIO_OUT_W1TC   Output high level register GPIO_OUT_W1TS  每個REGISTER皆為16個bits,bit[15:0] 1.GPIO_ENABLE_W1TS: 相對應的bit設為1,此IO的output將至能 例如:   欲將gpio4設為output,則此register設為0x10   欲將gpio5設為output,則此register設為0x20   若希望gpio4與gpio5皆設為output,則此register設為0x30 2.GPIO_ENABLE_W1TC: 關閉output功能, 相對應的bit設為1,此IO的output將被關閉 例如:   欲將gpio4的output失能,則此register設為0x10   欲將gpio5的output失能,則此register設為0x20   gpio4與gpio5的output皆失能,則此register設為0x30 3. GPIO_OUT_W1TC   bit[15:0] output low level bit 設為1則腳位為為High level 例如: gpio4要設為low,則此register設為0x10 4. GPIO_OUT_W1TS  bit[15:0] output high level bit 設為1則腳位為為High level 例如: gpio4要設為high,則此register設為0x10 看完register後再來看一下gpio.h中的一些定義: void gpio_output_conf ( uint32 set_mask, uint32 clear_ma...