컴퓨터/아두이노 라즈베리파이

[아두이노] OLED에 온습도 센서값 출력하기

우유식빵 2021. 11. 15. 12:32

oled에 온습도 값과 토양습도값을 출력하고자 한다.

소스코드는 다음과 같다.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT11.h>
#include "Timer.h"
//pin setting
int soil = A0;
DHT11 dht11(A2);
Timer t;

//value initialize
float humi=0, temp=0,soilmoisture=0;
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

void setup() {
  Serial.begin(9600);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  t.every(2000,getValue);
  
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 10);
  display.println("T:"+(String)temp+"C ");
  display.println("H:"+(String)humi+"% ");
  display.println("S:"+(String)soilmoisture+"% ");
  display.display(); 
}

void loop() {
  t.update();
  drawDisplay();
}

void getValue(){
  delay(2000);
  soilmoisture = analogRead(soil);
  soilmoisture = ((1023-soilmoisture)/1023)*100;
  dht11.read(humi, temp);
}

void drawDisplay(){
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 10);
//  Serial.print("temperature: ");
//  Serial.println(temp);
//  Serial.print("humidity: ");
//  Serial.println(humi);
//  Serial.print("read sensor value: ");
//  Serial.println(soilmoisture);
  display.println("T:"+(String)temp+"C ");
  display.println("H:"+(String)humi+"% ");
  display.println("S:"+(String)soilmoisture+"% ");
  display.display(); 
  
}

이 코드는 2초마다 센서 값을 갱신하고

Loop를 돌면서 계속 display()함수를 호출하며 값을 출력한다.

loop문안에다가 display함수를 호출안하고 getValue()함수 끝에다가 넣었더니

화면에 값 출력이 안되더라.. 그래서 저렇게 했다.

 

생각보다 예쁘다.

 

전에는 INT값으로 화면에 출력했는데 Float값으로 출력하는게 더 보기 예쁘긴 한 것 같다.