Arduino ile kuluçka makinesi kodu

riseofturkey

Kilopat
Katılım
13 Haziran 2015
Mesajlar
925
Makaleler
2
Çözümler
5
Yer
Antalya/Finike
Daha fazla  
Cinsiyet
Erkek
Arkadaşlar arduinoda kuluçka makinesi için kod yazdım sadece sıcaklık ve nem sensörlerine if komutu atayınca sorun yok. Asıl sorun viyol çevirme motorunu 1 saatte 1 kez 18 saniye açık tutmak için kod yazdığımda sıcaklık ve nem sensörüm veri alabilmek için döngüde 1 saat boyunca beklemiş oluyor. Bu sorunu nasıl çözebilirim?
[CODE title="kuluçka makinesi" highlight="49"]#include <dht.h>
dht DHT;
//Constants
#define DHT22_PIN 2 // DHT 22 (AM2302) - what pin we're connected to
#define RELAYPINT 3
#define RELAYPINH 4
#define RELAYPINM 5
//Variables
float hum; //Stores humidity value
float temp; //Stores temperature value

void setup()
{
Serial.begin(9600);
pinMode(RELAYPINT, OUTPUT);
pinMode(RELAYPINH, OUTPUT);
pinMode(RELAYPINM, OUTPUT);
}

void loop()
{
int chk = DHT.read22(DHT22_PIN);

hum = DHT.humidity;
temp= DHT.temperature;



//arduinonuzu laptopunuza bağlayarak sıcaklık ve nem değerlerini okuyabilirsiniz seri port ekranından
Serial.print("Humidity: ");
Serial.print(hum);
Serial.print(" %, Temp: ");
Serial.print(temp);
Serial.println(" Celsius");
delay(2000); //Delay 2 sec.

if (temp > 37) { //benim rölelerimin ışıkları ters çalıştığı için bu şekilde büyüktür yaptım
digitalWrite(RELAYPINT, HIGH);
} else {
digitalWrite(RELAYPINT, LOW);
}
if (hum > 60) {
digitalWrite(RELAYPINH, HIGH);
} else {
digitalWrite(RELAYPINH, LOW);
}

digitalWrite(RELAYPINM, HIGH);
delay (3600000); //1 saat boyunca kuluçka motorunu beklet

digitalWrite(RELAYPINM, LOW);

delay (18000); //Motorunuz kaç milisaniyede yarım tur yapıyorsa o kadar çalıştırın
}[/CODE]
 
delay() komutuyla mikrokontrolcüyü düşük güç moduna alıyorsun ve girdiğin süre kadar mikrokontrolcünün o modda kalmasını sağlıyorsun. Bu yüzden de diğer komponentlere komut yollanmıyor ve makine çalışmıyor. AVR'deki timer sistemini bilmiyorum, donanım zamanlayıcıları sayesinde if-else kullanarak yapabilirsin. İlk aklıma gelen bu oldu. Veya kullandığın C kütüphanesi time.h'ı destekliyorsa UNIX saati dediğimiz epoch'u kullanarak kontrol yapabilirsin.

En basitinden, en son servo çalıştırılma saatiyle şu anki epoch arasında kaç saniye fark olduğuna bakarak kıyaslama yapabilirsin. Veya dediğim gibi, kullandığın C kütüphanen desteklemiyorsa ya da kendini AVR programlamada geliştirmek istiyorsan donanım zamanlamalarını kullanabilirsin.
 
Son düzenleme:
delay() komutuyla mikrokontrolcüyü düşük güç moduna alıyorsun ve girdiğin süre kadar mikrokontrolcünün o modda kalmasını sağlıyorsun. Bu yüzden de diğer komponentlere komut yollanmıyor ve makine çalışmıyor. AVR'deki timer sistemini bilmiyorum, donanım zamanlayıcıları sayesinde if-else kullanarak yapabilirsin. İlk aklıma gelen bu oldu. Veya kullandığın C kütüphanesi time.h'ı destekliyorsa UNIX saati dediğimiz epoch'u kullanarak kontrol yapabilirsin.

En basitinden, en son servo çalıştırılma saatiyle şu anki epoch arasında kaç saniye fark olduğuna bakarak kıyaslama yapabilirsin. Veya dediğim gibi, kullandığın C kütüphanen desteklemiyorsa ya da kendini AVR programlamada geliştirmek istiyorsan donanım zamanlamalarını kullanabilirsin.
Delay komutu bahsettiğin gibi makineyi x kadar milisaniye uyku moduna alıyor. Asıl sorun delay komutunun void loop fonksiyonu içerisinde olmasıymış. void loop fonksiyonunu sürekli ve sürekli döndürecek şekilde revize etmem gerekti.
İf bloğu içine alıp denediniz mi?
If bloğu içerisine içerisine aldım fakat
delay (3600000000);

yazmak yerine

delay (1000);
x++;

yazdım.
Revize edilmiş kod:
[CODE title="revize" highlight="11, 12, 13, 14, 54-78"]#include <dht.h>
dht DHT;
//Constants
#define DHT22_PIN 2 // DHT 22 (AM2302) - what pin we're connected to
#define RELAYPINT 3
#define RELAYPINH 4
#define RELAYPINM 5
//Variables
float hum; //Stores humidity value
float temp; //Stores temperature value
int x=0;
int y=0;
int a=0;
int b=0;
void setup()
{
Serial.begin(9600);
pinMode(RELAYPINT, OUTPUT);
pinMode(RELAYPINH, OUTPUT);
pinMode(RELAYPINM, OUTPUT);
}

void loop()
{
int chk = DHT.read22(DHT22_PIN);

hum = DHT.humidity;
temp= DHT.temperature;



//arduinonuzu laptopunuza bağlayarak sıcaklık ve nem değerlerini okuyabilirsiniz seri port ekranından
Serial.print("Humidity: ");
Serial.print(hum);
Serial.print(" %, Temp: ");
Serial.print(temp);
Serial.println(" Celsius");
delay(1000); //Delay 2 sec.

if (temp > 37) { //benim rölelerimin ışıkları ters çalıştığı için bu şekilde büyüktür yaptım

digitalWrite(RELAYPINT, HIGH);

}
else {
digitalWrite(RELAYPINT, LOW);
}
if (hum > 60) {
digitalWrite(RELAYPINH, HIGH);
} else {
digitalWrite(RELAYPINH, LOW);
}

if (b==0){
digitalWrite(RELAYPINM, HIGH);
b++;
}
if (a==1){
if (x==3600){
digitalWrite(RELAYPINM, LOW);
x=0;
a=0;
}
if (x<=3600)
delay (1000);
x=x+2;}



if (a==0){
if (y==18){
digitalWrite(RELAYPINM, HIGH);
y=0;
a=1;
}
if (y<=18){
delay (1000);
y=y+2;}}
}[/CODE]
 
Son düzenleme:

Yeni konular

Geri
Yukarı