اطلاعیه

Collapse
No announcement yet.

دستگاه جوجه کشی

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    دستگاه جوجه کشی

    سلام و عرض ادب و خسته نباشید .
    این برنامه چهار سال پیش نوشته شده و به خاطر مشغله کاری نتونستم درست کنم .
    در برنامه به دو مشکل بر خوردم
    اولی این که یک متور تخم مرغ ها رو میچرخونه به این صورت که متور به راست میچرخه و با برخورد به لیمیت سویچ قطع می‌شود و برای یک ساعت منتظر میمونه و به چپ میچرخه و با برخورد به لیمیت سویچ قطع می‌شود و یک ساعت منتظر میمونه و دوباره...که این کار درست انجام نمیشه و با تحریک کلید متور قطع نمیشه و روشن میمونه.
    دوم برای تهویه هست که در صورت گرم بودن هوا یا بالا بودن رطوبت هیتر (لامپ)قطع می‌شود و فن روشن می‌شود
    که با بالا بودن رطوبت و گرمای هوا هیتر قطع میشود ولی فن روشن نمی‌شود به صورتی که با روشن خاموش شدن هیتر ,فن هم روشن خاموش میشود.
    تابع گردش موتور‌ها
    کد HTML:
    void motor(){                                   //تابع گردش موتور‌ها
      
      btnLE.update();
      btnRI.update();
      if (btnRI.fell()|| btnLE.fell()) {
        digitalWrite(MOTORCPIN,LOW);
        digitalWrite(MOTORCCPIN,LOW);
        lastMotorchange = millis();
        isWaiting = true;
        }
      if (millis() - lastMotorchange > MOTOR_WAIT && isWaiting) {
        if (motorClockwise) {
          digitalWrite(MOTORCPIN,LOW);
          digitalWrite(MOTORCCPIN,HIGH);
        }else{
          digitalWrite(MOTORCPIN,HIGH);
          digitalWrite(MOTORCCPIN,LOW);
        }
        isWaiting = false;
        motorClockwise =!motorClockwise;
        lastMotorchange = millis();
    
      }
    }​
    مربوط به دما که فن فعال نمیشود
    کد HTML:
    void autoControl() {
      if (day <= 18) {
        if (humidity > AUTOHUMFIRST || temperature > AUTOTEMPFIRST) {  //اگر دما یا رطوبت از میزان تعیین شده بالاتر بود
          digitalWrite(CONTROLFANPIN,HIGH);
    
        }else{
          digitalWrite(CONTROLFANPIN,LOW);
        }
        if (temperature < AUTOTEMPFIRST) {
          digitalWrite(HEATLAMPPIN,HIGH);
        }else{
          digitalWrite(HEATLAMPPIN,LOW);
        }
        if (humidity < AUTOHUMFIRST) {
          digitalWrite(HUMIDIFIERPIN,HIGH);
        }else{
          digitalWrite(HUMIDIFIERPIN,LOW);
        }
      }else{
        if (humidity > AUTOHUMSECOND || temperature > AUTOHUMSECOND) {  //اگر دما یا رطوبت بالاتر از حد دستی وارد شده بود
          digitalWrite(CONTROLFANPIN,HIGH);
    
        }else{
          digitalWrite(CONTROLFANPIN,LOW);
        }
        if (temperature < AUTOTEMPSECOND) {
          digitalWrite(HEATLAMPPIN,HIGH);
        }else{
          digitalWrite(HEATLAMPPIN,LOW);
        }
        if (humidity < AUTOHUMSECOND) {
          digitalWrite(HUMIDIFIERPIN,HIGH);
        }else{
          digitalWrite(HUMIDIFIERPIN,LOW);
        }
    
      }
    }​
    کد رو به صورت کامل و کامنت گذاری شده میزارم تا بقیه دوستان هم در صورت اصلاح شدن برنامه استفاده کنن.

    کد HTML:
    #include <Wire.h>
    #include <AHT10.h>
    #include <Bounce2.h>
    #include <LiquidCrystal_I2C.h>
    
    
    #define FAN_INTERVAL 1800000  //فن هر نیم ساعت یک بار خاموش و روشن میشود
    #define MOTOR_WAIT 360000    //موتور پس از یک ساعت توقف به کار می افتد
    #define SENSORTIMER 2000      //وقفه بین هر بار خواندن سنسور
    #define LONGPRESS 3000        //مدت زمان مورد نیاز برای نگه داشتن دکمه و ثبت متغیر
    #define STEP 0.1              //گام تغییر متغیرها
    
    ////////////////////////////پین‌های ورودی////////////////////////////////
    
    #define MANUALAUTOPIN 1       // پین مورد استفاده برای دکمه‌ی حالت دستی و اتومات
    #define UPBUTTON 0            //پین مورد استفاده برای دکمه‌ی بالا
    #define DOWNBUTTON 2          // دکمه‌ی پایین
    #define HUMIDITYPIN 3         // دکمه‌ی رطوبت
    #define RIGHTTURNSWITCH 4     //کلید توقف موتور-چپ
    #define LEFTTURNSWITCH 5      // کلید توقف موتور-راست
    
    ////////////////////////////پین‌های خروجی///////////////////////////////
    
    #define MANUALMODELED 6       // پین مورد استفاده برای ال ای دی حالت اتوماتیک و دستی
    #define MOTORCPIN 7           //پین راست گرد موتور متصل به l298n
    #define MOTORCCPIN 8          //پین چپ گرد متصل به l298n
    #define INTERVALFANPIN 9      //پین متصل به رله‌ی فن دوره ای
    #define CONTROLFANPIN 10      //فن کنترل دما
    #define HUMIDIFIERPIN 11      //پین ال ای دی مرطوب کننده
    #define HEATLAMPPIN 12        //پین لامپ گرم کننده
    #define LED_PIN 13
    
    //////////////////////////////دما و رطوبت مورد نظر برای حالت اتوماتیک//////
    #define AUTOTEMPFIRST  32.7  //دما و رطوبت مورد نظر برای روزهای اول تا هجدهم و نوزدهم به بعد.
    #define AUTOHUMFIRST  60.0
    #define AUTOTEMPSECOND  37.2
    #define AUTOHUMSECOND  70.0
    
    int ledState = LOW;
    String state = "auto";         //متغیر حالت برای نگهداری حالت دستگاه
    bool isWaiting = false;        //مربوط به چرخش موتور‌
    bool motorClockwise = true;    //آیا موتور به راست میچرخد؟
    bool intervalFanState = true;  //مربوط به چرخش فن دوره ای
    
    ///////////////متغیر‌های مورد استفاده برای نگهداری زمان//////////////////
    unsigned long currentMillis = 0;        //زمان حال
    unsigned long lastButtonPress = 0;      //آخرین زمان فشرده شدن دکمه
    unsigned long lastSensorReading = 0;    //آخرین زمانی که سنسور خوانده شده
    unsigned long lastdaymillis = 0;        //آخرین زمانی که تعداد روز‌ها شمرده شده
    unsigned long lastfanmillis = 0;        //آخرین زمانی که فن دوره ای کار کرده
    unsigned long lastMotorchange = 0;      //آخرین زمانی که موتور تغییر حالت داده
    
    /////////// آرایه‌های مورد نیاز برای تبدیل و نمایش دما و رطوبت بصورت کارکتری///
    
    char tempchar[5];
    char humchar[5];
    
    //////////////////// متغیر‌های مربوط به دما و رطوبت در حالت دستی/////////////////////
    
    float minManTemp = 37.6;  //مقادیر اولیه برای مینیمم و ماکسیمم
    float maxManTemp = 37.7;
    float minManHum = 59;
    float maxManHum = 60;
    
    byte day = 1;             //برای نگهداری روز
    float humidity ;          //رطوبت
    float temperature ;       //دما
    uint8_t readStatus = 0;   //مربوط به سنسور
    
    ///////////////////////ایجاد شیئ‌ها ا////////////////////////
    
    AHT10 sensor(AHT10_ADDRESS_0X38); //سنسور
    LiquidCrystal_I2C lcd(0x27, 16, 2); // ال سی دی
    
    //////////////////////////دکمه ها و کلید ها///////////////
    Bounce btnMA = Bounce();    //دکمه‌ی تغییر حالت دستی و اتومات
    Bounce btnHU = Bounce();    //دکمه‌ی رطوبت
    Bounce btnUP = Bounce();    //دکمه‌ی جهت بالا
    Bounce btnDN = Bounce();    //دکمه‌ی جهت پایین
    Bounce btnRI = Bounce();    //کلید راست گرد
    Bounce btnLE = Bounce();    //کلید چپ گرد
    //////////////////////////// توابع ///////////////////////////////////
    
    byte button(Bounce debouncer){                  //در صورت فشردن طولانی ۲ و در صورت فشردن کوتاه ۱ بر میگرداند
    
      if (debouncer.fell() ) {  // در صورت فشرده بودن دکمه
        lastButtonPress = millis();
        currentMillis = millis();
        while (!debouncer.update() ){ //اگر هنوز دکمه فشرده بود
          unsigned long pressedTime = millis() - lastButtonPress;
          delay(10);
          if (pressedTime >= LONGPRESS){
            return 2;
              }
            }
        return 1;
      }
    }
    
    void setManVar(float &var, String message){     //تابع تنظیم متغیر‌ها در حالت دستی
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(message);
      lcd.print(var);
      lastButtonPress = millis();
      do {
        btnDN.update();
        btnUP.update();
        if (btnDN.fell()) {
          Serial.println("Down Button Pressed");
          lastButtonPress = millis();
          var -= STEP;
          lcd.setCursor(0,0);
          lcd.print(message);
          lcd.print(var);
        }else if (btnUP.fell()){
          Serial.println("Up Button pressed.");
          lastButtonPress = millis();
          var += STEP;
          lcd.setCursor(0,0);
          lcd.print(message);
          lcd.print(var);
        }
    
        delay(10);
      }while (millis() - lastButtonPress < LONGPRESS);
    
      Serial.println("Returning to manual mode...");
      lcd.clear();
      state = "manual";
    }
    
    void showData(){                                //تابع نمایش دما و رطوبت روی ال سی دی
    
      dtostrf(humidity,4, 1, humchar);
      dtostrf(temperature,4, 1, tempchar);
      char line1 [17];
      char line2 [17];
      sprintf(line1, "HUM : %s%%", humchar);
      sprintf(line2, "TEMP: %sC D%d ", tempchar,day);
    
      lcd.setCursor(0,0); // ردیف اول ال سی دی
      lcd.print(line1);
      lcd.setCursor(0,1); //ردیف دوم ال سی دی
      lcd.print(line2);
    
    }
    
    void readSensor(){                              //خواندن دما و رطوبت از سنسور
      
      if (currentMillis - lastSensorReading >= SENSORTIMER){
        
        sensor.readRawData();
        temperature =  sensor.readTemperature(AHT10_USE_READ_DATA);
        humidity = sensor.readHumidity(AHT10_USE_READ_DATA);
        lastSensorReading = millis();
    
      }else{
        
      }
    }
    
    void countDays(byte &day){                      //تابع شمارش تعداد روزهای سپری شده از زمان اجرای برنامه
      
      if (currentMillis - lastdaymillis >= 86400000){ //1 day = 24*60*60*1000 milliseconds...86400000
        day++;
        lastdaymillis = millis();
      }
    }
    
    void handleStates(){                            //تابع حالات سیستم:دستی، اتومات و ...
      if (button(btnMA) == 1){
        ledState = !ledState;
        digitalWrite(LED_PIN,ledState);
      }
      if (state == "auto"){
        digitalWrite(MANUALMODELED,LOW);
        readSensor();
        showData();
        autoControl();
    
        if (button(btnMA) == 2){
          Serial.println("BUTTON LONG PRESS, swithing to MANUAL");
          state = "manual";
        }
      }else if (state == "manual"){           //حالت دستی
        digitalWrite(MANUALMODELED,HIGH);
        readSensor();
        showData();
        manualControl();
          if (button(btnMA) == 2){            //اگر دکمه‌ی اتومات\دستی نگه داشته بشه
            Serial.println("BUTTON LONG PRESS, swithing to AUTO");
            state = "auto";
        }else if (button(btnHU)==1) {        //اگر دکمه‌ی رطوبت فشرده بشه
    
          state = "setMinHum";
    
        }else if (button(btnHU)==2){
    
          state = "setMaxHum";
    
        }else if (button(btnUP)==2){
    
          state = "setMaxTemp";
    
        }else if (button(btnDN)==2){
    
          state = "setMinTemp";
    
        }
    
      }else if (state == "setMinHum"){
        Serial.println("Setting Min. Humidity...");
        setManVar(minManHum,"Min Hum: ");
      }else if (state == "setMaxHum"){
        Serial.println("Setting Max. Humidity...");
        setManVar(maxManHum,"Max Hum: ");
      }else if (state == "setMinTemp"){
        Serial.println("Setting Min. Temperature...");
        setManVar(minManTemp,"Min Temp: ");
      }else if (state == "setMaxTemp"){
        Serial.println("Setting Max. Temperature...");
        setManVar(maxManTemp,"Max Temp: ");
      }
    }
    
    void motor(){                                   //تابع گردش موتور‌ها
      
      btnLE.update();
      btnRI.update();
      if (btnRI.fell()|| btnLE.fell()) {
        digitalWrite(MOTORCPIN,LOW);
        digitalWrite(MOTORCCPIN,LOW);
        lastMotorchange = millis();
        isWaiting = true;
        }
      if (millis() - lastMotorchange > MOTOR_WAIT && isWaiting) {
        if (motorClockwise) {
          digitalWrite(MOTORCPIN,LOW);
          digitalWrite(MOTORCCPIN,HIGH);
        }else{
          digitalWrite(MOTORCPIN,HIGH);
          digitalWrite(MOTORCCPIN,LOW);
        }
        isWaiting = false;
        motorClockwise =!motorClockwise;
        lastMotorchange = millis();
    
      }
    }
    
    void fan(){
      
      if (currentMillis- lastfanmillis >= FAN_INTERVAL) {
        
        if(intervalFanState){
          digitalWrite(INTERVALFANPIN, LOW);
          intervalFanState = false;
        }else{
          digitalWrite(INTERVALFANPIN, HIGH);
          intervalFanState = true;
        }
        lastfanmillis = millis();
      }
    }
    
    
    void manualControl(){
      if (humidity > maxManHum || temperature > maxManTemp) {  //اگر دما یا رطوبت بالاتر از حد دستی وارد شده بود
        digitalWrite(CONTROLFANPIN,HIGH);
    
      }else{
        digitalWrite(CONTROLFANPIN,LOW);
      }
      if (temperature < minManTemp) {
        digitalWrite(HEATLAMPPIN,HIGH);
      }else{
        digitalWrite(HEATLAMPPIN,LOW);
      }
      if (humidity < minManHum) {
        digitalWrite(HUMIDIFIERPIN,HIGH);
      }else{
        digitalWrite(HUMIDIFIERPIN,LOW);
      }
    }
    
    void autoControl() {
      if (day <= 18) {
        if (humidity > AUTOHUMFIRST || temperature > AUTOTEMPFIRST) {  //اگر دما یا رطوبت از میزان تعیین شده بالاتر بود
          digitalWrite(CONTROLFANPIN,HIGH);
    
        }else{
          digitalWrite(CONTROLFANPIN,LOW);
        }
        if (temperature < AUTOTEMPFIRST) {
          digitalWrite(HEATLAMPPIN,HIGH);
        }else{
          digitalWrite(HEATLAMPPIN,LOW);
        }
        if (humidity < AUTOHUMFIRST) {
          digitalWrite(HUMIDIFIERPIN,HIGH);
        }else{
          digitalWrite(HUMIDIFIERPIN,LOW);
        }
      }else{
        if (humidity > AUTOHUMSECOND || temperature > AUTOHUMSECOND) {  //اگر دما یا رطوبت بالاتر از حد دستی وارد شده بود
          digitalWrite(CONTROLFANPIN,HIGH);
    
        }else{
          digitalWrite(CONTROLFANPIN,LOW);
        }
        if (temperature < AUTOTEMPSECOND) {
          digitalWrite(HEATLAMPPIN,HIGH);
        }else{
          digitalWrite(HEATLAMPPIN,LOW);
        }
        if (humidity < AUTOHUMSECOND) {
          digitalWrite(HUMIDIFIERPIN,HIGH);
        }else{
          digitalWrite(HUMIDIFIERPIN,LOW);
        }
    
      }
    }
    ////////////////////////////END OF Custom Functions///////////////////////////////////
    
    void setup() {
      Serial.begin(9600);     //ارتباط سریال برای دیباگ کردن
    
      btnMA.attach(MANUALAUTOPIN,INPUT_PULLUP); // وصل کردن دکمه ها به پین ها
      btnHU.attach(HUMIDITYPIN,INPUT_PULLUP);
      btnUP.attach(UPBUTTON,INPUT_PULLUP);
      btnDN.attach(DOWNBUTTON,INPUT_PULLUP);
      btnRI.attach(LEFTTURNSWITCH,INPUT_PULLUP);
      btnLE.attach(RIGHTTURNSWITCH,INPUT_PULLUP);
      
      pinMode(MANUALMODELED, OUTPUT);     //معرفی خروجی ها
      pinMode(MOTORCPIN, OUTPUT);
      pinMode(MOTORCCPIN, OUTPUT);
      pinMode(INTERVALFANPIN,OUTPUT);
      pinMode(CONTROLFANPIN, OUTPUT);
      pinMode(HUMIDIFIERPIN, OUTPUT);
      pinMode(HEATLAMPPIN, OUTPUT);
      pinMode(LED_PIN,OUTPUT);
      
      sensor.begin();    //راه اندازی سنسور
      lcd.init();        // راه اندازی ال سی دی
      lcd.backlight();
      lcd.clear();
    
      digitalWrite(INTERVALFANPIN,HIGH);
      digitalWrite(MOTORCPIN,HIGH);
      digitalWrite(LED_PIN,ledState);
      
    }
    
    void loop() {
      currentMillis = millis();     //شمارنده‌ی تایم رو آپدیت میکنیم
      btnMA.update();               //دکمه‌ها رو میخونیم
      btnHU.update();
      btnUP.update();
      btnDN.update();
      btnLE.update();
      btnRI.update();
      readSensor();                 //سنسور را میخواند
      countDays(day);               //شمارش روز‌ها از زمان اجرای برنامه
      motor();                      //تابع گردش موتور‌ها
      handleStates();               //تابع مدیریت روتین‌ها
      fan();
    }​

    #2
    دوستان عزیز اعلام هذینه کنید لطفا

    دیدگاه


      #3
      درود
      دستگاه جوجه کشی به تعداد زیاد همراه با نقشه و برنامه در سایت وجود دارد جستجو کنید.

      دیدگاه


        #4
        تشکر بابت پاسخ و راهنمایی تون
        این برنامه رو خودم نوشتم و دوس داشتم تکمیل کنم
        برا همین نیاز به کمک و راهنمایی داشتم

        دیدگاه


          #5
          در ضمن بیشتر لینک های دانلود در اموزش ها برای سالهای قبل بوده و قابل استفاده و دانلود کردن نیستن .

          دیدگاه


            #6
            درود
            لینک زیر را ببینید :
            Adruino-controlled incubator for chicken eggs or other stuff.

            دیدگاه


              #7
              درود
              تشکر بابت راهنمایی
              لینکی که فرستاده بودید را مطالعه کردم چرخش متور وجود ندارد.

              دیدگاه


                #8
                نوشته اصلی توسط Milad jahed نمایش پست ها
                درود
                تشکر بابت راهنمایی
                لینکی که فرستاده بودید را مطالعه کردم چرخش متور وجود ندارد.
                با سلام و خسته نباشید ،
                در صورت امکان فایل سورس ino پروژتون رو اینجا بذارید تا امکان بررسی بهترش ( با استفاده از ادیتور ) باشه.
                با این وضع فعلی که کد در حالت HTML نمایش داده میشه خوانایی خوبی نداره.

                دیدگاه

                لطفا صبر کنید...
                X