This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
en:iot-open:practical:hardware:sut:esp32:emb2_1 [2024/03/24 21:54] – [Steps] pczekalski | en:iot-open:practical:hardware:sut:esp32:emb2_1 [2025/04/28 20:31] (current) – [Steps] pczekalski | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | <todo @pczekalski> | ||
====== EMB2: Using a digital potentiometer ===== | ====== EMB2: Using a digital potentiometer ===== | ||
Digital potentiometer DS1803 is an I2C-controlled device that can digitally control the potentiometer.\\ Opposite to the physical potentiometers, | Digital potentiometer DS1803 is an I2C-controlled device that can digitally control the potentiometer.\\ Opposite to the physical potentiometers, | ||
Line 26: | Line 25: | ||
#include < | #include < | ||
</ | </ | ||
- | <note important> | + | <note important> |
Below, we present a sample control library that you need to include in your code: | Below, we present a sample control library that you need to include in your code: | ||
Line 57: | Line 56: | ||
</ | </ | ||
- | <note important> | + | <note important> |
===== Suggested Readings and Knowledge Resources ===== | ===== Suggested Readings and Knowledge Resources ===== | ||
* [[en: | * [[en: | ||
Line 74: | Line 73: | ||
==== Steps ==== | ==== Steps ==== | ||
Below, we assume that you have embedded functions handling operations on the digital potentiometer as defined above in your source file. Remember to add '' | Below, we assume that you have embedded functions handling operations on the digital potentiometer as defined above in your source file. Remember to add '' | ||
- | <note tip>Note, Step 5 presents some stub code for displaying data on an OLED display.</ | + | <note tip>Note: Step 5 presents some stub code for displaying data on an OLED display.</ |
=== Step 1 === | === Step 1 === | ||
- | Define I2C bus GPIOs: clock (SCL) uses GPIO 4 and data (SDA) GPIO 5. ADC uses GPIO 7. Digital potentiometer chip DS1803 uses 0x28 I2C address. All definitions are present in the following code: | + | Define I2C bus GPIOs: clock (SCL) uses GPIO 4, and data (SDA) uses GPIO 5. ADC uses GPIO 7. Digital potentiometer chip DS1803 uses 0x28 I2C address. All definitions are present in the following code: |
<code c> | <code c> | ||
#define SCL 4 | #define SCL 4 | ||
Line 86: | Line 85: | ||
Declare an array of readings that fits an OLED display. Adjust for ePaper resolution (horizontal) if using it. OLED is 128x128 pixels: | Declare an array of readings that fits an OLED display. Adjust for ePaper resolution (horizontal) if using it. OLED is 128x128 pixels: | ||
<code c> | <code c> | ||
- | static | + | static int16_t aGraphArray[128]; |
</ | </ | ||
=== Step 3 === | === Step 3 === | ||
Line 95: | Line 94: | ||
Wire.begin(SDA, | Wire.begin(SDA, | ||
delay(100); | delay(100); | ||
+ | ... | ||
+ | | ||
pinMode(POT_ADC, | pinMode(POT_ADC, | ||
</ | </ | ||
+ | |||
+ | <note important> | ||
=== Step 4 === | === Step 4 === | ||
- | Read the loopback characteristics of the digital potentiometer to ADC loop and store it in the array: | + | Read the loopback characteristics of the digital potentiometer to the ADC loop and store it in the array: |
<code c> | <code c> | ||
for(byte i=0; i<128; i++) | for(byte i=0; i<128; i++) | ||
Line 109: | Line 112: | ||
=== Step 5 === | === Step 5 === | ||
- | Display on the OLED. Assume the following handler to the pointer to the display controller class for the '' | + | Display on the OLED. Assume the following handler to the pointer to the display controller class: |
+ | <code c> | ||
+ | SSD1306Wire& | ||
+ | </ | ||
+ | More information in the scenario [[en: | ||
Note, ADC measures in the 12-bit mode (we assume such configuration, | Note, ADC measures in the 12-bit mode (we assume such configuration, | ||
<code c> | <code c> | ||
Line 121: | Line 128: | ||
</ | </ | ||
==== Result validation ==== | ==== Result validation ==== | ||
- | A relation between the potentiometer set value and ADC reading should be almost linear from 0V up to about 3V. It becomes horizontal because the ESP32 chip limits the ADC range to 3V, so going beyond 3V (and due to the electronic construction as in figure {{ref>xxx}} it may go to about 3.3V) gives no further increase but rather a reading of the 4096 value (which means the input voltage is over the limit). For this reason, your plot may be finished suddenly with a horizontal instead of linearity decreasing function. It is by design. ADC input of the ESP32 can tolerate values between 3V and 3.3V. The linear correlation mentioned above is never perfect, either because of the devices' | + | A relation between the potentiometer set value and ADC reading should be almost linear from 0V up to about 3V. It becomes horizontal because the ESP32 chip limits the ADC range to 3V, so going beyond 3V (and due to the electronic construction as in figure {{ref>figuredigipot}} it may go to about 3.3V) gives no further increase but rather a reading of the 4096 value (which means the input voltage is over the limit). For this reason, your plot may be finished suddenly with a horizontal instead of linearity decreasing function. It is by design. ADC input of the ESP32 can tolerate values between 3V and 3.3V. The linear correlation mentioned above is never perfect, either because of the devices' |
===== FAQ ===== | ===== FAQ ===== |