Çözüldü Arduino Uno LCD ekran ve step motoru aynı anda çalıştırmıyor

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

Ferhat aslan

Decapat
Katılım
28 Mart 2022
Mesajlar
10
Daha fazla  
Cinsiyet
Erkek
C:
#include <Stepper.h>

#include <DHT.h>

#include <LiquidCrystal.h>



const int stepsPerRevolution = 2048;

#define MOTOR_PIN_1 8

#define MOTOR_PIN_2 9

#define MOTOR_PIN_3 10

#define MOTOR_PIN_4 11



// Adım motoru nesnesi oluştur

Stepper stepper(512, MOTOR_PIN_1, MOTOR_PIN_3, MOTOR_PIN_2, MOTOR_PIN_4);

#define DHTPIN 6

#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);



LiquidCrystal lcd(13, 12, 5, 4, 3, 2);



const int incubationPeriod = 21;

const float temperatureThreshold = 37.5;

const int heaterPin = 7;



void setup() {

  lcd.begin(16, 2);

  lcd.print("Kulucka Makinasi");

  lcd.setCursor(0, 1);

  lcd.print("  Baslatiliyor");

  delay(5000);

  lcd.clear();

  dht.begin();

  pinMode(heaterPin, OUTPUT);

  stepper.setSpeed(20);

}



void loop() {

  temperatureControl();

  incubatorControl();

}

void incubatorControl() {

  for(int i=1;i<=incubationPeriod;i++){

  // Sağa dönme

  stepper.step(512); // 512 adım = çeyrek tur

  delay(1000); // 4 saat bekle



  // Sola dönme

  stepper.step(-512); // -512 adım = çeyrek tur (ters yönde)

  delay(1000); // 4 saat bekle

  }

 

}





void temperatureControl() {

 

for(int i=1;i<=incubationPeriod;i++){

  float temperature = dht.readTemperature();

  float humidity = dht.readHumidity();

  lcd.setCursor(0, 1);

  lcd.print(temperatureThreshold);

  lcd.print("C    ");

  lcd.print(temperature);

  lcd.print("C");

  lcd.setCursor(0, 0);

  lcd.print("56.00%    ");

  lcd.print(humidity);

  lcd.print("%");

  delay(5000);

  lcd.clear();

  unsigned long remainingDays = calculateRemainingDays();

  lcd.setCursor(0, 0);

  lcd.print("Kalan Gun:");

  lcd.print(remainingDays);

  lcd.print(" gun");

  delay(5000);

  lcd.clear();

  controlHeater(temperature);

  delay(1000);}

}



unsigned long calculateRemainingDays() {

  unsigned long elapsedTime = millis() / 1000;

  unsigned long remainingTime = (incubationPeriod * 100) - elapsedTime;

  unsigned long remainingDays = remainingTime / 100;

  return (remainingDays > 0) ? remainingDays : 0;

}



void controlHeater(float temperature) {

  if (temperature < temperatureThreshold) {

    digitalWrite(heaterPin, HIGH); 

  } else {

    digitalWrite(heaterPin, LOW); 

  }

}
 
Çözüm
Millis ile beraber if ve for döngüsü ile galiba yapılabilir şu an aklıma başka nasıl yapılacağı pek gelmiyor.

Daha önce millis ve if kullanarak bir saat yapmıştım kodu inceleyerek çalışma mantığını anlayabilir ve işinize yarayacak kısmını kopyalayabilirsiniz.

C++:
#include <LCD_I2C.h>

LCD_I2C lcd(0x27, 16, 2);

int min = 17;
int hour = 19;
int sec = 0;

unsigned long old_sec;
unsigned long new_sec;

void timer() {

 new_sec = (millis() / 1000);

 if (old_sec < new_sec) {
 sec++;
 old_sec = new_sec;
 }

 if (sec == 60) {
 min++;
 sec = 0;
 lcd.clear();
 } else if (min == 60) {
 hour++;
 min = 0;
 lcd.clear();
 } else if (hour == 24) {
 hour = 0;
 min = 0;
 sec = 0;
 lcd.clear();
 }
}

void setup() {

 lcd.begin();
 lcd.backlight();
}

void loop() {
 timer();

 lcd.setCursor(1, 0);
 lcd.print("Hour");
 lcd.setCursor(2, 1);
 lcd.print(hour);

 lcd.setCursor(7, 0);
 lcd.print("Min");
 lcd.setCursor(8, 1);
 lcd.print(min);

 lcd.setCursor(12, 0);
 lcd.print("Sec");
 lcd.setCursor(13, 1);
 lcd.print(sec);
}
Sebebi çok büyük ihtimalle delay fonsiyonu çünkü delay fonksiyonu bekle demektir ve kelimenin tam anlamıyla Arduino hiçbir halt yapmadan bekler.

Sebebi çok büyük ihtimalle delay fonsiyonu çünkü delay fonksiyonu bekle demektir ve kelimenin tam anlamıyla Arduino hiçbir halt yapmadan bekler.

Delay fonksiyonu yerine millis kullanarak kodu tekrar oluşturmaya çalışın.
 
Millis ile beraber if ve for döngüsü ile galiba yapılabilir şu an aklıma başka nasıl yapılacağı pek gelmiyor.

Daha önce millis ve if kullanarak bir saat yapmıştım kodu inceleyerek çalışma mantığını anlayabilir ve işinize yarayacak kısmını kopyalayabilirsiniz.

C++:
#include <LCD_I2C.h>

LCD_I2C lcd(0x27, 16, 2);

int min = 17;
int hour = 19;
int sec = 0;

unsigned long old_sec;
unsigned long new_sec;

void timer() {

 new_sec = (millis() / 1000);

 if (old_sec < new_sec) {
 sec++;
 old_sec = new_sec;
 }

 if (sec == 60) {
 min++;
 sec = 0;
 lcd.clear();
 } else if (min == 60) {
 hour++;
 min = 0;
 lcd.clear();
 } else if (hour == 24) {
 hour = 0;
 min = 0;
 sec = 0;
 lcd.clear();
 }
}

void setup() {

 lcd.begin();
 lcd.backlight();
}

void loop() {
 timer();

 lcd.setCursor(1, 0);
 lcd.print("Hour");
 lcd.setCursor(2, 1);
 lcd.print(hour);

 lcd.setCursor(7, 0);
 lcd.print("Min");
 lcd.setCursor(8, 1);
 lcd.print(min);

 lcd.setCursor(12, 0);
 lcd.print("Sec");
 lcd.setCursor(13, 1);
 lcd.print(sec);
}
 
Çözüm

Geri
Yukarı