Motor kaç kez Çalıştı Sayıcı

Başlatan Kaanx, 13 Mayıs 2014, 16:51:17

Kaanx

Merhabalar, Elimde ki arm tabanlı kartım ile nem sensörüne bağlı olarak servo motor sürüyorum. parametlerime göre motor bir kapağı acıp kapatıyor. Ben istiyorum ki benim motorum günde kaç kez çalıştı LCD üzerinde nem değerinin yanında göreyim. Sorunum surda başlıyor. Ben söyle dusundum bir flag atasam ve servo her çalıştıgında flag 1 olsa daha sonra sayıcıya 1 eklese ve flag 0 olsa flag 0 olunca da sayıcı=sayıcı değerini sürekli tutsa. Bunu yaptım fakat söyle bir sorunla karşılaştırm. Motorumu sensör bilgisine göre sürdüğüm için motor çalıştıgında mesela nem değerimin altına düşene kadar çalısıcak bu esnada benim sayıcımda sürekli sayıyorr 1 kez sayıp bırakmıyor yani. Cunku ben flag =1 i bir kontrol döngümün içinde veriyorum. yukarıda da dediğim gibi nem değerim > optimum değer ise motor calısıyor ve nem değerim < optimum değer ise duruyor . Bu esnada sürekli döngüde oldugu için flag 0 lasam da nem değerim > optimum değer oldugu için yine 1 alıyor ve buda döngüye dahil oluyor gibi. İşin içinden cıkamadım yardımlarınızı bekliyorum arkadaşlar

JKramer

if( nem > optimum )
{
    ServoRun();

    if( !servoStatus )
    {
        servoStatus = 1;
        servoCount++;
    }
}
(...)

Kaanx

benimkisi bu şekilde işliyor bu arduino üzerinde olan mesela hocam

  else if(humidity>=OPTIMUM_HUMIDITY){
    digitalWrite(HUMIDITY_RELAY_PIN, LOW);
    int pos=80;
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);
    flag=1;
    motorsayici(flag);
  }
    
}


void motorsayici(int flag){
  
    if(flag==1){
    
      counter=counter+1;
    }else if(flag==0){
    
    
      counter=counter;
      
    }
    
    
   
   }


Sizin dedğinizide yaptım diye dusunuyorum fakat yinede olmadı

JKramer

Tam dikkat etmemişsiniz, şuna benzer olmalı:
else if( humidity >= OPTIMUM_HUMIDITY )
{
    digitalWrite( HUMIDITY_RELAY_PIN, LOW );
    int pos = 80;
    myservo.write( pos );            // tell servo to go to position in variable 'pos'
    delay( 15 );

    if( flag == 0 )
    {
        flag = 1;
        counter = counter + 1;
    }
}


Motoru kapattığınız yerde de flag sıfır olacak. Bir de "counter=counter" gibi bir satıra ne burada ne de başka bir yerde gerek yok.

Kaanx

#4
şimdi oldu hocam :) tesekkur ederim kodu derleyip denemedim ama denicem en kısa zamanda :) Ve sımdı 2. soruma gelebilirim sanırım. aynı olay bitirme projem içinde var renk tanıma ile thread kosturuyorum ve istiyorum 1 kez olussun bu thread ben elimi o bölgeye götürdüğümde aynı thread ten bir sürü olusuyor konu ile ilgili bilgi surada mevcut hocam eger vaktinz bakabilir misiniz ? https://forum.ubuntu-tr.net/index.php?topic=42990.msg504370#msg504370 butonlarım bu sekılde ve kod kosturmaya başladıgıdna su oluyor
https://forum.ubuntu-tr.net/index.php?topic=42990.25 elimi her hangi bi yere getirdiğim o işlem 1 kez yapılması gerekirken bir sürü yapıyor bu da bilgisayarda kasmaya neden oluyor. benzer konular diye dusunuyorum hocam. Yardımlarınızı bekliyorum :)

konu genel başlık https://forum.ubuntu-tr.net/index.php?topic=42990.0

mesaj birleştirme:: 14 Mayıs 2014, 07:54:13

Alıntı yapılan: JKramer - 13 Mayıs 2014, 17:35:51
Tam dikkat etmemişsiniz, şuna benzer olmalı:
else if( humidity >= OPTIMUM_HUMIDITY )
{
    digitalWrite( HUMIDITY_RELAY_PIN, LOW );
    int pos = 80;
    myservo.write( pos );            // tell servo to go to position in variable 'pos'
    delay( 15 );

    if( flag == 0 )
    {
        flag = 1;
        counter = counter + 1;
    }
}


Motoru kapattığınız yerde de flag sıfır olacak. Bir de "counter=counter" gibi bir satıra ne burada ne de başka bir yerde gerek yok.

su kısımda aklıma takılan olay ise flag leri nerede değiştiriyorum hocam ? ben kendi kodumda o durum içerisinde değiştiriyorum sürekli sizinkisinde flag değerinin değiştiği yada flag değerinin geleceği bir durum yok sanırım

mesaj birleştirme:: 13 Mayıs 2014, 17:56:23

Genel olarak arduino üzerinde kosan kod

#include <dht.h>

#include <Timer.h>
#include <Event.h>

#include <Servo.h>
#include <dht11.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);           // select the pins used on the LCD panel


Servo myservo;
int counter=0;
int flag=0;
int val;    // variable to read the value from the analog pin 
const int Ozone_Generator_Pin = 0;                    //connect one LED to this pin (with appropriate current-limiting resistor of course)
//const int Ozone_Generator_Pin_OFF= 8;                    //connect another LED to this pin (don't forget the resistor)
const unsigned long PERIOD1 = 60000;    //one second
//const unsigned long PERIOD2 = 10000;   //ten seconds
Timer t;                               //instantiate the timer object



#define SENSOR_PIN 2 //DHT22 Pın number 


#define TEMP_RELAY_PIN 5
#define HUMIDITY_RELAY_PIN 6
#define OPTIMUM_TEMP 25
#define OPTIMUM_HUMIDITY 98
#define Min_humidity  93
#define TEMP_LIMIT 1
#define HUMIDITY_LIMIT 2
#define DELAY 2000
#define Ozone_Generator_Pin 13
 
dht sensor;  //dht22 sensor prototip
//dht11 sensor;
//LiquidCrystal lcd(LCD_RESET, LCD_ENABLE, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
//int pos= 0;

 
void setup() {
   pinMode(TEMP_RELAY_PIN, OUTPUT); 
   pinMode(HUMIDITY_RELAY_PIN, OUTPUT);
   pinMode(Ozone_Generator_Pin,OUTPUT);
   //pinMode(Ozone_Generator_Pin_OFF, OUTPUT);
   myservo.attach(3);
   digitalWrite(TEMP_RELAY_PIN, LOW); 
   digitalWrite(HUMIDITY_RELAY_PIN, LOW); 
   Serial.begin(9600);
   myservo.write(80); 
   counter=0;  
  /*Ozone Generator Zamanalama  */
   // t.every(20000,doSomething);
  t.oscillate(Ozone_Generator_Pin, PERIOD1, HIGH);
  //t.oscillate(Ozone_Generator_Pin_OFF, PERIOD2, LOW);
     //t.pulse(Ozone_Generator_Pin,10 * 1000, LOW); // 10 seconds will be open the ozone generator
      // t.pulse(pin, 10 * 60 * 1000, HIGH); // 10 minutes 
      //t.pulse(Ozone_Generator_Pin,10*60*1000,LOW);   // 10 minute will be close the ozone generator
      lcd.begin(16, 2);               // start the library

   lcd.setCursor(0,0);             // set the LCD cursor   position 

   lcd.print("Nem Kontrol");  // print a simple message on the LCD
    
   delay(DELAY);
   lcd.clear();
   delay(DELAY);
}
 
void loop() {
    
for(;;){
    uint32_t start = micros();
   int status = sensor.read22(SENSOR_PIN);
    uint32_t stop = micros();
   
   printDebugData(status);
   
   if (status == 0) {
      float temp = (float)sensor.temperature;
      float humidity = (float)sensor.humidity;
      checkTempHumidity(temp, humidity);
      printSerialPortData(temp, humidity);
      printLcdData(temp, humidity);
   
   t.update();   
  }
   
       
} 
   
   delay(DELAY);
   
   
}
 
void printDebugData(int status) {
   Serial.print("Read sensor: ");
   switch (status) {
     case 0: Serial.println("OK"); break;
     case -1: Serial.println("Checksum Error"); break;
     case -2: Serial.println("Time Out Error"); break;
     default: Serial.println("Unknown Error"); break;
   }
}
void printLcdData(float temp, float humidity) {
   lcd.home();
   lcd.print("Nem:");
   lcd.print(humidity);
   lcd.print("%");
   lcd.setCursor(0, 1);
   lcd.print("Isi:");
   lcd.print(temp);
   lcd.print("C");
   lcd.setCursor(11,1);
   lcd.print("Cn:");
   lcd.print(counter); 
} 
 
void printSerialPortData(float temp, float humidity) {
   Serial.print("Humidity (%): ");
   Serial.println(humidity, 2);
   Serial.print("Temperature (C): ");
   Serial.println(temp, 2);
   
}
 
void checkTempHumidity(float temp, float humidity) {
    delay(DELAY);
   checkTemp(temp);
   checkHumidity(humidity);
}
 
void checkTemp(float temp) {
   if (temp < (OPTIMUM_TEMP)) {
       digitalWrite(TEMP_RELAY_PIN, LOW); 
   } else if (temp > (OPTIMUM_TEMP)) {
      digitalWrite(TEMP_RELAY_PIN, HIGH); 
   }
}
 
void checkHumidity(float humidity) {
  
  if(humidity<Min_humidity){
   digitalWrite(HUMIDITY_RELAY_PIN, HIGH);
   int pos=110;
   myservo.write(pos);   // tell servo to go to position in variable 'pos' 
   
    delay(15); 
    flag=0;
    motorsayici(flag);
  }
  
  else if(humidity>=OPTIMUM_HUMIDITY){
    digitalWrite(HUMIDITY_RELAY_PIN, LOW);
    int pos=80;
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);
    flag=1;
    motorsayici(flag);
  }
    
}


void motorsayici(int flag){
  
    if(flag==1){
    
      counter=counter+1;
    }else if(flag==0){
    
    
      counter=counter;
      
    }
    
    
   
   }


tamamını görebilirsiniz hocam burada. ben flag değerlerini kontrol ettiğim yerlere göre atamıs durumdayım mesela nem optimumdan kucukse flag =0 ; buyukse flag =1 yapıyorum sizinkinde bunu anlayamadım

Kaanx


sadogan

Motor çalıştığında
                       enable_flag=1;
motor durduğunda
                       if(enable_flag==1){sayaç++;enable_flag=0;}

Kaanx

HOcam o işlemi surada nasıl uygulıcam snaırım dedğinizi yapmıstım ben olay burada kopuyor

else if(humidity>=OPTIMUM_HUMIDITY){    digitalWrite(HUMIDITY_RELAY_PIN, LOW);    int pos=80;    myservo.write(pos);              // tell servo to go to position in variable 'pos'     delay(15);    flag=1;    motorsayici(flag);  }


kısmında flag =1 oluyor sonra atlıyor sayıcı arttıyor. sonra flag =0 oluyor sizin işlem gibi zaten buda .

ama burada else if için surekli nem kontrolu yapıldıgı için yani su kısımda

void checkHumidity(float humidity) {    if(humidity<Min_humidity){   digitalWrite(HUMIDITY_RELAY_PIN, HIGH);   int pos=110;   myservo.write(pos);   // tell servo to go to position in variable 'pos'        delay(15);     flag=0;    motorsayici(flag);  }    else if(humidity>=OPTIMUM_HUMIDITY){    digitalWrite(HUMIDITY_RELAY_PIN, LOW);    int pos=80;    myservo.write(pos);              // tell servo to go to position in variable 'pos'     delay(15);    flag=1;    motorsayici(flag);  }    }


flag =0 olunca da surekli dongu içinde oldugunda flag yine =1 oluyor bu yuzden bu da sonsuz donguye dahil oluyor gibi bişi oluyor. Bunu çözemedim

Kaanx


sadogan

#9
Bu flagı motor un start ve stopunda yapman gerekiyor eger böyle yapıyorsan yinede olmuyorsa
motor kafasına göre çalışıyor.
flag=1 yalnızca motor çalıştığında yapmanız gerekiyor.