Skip to content

Commit

Permalink
Connect to Wi-Fi
Browse files Browse the repository at this point in the history
  • Loading branch information
hg committed Nov 7, 2020
1 parent b3b3897 commit 09c63e6
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 10 deletions.
7 changes: 1 addition & 6 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,5 @@
cmake_minimum_required(VERSION 3.5)

include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(airmon LANGUAGES C)

set(PROJECT_ELF ${project_elf})

# Ignore false clang warnings about `struct foo = { 0 }`
target_compile_options(${PROJECT_ELF} PRIVATE -Wno-missing-braces -Wmissing-field-initializers)
project(airmon)

5 changes: 2 additions & 3 deletions main/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
set(COMPONENT_SRCDIRS ".")
set(COMPONENT_ADD_INCLUDEDIRS ".")
idf_component_register(SRCS "app_main.c"
INCLUDE_DIRS ".")

register_component()
14 changes: 13 additions & 1 deletion main/Kconfig.projbuild
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
menu "airmon Configuration"
menu "airmon configuration"

config TEMPERATURE_PERIOD_SECONDS
int "Temperature measurement period, seconds"
Expand All @@ -9,5 +9,17 @@ config TEMPERATURE_KEEP_HOURS
int "How many hours of temperature measurements to keep in queue"
range 1 24
default 3

config WIFI_SSID
string "WiFi SSID"
default "myssid"
help
SSID (network name) to connect to

config WIFI_PASSWORD
string "WiFi Password"
default "mypassword"
help
WiFi password (WPA or WPA2) to use
endmenu

99 changes: 99 additions & 0 deletions main/app_main.c
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
#include "driver/gpio.h"
#include "esp_event.h"
#include "esp_log.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "nvs_flash.h"

#include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h"
#include "freertos/queue.h"
#include "freertos/task.h"

#include "sys/time.h"

#include "lwip/err.h"
#include "lwip/sys.h"

#include "ds18b20.h"
#include "owb.h"
#include "owb_rmt.h"
Expand All @@ -29,6 +38,8 @@ static sensor_config temp_sensors[] = {
// {"street", 12, RMT_CHANNEL_2, RMT_CHANNEL_3, NULL},
};

typedef enum { Connected = BIT0, Disconnected = BIT1 } wifi_event_bit;

static const int kSensorResolution = (DS18B20_RESOLUTION_12_BIT);

// one second in ticks
Expand Down Expand Up @@ -146,6 +157,90 @@ _Noreturn void collect_temps(const sensor_config *const config) {
}
}

static void event_handler(void *arg, esp_event_base_t event_base,
int32_t event_id, void *event_data) {
EventGroupHandle_t wf_init_evt = arg;

if (event_base == WIFI_EVENT) {
if (event_id == WIFI_EVENT_STA_START) {
esp_wifi_connect();
}
if (event_id == WIFI_EVENT_STA_DISCONNECTED) {
esp_wifi_connect();
}
}

if (event_base == IP_EVENT) {
if (event_id == IP_EVENT_STA_GOT_IP) {
ip_event_got_ip_t *evt = event_data;
ESP_LOGI(kTag, "got ip %d.%d.%d.%d", IP2STR(&evt->ip_info.ip));
xEventGroupSetBits(wf_init_evt, Connected);
}
}
}

void wifi_init_sta() {
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_netif_create_default_wifi_sta();

wifi_init_config_t wf_init_conf = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&wf_init_conf));

esp_event_handler_instance_t evt_any_id, evt_got_ip;

EventGroupHandle_t wf_init_evt = xEventGroupCreate();

ESP_ERROR_CHECK(esp_event_handler_instance_register(
WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, wf_init_evt, &evt_any_id));

ESP_ERROR_CHECK(esp_event_handler_instance_register(
IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, wf_init_evt, &evt_got_ip));

wifi_config_t wf_conf = {
.sta = {.ssid = CONFIG_WIFI_SSID,
.password = CONFIG_WIFI_PASSWORD,
.threshold.authmode = WIFI_AUTH_WPA2_PSK,
.pmf_cfg = {.capable = true, .required = false}},
};

ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wf_conf));
ESP_ERROR_CHECK(esp_wifi_start());

for (;;) {
EventBits_t bits = xEventGroupWaitBits(
wf_init_evt, Connected | Disconnected, pdTRUE, pdFALSE, portMAX_DELAY);

if (bits & Connected) {
ESP_LOGI(kTag, "connected to wifi");
}

if (bits & Disconnected) {
ESP_LOGI(kTag, "disconnected from wifi");
}
}

ESP_ERROR_CHECK(esp_event_handler_instance_unregister(
IP_EVENT, IP_EVENT_STA_GOT_IP, evt_got_ip));
ESP_ERROR_CHECK(esp_event_handler_instance_unregister(
WIFI_EVENT, ESP_EVENT_ANY_ID, evt_any_id));

vEventGroupDelete(wf_init_evt);
}

static void init_nvs() {
esp_err_t ret = nvs_flash_init();

if (ret == ESP_ERR_NVS_NO_FREE_PAGES ||
ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}

ESP_ERROR_CHECK(ret);
}

_Noreturn void app_main() {
esp_log_level_set("*", ESP_LOG_INFO);

Expand All @@ -155,6 +250,10 @@ _Noreturn void app_main() {
// esp_log_level_set("ds18b20", ESP_LOG_DEBUG);
// esp_log_level_set("owb_rmt", ESP_LOG_DEBUG);

init_nvs();

xTaskCreate(wifi_init_sta, "wifi_init", 4096, NULL, 1, NULL);

QueueHandle_t temp_queue =
xQueueCreate(kTempQueueLength, sizeof(temp_measurement));

Expand Down

0 comments on commit 09c63e6

Please sign in to comment.