#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
/*user functions*/
char readDHT(int pin,float *h,float *t);
int readByte(int pin);
int checkSum(int pin);
void initDisplay(void);
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
void setup() {
Serial.begin(9600);
initDisplay();
float t,h;
readDHT(2,&h,&t);
// put your setup code here, to run once:
}
void loop() {
float t,h;
readDHT(2,&h,&t);
display.setCursor(30, 10);
display.print(h);
display.setCursor(30, 35);
display.print(t);
display.display();
delay(1000);
display.clearDisplay();
display.display();
// put your main code here, to run repeatedly:
}
/*
@fn char readDHT(int pin)
@brief función que obiene los valores de temperatura y humedad
@param[in] pin: valor de pin para envio y recepcion de datos
@param[out] t: temperatura
@param[out] h: humedad
@return 0: ok | 1: fallo
*/
char readDHT(int pin,float *h,float *t){
pinMode(pin,OUTPUT);
digitalWrite(pin,LOW);
delay(2);
digitalWrite(pin,HIGH);
delayMicroseconds(30);
pinMode(pin,INPUT);
while(digitalRead(pin));
while(!digitalRead(pin));
while(digitalRead(pin));
short data[3] = {0};
data[0] = readByte(pin);
data[1] = readByte(pin);
data[2] = checkSum(pin);
unsigned char A = ((data[0] & 0xFF00)>>8);
unsigned char B = (data[0] & 0xFF);
unsigned char C = ((data[1] & 0xFF00)>>8);
unsigned char D = (data[1] & 0xFF);
unsigned char checkSum = (A+B+C+D);
if(checkSum == data[2]){
*t = data[1];
*t /= 10;
*h = data[0];
*h /= 10;
}
else
return 1;
}
/*
@fn
@brief
@param[in]
@param[out]
@param[out]
@return
*/
int readByte(int pin){
int data = 0;
for(int i= 0; i < 16; i++){
while(!digitalRead(pin));//hasta que se vuelva 1
delayMicroseconds(30);
if(digitalRead(pin)){
//data = ((data<<1) | 1);
Serial.print("1");
}else{
//data = (data<<1);
Serial.print("0");
}
while(digitalRead(pin));//hasta que se vuelva 0
}
return data;
}
/*
@fn
@brief
@param[in]
@param[out]
@param[out]
@return
*/
int checkSum(int pin){
int data = 0;
for(int i= 0; i < 8; i++){
while(!digitalRead(pin));//hasta que se vuelva 1
delayMicroseconds(30);
if(digitalRead(pin)){
data = ((data<<1) | 1);
}else{
data = (data<<1);
}
while(digitalRead(pin));//hasta que se vuelva 0
}
return data;
}
void initDisplay(void){
display.begin(SSD1306_SWITCHCAPVCC,0x3c );
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.clearDisplay();
display.setTextSize(2); // x2 pixel
display.setCursor(30, 20);//3 renglones, depende el tamaño
display.print("Hello!");
display.display();
delay(2000);
display.clearDisplay();
display.display();
}