BASIC4MCU | 질문게시판 | 아두이노 LED 시간 제어가 안됩니다.
페이지 정보
작성자 고양이33 작성일2023-02-08 04:33 조회956회 댓글3건본문
#include <MsTimer2.h>
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
int fan = 7;
int wp = 5;
int dl = 9;
const int LED = 6;
const int ON_TIME = 7 * 60 * 60 * 1000;const int OFF_TIME = 24 * 60 * 60 * 1000 - ON_TIME;
void setup()
{
turnOnLED();
Serial.begin(9600);
pinMode(fan, OUTPUT);
pinMode(wp, OUTPUT);
pinMode(LED, OUTPUT);
}
void turnOnLED() {
digitalWrite(LED, HIGH);
MsTimer2::set(ON_TIME, turnOffLED);
MsTimer2::start();
}
void turnOffLED() {
digitalWrite(LED, LOW);
MsTimer2::set(OFF_TIME, turnOnLED);
MsTimer2::start();
}
void loop()
{
int a = analogRead(A5);
int b = analogRead(A4);
float h = dht.readHumidity();
float t = dht.readTemperature();
float s = a;
float z = b;
if (isnan(t) || isnan(h)|| isnan(s)|| isnan(z)) {
Serial.println("Failed to read from DHT");
} else {
Serial.print("Humidity: ");
Serial.print(h);
Serial.print("Temperature: ");
Serial.print(t);
Serial.print("Soil water: ");
Serial.print((s+z)/2);
Serial.print(" \n");
}
if(t > 23 or h > 80 or (s+z)/2> 900){
digitalWrite(fan,HIGH);
}
else{
digitalWrite(fan,LOW);
}
if(h < 40 or (s+z)/2 < 820){
const long intervals = 10000;
digitalWrite(wp,(millis() / intervals) % 2);
}
else{
digitalWrite(wp,LOW);
}
if(t < 15 or (s+z)/2> 900){
digitalWrite(dl,HIGH);
}
else{
digitalWrite(dl,LOW);
}
}
아두이노와 다른 부품들을 이용하여 개인적으로 스마트팜을 만들어보고 있는데 나머지 코딩은 완료했는데 LED가 켜지기만 하고 제시간에 꺼지지를 않습니다.
7시간이 지나도 자기 혼자 켜져있기만 하고 꺼지지를 않는데 어떻게 해결해야 할지 감도 안 잡히네요. 분명히 코드는 문제없어 보이는데 왜 이런걸까요?
댓글 3
조회수 956master님의 댓글
master 작성일
const int ON_TIME=25200000; // 25200000ms=7시간
이렇게 큰 값은 int범위를 벗어납니다.
//
if(t < 15 or (s+z)/2> 900){
c언어에서 or라는 연산자는 사용하지 않습니다.
조건식 논리or는 ||를 사용하세요
master님의 댓글
master 작성일
#include <MsTimer2.h>
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
//
const int fan=7,wp=5,dl=9,LED=6;
//
volatile int ms=0,sec=0,hour=0;
//
void setup(){
Serial.begin(9600);
pinMode(fan, OUTPUT);
pinMode(wp, OUTPUT);
pinMode(LED, OUTPUT);
MsTimer2::set(100,turnOnLED); // 100ms
MsTimer2::start();
}
//
void turnOnLED(){ // 100ms
if(++ms>9){ ms=0; // 1sec
if(++sec>3600){ sec=0; if(++hour>23)hour=0; }
}
//
if(hour<7)digitalWrite(LED,1); // 0~6 ON
else digitalWrite(LED,0); // 7~23 OFF
}
//
void loop(){
int a=analogRead(A5);
int b=analogRead(A4);
float h=dht.readHumidity();
float t=dht.readTemperature();
float s=a;
float z=b;
//
if (isnan(t)|| isnan(h)|| isnan(s)|| isnan(z)){ Serial.println("Failed to read from DHT"); }
else {
Serial.print("Humidity: "); Serial.print(h);
Serial.print("Temperature: "); Serial.print(t);
Serial.print("Soil water: "); Serial.print((s+z)/2); Serial.print(" \n");
}
//
if(t>23 || h>80 || (s+z)/2> 900){ digitalWrite(fan,HIGH); } else{ digitalWrite(fan,LOW); }
//
if(h<40 || (s+z)/2<820){ const long intervals=10000; digitalWrite(wp,(millis()/ intervals)% 2); }
else{ digitalWrite(wp,LOW); }
//
if(t < 15 || (s+z)/2> 900){ digitalWrite(dl,HIGH); } else{ digitalWrite(dl,LOW); }
}
master님의 댓글
master 작성일
//if(++sec>3600){ sec=0; if(++hour>23)hour=0; }
if(++sec>3){ sec=0; if(++hour>23)hour=0; }
테스트 할 때는 시간을 짧게하면 체크하기 좋습니다.