#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// Data wire is connected to pin 5
#define ONE_WIRE_BUS 5
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// OLED display setup
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// Variable to hold sensor's ID
DeviceAddress sensorAddress;

void setup() {
  Serial.begin(115200);

  // Start up the DS18B20 library
  sensors.begin();

  // Check for the presence of the sensor and get the address
  if (!sensors.getAddress(sensorAddress, 0)) {
    Serial.println("No DS18B20 sensor found!");
    while (1);
  }

  // Initialize the OLED display
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.print("Initializing DS18B20");
  display.display();
  delay(2000);

  // Print sensor address
  Serial.print("DS18B20 Address: ");
  printAddress(sensorAddress);
  Serial.println();
}

void loop() {
  // Request temperature from the sensor
  sensors.requestTemperatures();
  float tempC = sensors.getTempC(sensorAddress);
  float tempF = sensors.toFahrenheit(tempC);

  // Print results to Serial
  Serial.print("Temperature: ");
  Serial.print(tempC, 1);
  Serial.print(" C, ");
  Serial.print(tempF, 1);
  Serial.println(" F");

  // Display results on OLED
  display.clearDisplay();
  display.setCursor(0, 0);
  display.print("Temp: ");
  display.print(tempC, 1);
  display.print(" C / ");
  display.print(tempF, 1);
  display.println(" F");

  // Display sensor ID
  display.println("Sensor ID: ");
  display.print("     ");
  printAddressOLED(sensorAddress);
  
  display.display();
  
  delay(2000);
}

// Function to print the sensor's address to Serial
void printAddress(DeviceAddress deviceAddress) {
  for (uint8_t i = 0; i < 8; i++) {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

// Function to print the sensor's address on OLED
void printAddressOLED(DeviceAddress deviceAddress) {
  for (uint8_t i = 0; i < 8; i++) {
    if (deviceAddress[i] < 16) display.print("0");
    display.print(deviceAddress[i], HEX);
  }
}
nano:12
nano:11
nano:10
nano:9
nano:8
nano:7
nano:6
nano:5
nano:4
nano:3
nano:2
nano:GND.2
nano:RESET.2
nano:0
nano:1
nano:13
nano:3.3V
nano:AREF
nano:A0
nano:A1
nano:A2
nano:A3
nano:A4
nano:A5
nano:A6
nano:A7
nano:5V
nano:RESET
nano:GND.1
nano:VIN
nano:12.2
nano:5V.2
nano:13.2
nano:11.2
nano:RESET.3
nano:GND.3
Loading
ssd1306
Loading
ds18b20