2
2
#include <mruby/value.h>
3
3
4
4
#include "driver/gpio.h"
5
- #include "driver/dac .h"
6
- #include "driver/adc .h"
5
+ #include "driver/dac_oneshot .h"
6
+ #include "esp_adc/adc_oneshot .h"
7
7
8
8
#define GPIO_MODE_DEF_PULLUP (BIT3)
9
9
#define GPIO_MODE_DEF_PULLDOWN (BIT3)
@@ -58,11 +58,19 @@ mrb_esp32_gpio_analog_write(mrb_state *mrb, mrb_value self) {
58
58
if (!mrb_fixnum_p (ch ) || !mrb_fixnum_p (vol )) {
59
59
return mrb_nil_value ();
60
60
}
61
-
62
- dac_output_enable (mrb_fixnum (ch ));
63
-
64
- dac_output_voltage (mrb_fixnum (ch ), mrb_fixnum (vol ));
65
-
61
+
62
+ // Handle
63
+ dac_oneshot_handle_t chan_handle ;
64
+
65
+ // Configuration
66
+ dac_oneshot_config_t chan_cfg = {
67
+ .chan_id = mrb_fixnum (ch ),
68
+ };
69
+ ESP_ERROR_CHECK (dac_oneshot_new_channel (& chan_cfg , & chan_handle ));
70
+
71
+ // Write
72
+ ESP_ERROR_CHECK (dac_oneshot_output_voltage (chan_handle , mrb_fixnum (vol )));
73
+
66
74
return self ;
67
75
}
68
76
@@ -88,10 +96,28 @@ mrb_esp32_gpio_analog_read(mrb_state *mrb, mrb_value self) {
88
96
if (!mrb_fixnum_p (ch )) {
89
97
return mrb_nil_value ();
90
98
}
99
+
100
+ // Handle
101
+ adc_oneshot_unit_handle_t adc1_handle ;
102
+ adc_oneshot_unit_init_cfg_t init_config1 = {
103
+ .unit_id = ADC_UNIT_1 ,
104
+ .ulp_mode = ADC_ULP_MODE_DISABLE ,
105
+ };
106
+ ESP_ERROR_CHECK (adc_oneshot_new_unit (& init_config1 , & adc1_handle ));
107
+
108
+ // Configuration. ADC_BITWIDTH_DEFAULT = 12
109
+ adc_oneshot_chan_cfg_t config = {
110
+ .bitwidth = ADC_BITWIDTH_DEFAULT ,
111
+ .atten = ADC_ATTEN_DB_11 ,
112
+ };
113
+ ESP_ERROR_CHECK (adc_oneshot_config_channel (adc1_handle , mrb_fixnum (ch ), & config ));
114
+
115
+ // Read and Delete
116
+ int adc_result ;
117
+ ESP_ERROR_CHECK (adc_oneshot_read (adc1_handle , mrb_fixnum (ch ), & adc_result ));
118
+ ESP_ERROR_CHECK (adc_oneshot_del_unit (adc1_handle ));
91
119
92
- adc1_config_channel_atten (mrb_fixnum (ch ), ADC_ATTEN_DB_11 );
93
-
94
- return mrb_fixnum_value (adc1_get_raw (mrb_fixnum (ch )));
120
+ return mrb_fixnum_value (adc_result );
95
121
}
96
122
97
123
void
@@ -107,8 +133,6 @@ mrb_mruby_esp32_gpio_gem_init(mrb_state* mrb)
107
133
mrb_define_module_function (mrb , gpio , "digitalRead" , mrb_esp32_gpio_digital_read , MRB_ARGS_REQ (1 ));
108
134
mrb_define_module_function (mrb , gpio , "analogWrite" , mrb_esp32_gpio_analog_write , MRB_ARGS_REQ (2 ));
109
135
mrb_define_module_function (mrb , gpio , "analogRead" , mrb_esp32_gpio_analog_read , MRB_ARGS_REQ (1 ));
110
-
111
- adc1_config_width (ADC_BITWIDTH_12 );
112
136
113
137
constants = mrb_define_module_under (mrb , gpio , "Constants" );
114
138
@@ -156,18 +180,23 @@ mrb_mruby_esp32_gpio_gem_init(mrb_state* mrb)
156
180
define_const (GPIO_NUM_39 );
157
181
define_const (GPIO_NUM_MAX );
158
182
183
+ define_const (DAC_CHAN_0 );
184
+ define_const (DAC_CHAN_1 );
185
+ // Old versions of above. Deprecated.
159
186
define_const (DAC_CHANNEL_1 );
160
187
define_const (DAC_CHANNEL_2 );
161
188
162
- define_const (ADC1_CHANNEL_0 );
163
- define_const (ADC1_CHANNEL_1 );
164
- define_const (ADC1_CHANNEL_2 );
165
- define_const (ADC1_CHANNEL_3 );
166
- define_const (ADC1_CHANNEL_4 );
167
- define_const (ADC1_CHANNEL_5 );
168
- define_const (ADC1_CHANNEL_6 );
169
- define_const (ADC1_CHANNEL_7 );
170
- define_const (ADC1_CHANNEL_MAX );
189
+ define_const (ADC_CHANNEL_0 );
190
+ define_const (ADC_CHANNEL_1 );
191
+ define_const (ADC_CHANNEL_2 );
192
+ define_const (ADC_CHANNEL_3 );
193
+ define_const (ADC_CHANNEL_4 );
194
+ define_const (ADC_CHANNEL_5 );
195
+ define_const (ADC_CHANNEL_6 );
196
+ define_const (ADC_CHANNEL_7 );
197
+ // Channel 8 and 9 only exist on ADC2.
198
+ define_const (ADC_CHANNEL_8 );
199
+ define_const (ADC_CHANNEL_9 );
171
200
172
201
mrb_define_const (mrb , constants , "LOW" , mrb_fixnum_value (0 ));
173
202
mrb_define_const (mrb , constants , "HIGH" , mrb_fixnum_value (1 ));
0 commit comments