출시되는 회사별로 핀 배열이 조금식 다르므로 잘 확인하여 사용하셔야 한다.
일단 PCB에 기입되어 잇는 신호를 밑고 결선한다.
제가 실험한 센서의 핀 배치 사진이다.
하드웨어 결선 완료후 라이브러리를 아듀이노 스케치 라이브러 메니저에서 다운받던지
아니면 직접 DHT!! 온습도 센서 ZIP 라이브러를 다운받아 아듀이노 스케치에서 라이브러리를 등록한다.
ZIP 파일로 라이브러릴 등록한 경우에는 스케치 프로그램을 종료 후 다시 실행하면 방금 ZIP 파일로 등록한
DHT11 온습도 센서 라이브러리가 등록되어 있는걸 확인 할 수 있다.
아레에 온 습도센서 라이브러리를 첨부한다.
소스코드
#include <DHT11.h>
#include <Stepper.h>
#include <LiquidCrystal_I2C.h> // i2c LCD IF일 경우
//#include <LiquidCrystal.h> // 4bit, 8 bit IF 방식일 경우에만 사용
#include <Servo.h>
#include "My_default_LIB.h"
// 스탭핑 모터
#define in1 14 // /b상
#define in2 15 // b상
#define in3 11 // /a상
#define in4 12 // a상
int ht_sensor = 16; //A2;
// 2048:한바퀴(360도), 1024:반바퀴(180도)...
// 2048 = sp:14, delay: 500
// 200 = sp: 60, delay : 1500 = 법위가 제한적임
const int stepsPerRevolution = 64;//2048; //200
Stepper myStepper(stepsPerRevolution,12,15,11,14); // in4=a, in2=b, in3=\a, in=\b
unsigned char cnt = 0;
unsigned char buf;
int ad_buf;
float volt;
int lcd_volt; // 정규화
int smot_pin = 9;
int k, i;
float temp, hum;
// servo motor 객체선언
Servo servo;
// LCD 객체선언
LiquidCrystal_I2C lcd(0x27, 16, 2); //lcd 객체 선언
// trmp hum 객체선언
DHT11 dht11(ht_sensor);
void setup() {
// put your setup code here, to run once:
servo.attach(smot_pin);
// rtx en
Serial.begin(9600);
DDRB = 0xff;
DDRD = 0xff;
PORTD = PORTB = 0xff;
pinMode(A3, INPUT);
pinMode(14, OUTPUT);
pinMode(15, OUTPUT);
pinMode(16, INPUT);
lcd.begin(); //LCD 사용 시작
lcd.setCursor(1,0);
lcd.print("Low Data: ");
lcd.setCursor(2,1);
lcd.print("Volt: ");
// myStepper.setSpeed(14); //60
myStepper.setSpeed(300);
}
void cw()
{
// 시계 반대 방향으로 한바퀴 회전
// stepsPerRevolution = 64;
// setSpeed(300);
for(int i=0; i<32; i++) { // 64 * 32 = 2048 한바퀴
myStepper.step(stepsPerRevolution);
}
delay(500);
}
void ccw()
{
// stepsPerRevolution = 64
// setSpeed(300);
// 시계 방향으로 한바퀴 회전
for(int i=0; i<32; i++) { // 64 * 32 = 2048 한바퀴
myStepper.step(-stepsPerRevolution);
}
delay(500);
}
void loop() {
//i = dht11.read(hum, temp);
if((i = dht11.read(hum,temp)) == 0)
{
Serial.print("temp: ");
Serial.print(temp);
Serial.print("hum: ");
Serial.println(hum);
}
else
{
Serial.println("error");
}
delay(DHT11_RETRY_DELAY); //delay for reread
/*
cw();
delay(500);
ccw();
delay(500);
*/
/* // 시계 반대 방향으로 한바퀴 회전
// stepsPerRevolution = 2048
// setSpeed = 14
// delay = 500
// stepsPerRevolution = 200 = 제한적
// setSpeed = 60
// delay = 1500
// 시계 방향으로 한바퀴 회전
myStepper.step(-stepsPerRevolution);
delay(1500);
*/
/*
// 시계 반대 방향으로 한바퀴 회전
for(int i=0; i<32; i++) { // 64 * 32 = 2048 한바퀴
myStepper.step(stepsPerRevolution);
}
delay(500);
// 시계 방향으로 한바퀴 회전
for(int i=0; i<32; i++) {
myStepper.step(-stepsPerRevolution);
}
delay(500);
*/
// ad_buf = analogRead(A3); // 10 bit = 1024 =>> 0 ~ 1023
/*
Serial.print("ADC Low Data = ");
Serial.print(ad_buf);
*/
volt = ((5.0/1023.0) * (float)ad_buf);
/*
Serial.print(", Volt = ");
Serial.print(volt);
Serial.println("V");
*/
// 정규화
lcd_volt = (int)(volt * 1000);
// PC 전송
//Serial.print(ad_buf);
//Serial.print(',');
//Serial.println(lcd_volt);
//delay(100);
// LCD 출력
lcd.setCursor(11,0);
lcd.write(ad_buf/1000 + 0x30);
lcd.write(ad_buf%1000/100 + '0');
lcd.write(ad_buf%100/10 + 0x30);
lcd.write(ad_buf%10 + 0x30);
lcd.setCursor(8,1);
lcd.write(lcd_volt/1000 + 0x30);
lcd.print('.');
lcd.write(lcd_volt%100/10 + 0x30);
lcd.write(lcd_volt%10 + 0x30);
lcd.print('V');
// led 출력
buf = map(ad_buf, 0, 1023, 0, 255);
byte_con_out(~buf);
//servo motor 출력
servo.write(buf);
// rx mode
if (Serial.available() > 0)
{
// PORTD = PORTB = 0xff; // off
buf = Serial.read();
switch(buf)
{
case '0': d_out(led1, 0); break;
case 'a': d_out(led1, 1); break;
case '1': d_out(led2, 0); break;
case 'b': d_out(led2, 1); break;
case '2': d_out(led3, 0); break;
case 'c': d_out(led3, 1); break;
case '3': d_out(led4, 0); break;
case 'd': d_out(led4, 1); break;
case '4': d_out(led5, 0); break;
case 'e': d_out(led5, 1); break;
case '5': d_out(led6, 0); break;
case 'f': d_out(led6, 1); break;
case '6': d_out(led7, 0); break;
case 'g': d_out(led7, 1); break;
case '7': d_out(led8, 0); break;
case 'h': d_out(led8, 1); break;
}
if(buf == 'z') PORTD = PORTB = 0x00; // on
else if(buf == 'x') PORTD = PORTB = 0xff; // off
}
//byte_con_out(~cnt);
//Serial.print(cnt);
//Serial.print('\n');
//Serial.write(cnt/100);
//Serial.write(cnt%100/10);
//Serial.write(cnt%10);
//delay(1000);
//cnt++;
/*
UART 셀프 Test
// put your main code here, to run repeatedly:
// rtx en
// Serial.println("RTX Test");
if (Serial.available())
{
Serial.write(Serial.read());
}
*/
/*
// 실습 1 = 셀프 Test
PORTB = PORTD = 0x55; // led on
delay(1000);
PORTB = PORTD = 0xaa; // led off
delay(1000);
*/
}