نمایش نتایج: از 1 به 3 از 3
Like Tree4 لایک
  • 2 Post By magmagmary
  • 2 Post By meahdi

موضوع: دورقمی کردن ساعت

  1. #1
    Junior Member
    تاریخ عضویت
    Oct 2015
    نوشته ها
    13

    دورقمی کردن ساعت

    سلام
    تازه کار کردن با آردویینو رو شروع کردم
    با کمک مثال های آماده و کمی تغییرات یه مدار ساعت درست کردم.
    از ماژول ساعت و دمای DS3231 استفاده کردم به عنوان RTC.
    یه مشکلی دارم ؛ وقتی ساعت یا دقیقه از 2 رقمی به یک رقمی تغییر میکنه ؛ رقم اضافی از صفحه حذف نمیشه.
    مثلاً وقتی از 12:59:59 تبدیل میشه به 13:0:0 رقم های اضافی ثانیه شمار حذف نمیشه.
    این هم عکس

    img-20151113-200256_530f2.jpg

    استفاده از دستور clear باعث رفرش اضافی صفحه و پرپر شدن صفحه میشه.
    ممکنه راهنمایی کنید تا تغییراتی تو برنامه بدم تا ساعت رو در زمان های تک رقمی به صورت دورقمی نشون بده ؟؟
    مثلاً به این صورت 13:07:08 ثانیه
    این هم برنامه

    کد:
    #include <Wire.h>
    #include <LCD.h>
    #include <LiquidCrystal_I2C.h>
    #define I2C_ADDR 0x27 //Define I2C Address where the PCF8574A is 
    #define BACKLIGHT_PIN 3 
    #define En_pin 2
    #define Rw_pin 1 
    #define Rs_pin 0 
    #define D4_pin 4 
    #define D5_pin 5
    #define D6_pin 6 
    #define D7_pin 7
    //Initialize the LCD
    LiquidCrystal_I2C lcd(I2C_ADDR, En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
    #define DS3231_I2C_ADDRESS 104    // RTC is connected, address is Hex68 (Decimal 104)
    // SCL - pin A5
    // SDA - pin A4
    // To set the clock, run the sketch and use the serial monitor.
    // Enter T1124154091014; the code will read this and set the clock. See the code for full details.
    byte seconds, minutes, hours, day, date, month, year;
    char weekDay[4];
    byte tMSB, tLSB;
    float my_temp;
    char my_array[100];            // Character array for printing something.
    
    //Mehdi aray LED
    int timer = 50;           // The higher the number, the slower the timing.
    int ledPins[] = {
      2,3,4,5,6,7,8,9,10,11
    };       // an array of pin numbers to which LEDs are attached
    int pinCount = 10;           // the number of pins (i.e. the length of the array)
    //Mehdi aray LED
    
    
    
    void setup()
    {
      Wire.begin();
      Serial.begin(9600);
    lcd.begin (16,2); //Define the LCD as 16 column by 2 rows
    lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); 
    //lcd.setBacklight(HIGH);    //Switch on the backlight 
    //lcd.setCursor(0,0); //goto first column (column 0) and first line (Line 0)
    //Mehdi aray LED
      // the array elements are numbered from 0 to (pinCount - 1).
      // use a for loop to initialize each pin as an output:
      for (int thisPin = 0; thisPin < pinCount; thisPin++) {
        pinMode(ledPins[thisPin], OUTPUT);
      }
    //Mehdi aray LED
    
    
    }
    
    void loop()
    {
     
      watchConsole();
     
     
      get3231Date();
     
      //Serial.print(weekDay); Serial.print(", "); Serial.print(date, DEC); Serial.print("/"); Serial.print(month, DEC);
      //Serial.print("/"); Serial.print(year, DEC); Serial.print(" - ");
      //Serial.print(hours, DEC); Serial.print(":"); Serial.print(minutes, DEC); Serial.print(":"); Serial.print(seconds, DEC);
    
      my_temp = (float)get3231Temp();
    
      //Serial.println("  <==  Time & date");
      //Serial.print("Temperature : ");
      //Serial.println(my_temp);
      //Serial.println("...............");
      
      // NOTE: Arduino does NOT implement printing floats to a string.
      // If you use the std C function : sprintf(my_array, "Temp: %4.2f", my_temp), It will NOT CONVERT.
      // So I abandoned this, since I don't need to print the float to the LCD anyway.
      
    sprintf(my_array, "TIME: %d:%d:%d", hours, minutes, seconds);
    
    // Print a message to the LCD.
      lcd.backlight();
      lcd.setCursor(0,0);
      lcd.print(my_array);
      lcd.setCursor(0,1);
      lcd.print("TEMP: ");
      lcd.setCursor(6,1);
      lcd.print(my_temp);
      lcd.setCursor(11,1);
      lcd.print(" 'C");
      
    
    //Mehdi aray LED
      // loop from the lowest pin to the highest:
      for (int thisPin = 0; thisPin < pinCount; thisPin++) {
        // turn the pin on:
        digitalWrite(ledPins[thisPin], HIGH);
        delay(timer);
        // turn the pin off:
        digitalWrite(ledPins[thisPin], LOW);
      }
      // loop from the highest pin to the lowest:
      for (int thisPin = pinCount - 1; thisPin >= 0; thisPin--) {
        // turn the pin on:
        digitalWrite(ledPins[thisPin], HIGH);
        delay(timer);
        // turn the pin off:
        digitalWrite(ledPins[thisPin], LOW);
      }
    //Mehdi aray LED
      
    }
    
    // Convert normal decimal numbers to binary coded decimal
    byte decToBcd(byte val)
    {
      return ( (val/10*16) + (val%10) );
    }
    
    void watchConsole()
    {
      if (Serial.available()) {      // Look for char in serial queue and process if found
        if (Serial.read() == 84) {      //If command = "T" Set Date
          set3231Date();
          get3231Date();
          Serial.println(" ");
        }
      }
    }
     
    void set3231Date()
    {
    //T(sec)(min)(hour)(dayOfWeek)(dayOfMonth)(month)(year)
    //T(00-59)(00-59)(00-23)(1-7)(01-31)(01-12)(00-99)
    //Example: 02-Feb-09 @ 19:57:11 for the 3rd day of the week -> T1157193020209
    // T1124154091014
      seconds = (byte) ((Serial.read() - 48) * 10 + (Serial.read() - 48)); // Use of (byte) type casting and ascii math to achieve result.  
      minutes = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
      hours   = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
      day     = (byte) (Serial.read() - 48);
      date    = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
      month   = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
      year    = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
      Wire.beginTransmission(DS3231_I2C_ADDRESS);
      Wire.write(0x00);
      Wire.write(decToBcd(seconds));
      Wire.write(decToBcd(minutes));
      Wire.write(decToBcd(hours));
      Wire.write(decToBcd(day));
      Wire.write(decToBcd(date));
      Wire.write(decToBcd(month));
      Wire.write(decToBcd(year));
      Wire.endTransmission();
    }
    
    
    void get3231Date()
    {
      // send request to receive data starting at register 0
      Wire.beginTransmission(DS3231_I2C_ADDRESS); // 104 is DS3231 device address
      Wire.write(0x00); // start at register 0
      Wire.endTransmission();
      Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // request seven bytes
    
      if(Wire.available()) {
        seconds = Wire.read(); // get seconds
        minutes = Wire.read(); // get minutes
        hours   = Wire.read();   // get hours
        day     = Wire.read();
        date    = Wire.read();
        month   = Wire.read(); //temp month
        year    = Wire.read();
           
        seconds = (((seconds & B11110000)>>4)*10 + (seconds & B00001111)); // convert BCD to decimal
        minutes = (((minutes & B11110000)>>4)*10 + (minutes & B00001111)); // convert BCD to decimal
        hours   = (((hours & B00110000)>>4)*10 + (hours & B00001111)); // convert BCD to decimal (assume 24 hour mode)
        day     = (day & B00000111); // 1-7
        date    = (((date & B00110000)>>4)*10 + (date & B00001111)); // 1-31
        month   = (((month & B00010000)>>4)*10 + (month & B00001111)); //msb7 is century overflow
        year    = (((year & B11110000)>>4)*10 + (year & B00001111));
      }
      else {
        //oh noes, no data!
      }
     
      switch (day) {
        case 1:
          strcpy(weekDay, "Sun");
          break;
        case 2:
          strcpy(weekDay, "Mon");
          break;
        case 3:
          strcpy(weekDay, "Tue");
          break;
        case 4:
          strcpy(weekDay, "Wed");
          break;
        case 5:
          strcpy(weekDay, "Thu");
          break;
        case 6:
          strcpy(weekDay, "Fri");
          break;
        case 7:
          strcpy(weekDay, "Sat");
          break;
      }
    }
    
    float get3231Temp()
    {
      float temp3231;
      
      //temp registers (11h-12h) get updated automatically every 64s
      Wire.beginTransmission(DS3231_I2C_ADDRESS);
      Wire.write(0x11);
      Wire.endTransmission();
      Wire.requestFrom(DS3231_I2C_ADDRESS, 2);
     
      if(Wire.available()) {
        tMSB = Wire.read(); //2's complement int portion
        tLSB = Wire.read(); //fraction portion
       
        temp3231 = (tMSB & B01111111); //do 2's math on Tmsb
        temp3231 += ( (tLSB >> 6) * 0.25 ); //only care about bits 7 & 8
      }
      else {
        //oh noes, no data!
      }
       
      return temp3231;
    }

  2. #2
    مدیر گروه
    تاریخ عضویت
    Nov 2013
    محل سکونت
    ایران
    نوشته ها
    3,933
    اره به جای این که صفحه رو پاک کنی روی دیجیتی که قراره نباشه نال چاپ کن
    مثلا
    " "
    دقت کن اسپیس داره

  3. #3
    Junior Member
    تاریخ عضویت
    Oct 2015
    نوشته ها
    13
    نقل قول نوشته اصلی توسط magmagmary نمایش پست ها
    اره به جای این که صفحه رو پاک کنی روی دیجیتی که قراره نباشه نال چاپ کن
    مثلا
    " "
    دقت کن اسپیس داره
    ممنون از پاسخ شما
    از همون روشی که شما گفتید به نتیجه رسیدم

    این 2 خط دستور رو قبل از نمایش ساعت زدم و مشکل حل شد

    کد:
     lcd.setCursor(12,0);
      lcd.print("   ");
    موفق باشید

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  

SEO by vBSEO