You are on page 1of 10

1 #include <C:/msys32/ESP32/ESP32/components/arduino/cores/esp32/Arduino.

h>
2 #include <C:/msys32/ESP32/esp-idf/components/driver/include/driver/rtc_io.h>
3 #include <C:/msys32/ESP32/esp-idf/components/driver/include/driver/adc.h>
4 #include <C:/msys32/ESP32/esp-idf/components/ulp/ulp.c>
5 #include <C:/msys32/ESP32/ESP32/build/main/ulp_main.h>
6 extern "C"
7 {
8 #include <C:/msys32/ESP32/esp-idf/components/esp32/include/esp_clk.h>
9 }
10 //Pode ser preciso arrumar os diretorios das bibliotecas
11 //Pode ser preciso remover o "extern 'C'{}" e definir a biblioteca fora dele, alguns usuarios relatam erro sem
12
13 extern const uint8_t ulp_main_bin_start[] asm("_binary_ulp_main_bin_start");
14 extern const uint8_t ulp_main_bin_end[] asm("_binary_ulp_main_bin_end");
15 void ulp();
16
17
18 extern "C" void app_main()
19 {
20 initArduino();//inicia configuracoes do arduino, caso nao use o Arduino component, remova essa linha
21 pinMode(2, OUTPUT);
22
23 if (esp_sleep_get_wakeup_cause() == ESP_SLEEP_WAKEUP_ULP)//se o wakeup for por causa do ULP, tomara alguma
24 {
25 digitalWrite(2, 1);
26 delay(500);
27 digitalWrite(2, 0);
28 }
29 else//se nao, iniciara o ULP
30 {
31 ulp();//configura e inicializa o ulp
32 }
33
34
35 esp_sleep_enable_ulp_wakeup();//habilita o wakeup pelo ULP
36 esp_deep_sleep_start();//entra em deep sleep eterno
37 }
38
39
40
41
42 void ulp()
43 {
44 adc1_config_channel_atten(ADC1_CHANNEL_4, ADC_ATTEN_11db);
45 adc1_config_width(ADC_WIDTH_12Bit);
46 adc1_ulp_enable();
47 //configura o ADC1 #4 (GPIO32) para 3.3V 12bit e atribui o uso ao ULP
48
49 ulp_set_wakeup_period(0, 10000000);//ativa o timer de wakeup do ULP apos cada HALT para 10seg
50
51 ulp_load_binary(0, ulp_main_bin_start, (ulp_main_bin_end - ulp_main_bin_start) / sizeof(uint32_t));//carreg
52 ulp_run((&ulp_main - RTC_SLOW_MEM) / sizeof(uint32_t));//inicia o ULP
53 }

1 #include "soc/soc_ulp.h"
2 #include "soc/rtc_io_reg.h"
3 #include "soc/sens_reg.h"
4 #include "soc/rtc_cntl_reg.h"
5
6
7 .bss//secao das variaveis
8
9
10 .text//secao do codigo
11
12
13 .global main
14 main:
15
16 move r0, 0//r0 = 0
17 move r1, 0//r1 = 0
18 stage_rst//stage_cnt = 0
19
20 leitura:
21 stage_inc 1//stage_cnt++
22 adc r1, 0, 4+1//r1 = leitura ADC GPIO32
23 add r0, r0, r1//r0 = r0+r1
24 jumps leitura, 4, lt//loop responsavel pelas leituras, equivale a um FOR()
25
26 rsh r0, r0, 2//calcula a media das 4 leituras r0 = r0/4
27 jumpr wakeup, 496, ge//se a media da leitura que esta em r0 for maior ou igual que 496 (40 graus
28 halt//coloca o ULP em sleep e ativa o timer de wakeup (definido com 10 segundos no main code)
29
30 wakeup:
31 wake//acorda o mcu
32 halt

1 leitura:
2 stage_inc 1
3 adc r1, 0, 4+1
4 add r0, r0, r1
5 jumps leitura, 4, lt
6
7 rsh r0, r0, 2
8 jumpr wakeup, 496, ge
9 halt

1 adc r1, 0, 4+1


1 rsh r0, r0, 2

1 jumpr wakeup, 496, ge


Ultra Low Power coprocessor (ULP) – ESP32
Ultra Low Power coprocessor  Neste tutorial, você irá aprender a instalar e usar o incrível ULP do ESP32, uma
ferramenta … Continue lendo

Portal Vida de Silício 1

José Morais
Estudante de Engenharia da Computação pela USC, pretende se aprimorar e fazer a diferença nesta
imensa área da tecnologia. Apaixonado por IoT, sistemas embarcados, microcontroladores e
integração da computação nos mais diversos fins práticos e didáticos.