arduino + ds18b20 + step motor kontrolü

hknhc

Üye
Katılım
17 Haz 2009
Mesajlar
88
Puanları
1
Yaş
47
Merhaba,
Üstadlar bir bakarsa mutlu olacağım. ds18b20 den okuyacağımız sıcaklığa bağlı olarak step motoru kontrol etmek istiyoruz. Sıcaklık 24 derece üzerinde ise step motor 4 tur saat yönünde ve sıcaklık 19 dereceye düşene kadar sabit, 19 dereceye düşünce 4 tur saat yönüne ters hareket ettirerek sıcaklık 24 olana kadar sabit olarak kontrol etmek istiyorum. Kod yazma konusunda sıkıntılarım var. Sıcaklığı okutup ekrana yazdırdım lakin sıcaklığa bağlı olarak step motoru hareket ettiren kodu yazamıyorum.

//kullanılacak kütüphaneler
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
#include <Stepper.h>

// Haberleşme kablosu Arduino'nun üçüncü bacağına bağlı
#define ONE_WIRE_BUS 3
// Herhangi bir OneWire cihazıyla iletişim kurabilmesi için OneWire örneği belirle
// (sadece Maxim/Dallas entegreleriyle değil)
LiquidCrystal Lcd(7, 8, 9, 10, 11, 12);
OneWire oneWire(ONE_WIRE_BUS);
// Onewire referansımızı Dallas Sıcaklık olarak belirle
DallasTemperature ds18b(&oneWire);
int motorPin1 = 2;
int motorPin2 = 4;
int motorPin3 = 5;
int motorPin4 = 6;
int delayTime = 1;
int tempMax = 24;
int tempmin = 19;
const int stepsPerRevolution = 48;
Stepper myStepper(stepsPerRevolution, 2, 4, 5, 6);


void setup(void)
{
Serial.begin(9600); //Seri haberleşmeye başla
ds18b.begin();
delay(1000);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("SICAKLIK : ");
lcd.setCursor(0, 1);
lcd.print("camlicaortaokulu");
pinMode (motorPin1, OUTPUT);
pinMode (motorPin2, OUTPUT);
pinMode (motorPin3, OUTPUT);
pinMode (motorPin4, OUTPUT);
myStepper.setSpeed(150);

}

void loop(void)
{
// Sıcaklığı almak için komut yolla
ds18b.requestTemperatures();
lcd.setCursor(10, 0);
lcd.println(ds18b.getTempCByIndex(0));
//Her bir saniyede değeri güncelle
delay(1000);

float temp = ds18b.getTempCByIndex(0);

if
(temp < tempmin) {
myStepper.step(4 * stepsPerRevolution);
}
else
{
myStepper.step(-4 * stepsPerRevolution);
}

Biraz daha düzenledim
 
Son düzenleme:
Bişey soracağım. Sıcaklık 24 üzerine çıkınca ya da 19 derece altına düşünce sürekli dönecek mi yoksa 4 tur dönüp duracak mı?

GT-I9500 cihazımdan Tapatalk kullanılarak gönderildi
 
Bişey soracağım. Sıcaklık 24 üzerine çıkınca ya da 19 derece altına düşünce sürekli dönecek mi yoksa 4 tur dönüp duracak mı?

GT-I9500 cihazımdan Tapatalk kullanılarak gönderildi
Bir kez 4 turluk dönüş olacak. Yani duracak
 
İşteyim şu an, bi ara bakıp cevap yazarım.

GT-I9500 cihazımdan Tapatalk kullanılarak gönderildi
 
İşteyim şu an, bi ara bakıp cevap yazarım.

GT-I9500 cihazımdan Tapatalk kullanılarak gönderildi
hocam müteşekkir olacağım beni bayadır uğraştırıyor. Bu işi for ile mi yapmalıyım? Öyle olacaksa en azından biraz daha uğraşırım.
 
Step motor ile hiç çalışmadım. Kütüphaneyi incelemem gerek cevap verebilmem için.

GT-I9500 cihazımdan Tapatalk kullanılarak gönderildi
 
Kod:
//kullanılacak kütüphaneler
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
#include <Stepper.h>

// Haberleşme kablosu Arduino'nun üçüncü bacağına bağlı
#define ONE_WIRE_BUS 3
// Herhangi bir OneWire cihazıyla iletişim kurabilmesi için OneWire örneği belirle
// (sadece Maxim/Dallas entegreleriyle değil)
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
OneWire oneWire(ONE_WIRE_BUS);
// Onewire referansımızı Dallas Sıcaklık olarak belirle
DallasTemperature ds18b(&oneWire);
int motorPin1 = 2;
int motorPin2 = 4;
int motorPin3 = 5;
int motorPin4 = 6;
int delayTime = 1;
int tempMax = 24;
int tempmin = 19;
bool dur = false;
const int stepsPerRevolution = 48;
Stepper myStepper(stepsPerRevolution, 2, 4, 5, 6);


void setup(void)
{
  Serial.begin(9600); //Seri haberleşmeye başla
  ds18b.begin();
  delay(1000);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("SICAKLIK : ");
  lcd.setCursor(0, 1);
  lcd.print("camlicaortaokulu");
  pinMode (motorPin1, OUTPUT);
  pinMode (motorPin2, OUTPUT);
  pinMode (motorPin3, OUTPUT);
  pinMode (motorPin4, OUTPUT);
  myStepper.setSpeed(150);

}

void loop(void)
{
  // Sıcaklığı almak için komut yolla
  ds18b.requestTemperatures();
  lcd.setCursor(10, 0);
  lcd.println(ds18b.getTempCByIndex(0));
  //Her bir saniyede değeri güncelle
  delay(1000);

  float temp = ds18b.getTempCByIndex(0);

  if (temp < tempmin)
  {
    if (dur == false) {
      myStepper.step(4 * stepsPerRevolution);
      dur = true;
    }
  } else if (temp > tempMax)
  {
    if (dur == false) {
      myStepper.step(-4 * stepsPerRevolution);
      dur = true;
    }
  } else {
    dur = false;
  }
}

Kodu denemedim. Sıkıntı çıkarsa yazarsın.
 
Kod:
//kullanılacak kütüphaneler
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
#include <Stepper.h>

// Haberleşme kablosu Arduino'nun üçüncü bacağına bağlı
#define ONE_WIRE_BUS 3
// Herhangi bir OneWire cihazıyla iletişim kurabilmesi için OneWire örneği belirle
// (sadece Maxim/Dallas entegreleriyle değil)
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
OneWire oneWire(ONE_WIRE_BUS);
// Onewire referansımızı Dallas Sıcaklık olarak belirle
DallasTemperature ds18b(&oneWire);
int motorPin1 = 2;
int motorPin2 = 4;
int motorPin3 = 5;
int motorPin4 = 6;
int delayTime = 1;
int tempMax = 24;
int tempmin = 19;
bool dur = false;
const int stepsPerRevolution = 48;
Stepper myStepper(stepsPerRevolution, 2, 4, 5, 6);


void setup(void)
{
  Serial.begin(9600); //Seri haberleşmeye başla
  ds18b.begin();
  delay(1000);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("SICAKLIK : ");
  lcd.setCursor(0, 1);
  lcd.print("camlicaortaokulu");
  pinMode (motorPin1, OUTPUT);
  pinMode (motorPin2, OUTPUT);
  pinMode (motorPin3, OUTPUT);
  pinMode (motorPin4, OUTPUT);
  myStepper.setSpeed(150);

}

void loop(void)
{
  // Sıcaklığı almak için komut yolla
  ds18b.requestTemperatures();
  lcd.setCursor(10, 0);
  lcd.println(ds18b.getTempCByIndex(0));
  //Her bir saniyede değeri güncelle
  delay(1000);

  float temp = ds18b.getTempCByIndex(0);

  if (temp < tempmin)
  {
    if (dur == false) {
      myStepper.step(4 * stepsPerRevolution);
      dur = true;
    }
  } else if (temp > tempMax)
  {
    if (dur == false) {
      myStepper.step(-4 * stepsPerRevolution);
      dur = true;
    }
  } else {
    dur = false;
  }
}

Kodu denemedim. Sıkıntı çıkarsa yazarsın.


Hocam çok sağolasın çalıştı gibi görünüyor. Rica etsem mantığını biraz açıklar mısın?
Yalnız hocam motor her iki durumda da saat yönünde dönüyor
 
Son düzenleme:
Programcılıkta if (eğer) ve else (değilse) karar yapısı olarak geçer.

Kod:
if (temp < tempmin) // Eğer sıcaklık minimum değerin altında ise
  {
   if (dur == false) { // motor daha önce çalışmamış ise
     myStepper.step(4 * stepsPerRevolution); // Motoru çalıştır
     dur = true; // motor çalıştıktan sonra tekrar çalışmasına izin verme
   }
  } else if (temp > tempMax) { //eğer sıcaklık maksimumdan yüksek ise
   if (dur == false) { // motor daha önce çalışmamış ise
     myStepper.step(-4 * stepsPerRevolution); Motoru ters yönde çalıştır
     dur = true; // motor çalıştıktan sonra tekrar çalışmasına izin verme
   }
  } else { // sıcaklık değeri minimumdan düşük ve maksimumdan yüksek değilse
   dur = false; //motoru hazırda beklet
  }

Ancak bu şekilde anlatabilirim. Daha iyi kavrayabilmen için programlama temellerini öğrenmelisin.
 

Forum istatistikleri

Konular
129,867
Mesajlar
930,872
Kullanıcılar
452,732
Son üye
erencok

Yeni konular

Çevrimiçi üyeler

Geri
Üst