#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Potentiometer is connected to GPIO 36 (Analog ADC1_CH0)
#define ADC1_0 36
// Divider is connected to GPIO 39 (Analog ADC1_CH3)
#define ADC1_3 39
// OneWire bus GPIO13
#define ONE_WIRE 13
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1// Reset pin # (or -1 if sharing ESP reset pin)
// screen dimensions
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// intervals in main loop
#define ADC_INTERVAL 100
#define DISPLAY_INTERVAL 1000
#define TEMP_INTERVAL 2000
// variable for storing the potentiometer value
int potValue = 0;
// variable for storing the divider value
int divValue = 0;
// variable for storing the temperature value in C
float temperatureC = 0;
unsigned long time_now = 0;
unsigned long time_ADC_read = 0;
unsigned long time_display = 0;
unsigned long time_temp = 0;
const char VALUE[] = "Value ";
const char TEMP[] = "Temperature ";
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);
void init_disp(){
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // here the 0x3c is the I2C address, check your i2c address if u have multiple devices.
display.clearDisplay();
display.setTextSize(1); // Draw 1X-scale text
display.setTextColor(SSD1306_WHITE);
}
void writeTextToDisp(char* buffer, int row){
display.setCursor(0, row);
display.println(buffer);
}
void intToDisp(char* buffer, int val){
char valChar[8];
itoa(val,valChar,10); //(integer, yourBuffer, base)
strcpy(buffer,VALUE);
strcat(buffer,valChar);
}
void tempToDisp(char* buffer, float temp){
char temb_buff[16];
char temp_str[8];
dtostrf(temp, 4, 1, temp_str); //float, int min_width, int num_digits_after_decimal, where_to_store_string
sprintf(temb_buff, "%s C", temp_str);
strcpy(buffer,TEMP);
strcat(buffer,temb_buff);
}
void setup() {
// init display
init_disp();
// Start the DS18B20 sensor
sensors.begin();
//Serial.begin(115200);
delay(100);
}
void loop() {
time_now = millis();
// Reading temperature from OneWire bus
if(time_now - time_temp >= TEMP_INTERVAL) {
time_temp = time_now;
sensors.requestTemperatures();
temperatureC = sensors.getTempCByIndex(0);
//Serial.print(temperatureC);
//Serial.println("ºC");
}
// Reading analog values
if(time_now - time_ADC_read >= ADC_INTERVAL) {
time_ADC_read = time_now;
potValue = analogRead(ADC1_0);
divValue = analogRead(ADC1_3);
}
// Displaying values on the screen
if(time_now - time_display >= DISPLAY_INTERVAL){
time_display = time_now;
char bufferPot[16];
char bufferDiv[16];
char bufferTemp[32];
intToDisp(bufferPot,potValue);
intToDisp(bufferDiv,divValue);
tempToDisp(bufferTemp, temperatureC);
display.clearDisplay();
writeTextToDisp(bufferPot, 0);
writeTextToDisp(bufferDiv, 10);
writeTextToDisp(bufferTemp, 20);
display.display();
}
}