اطلاعیه

Collapse
No announcement yet.

مشکل در ایجاد دایرکتوری تو در تو با نام متغییر برای SD card

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

    مشکل در ایجاد دایرکتوری تو در تو با نام متغییر برای SD card

    سلام دوستان
    میخواستم تو پروژه SD کارت با کتابخونه خود آردوینو بیام نام یک دایرکتوری رو یه مقدار متغییر بذارم بعد داخل اون دایرکتوری یه دایرکتوری دیگه با نام متغیر بسازم
    برایساخت دایرکتوری باید از دستور زیر استفاده کنیم
    SD.mkdir("dirName")
    مشکل اول که چجوری متغییر رو داخل "" تعریف کنم؟!متغییر بره تو ""فکر میکنه که مقدار ثابته!!!!!!!!
    مشکل دوم
    من اومدم بیخیال "" شدم گفتم نذارمش و یه دایرکتوری دیگه تو دایرکتوری اول بسازم به این صورت

    SD.mkdir(dirName/dirName2)
    اینجا ایراد گرفت چرا دوتا متغیر String رو تقسیم بر هم میکنی!!!!!!درصورتی برای ادرس دهی از / استفاده میکنن.
    کسی راه حلشو میدونه بگه بدجور توش گیر کردم ممنون



    #2
    پاسخ : مشکل در ایجاد دایرکتوری تو در تو با نام متغییر برای SD card

    نوشته اصلی توسط MrERFAN نمایش پست ها
    سلام دوستان
    میخواستم تو پروژه SD کارت با کتابخونه خود آردوینو بیام نام یک دایرکتوری رو یه مقدار متغییر بذارم بعد داخل اون دایرکتوری یه دایرکتوری دیگه با نام متغیر بسازم
    برایساخت دایرکتوری باید از دستور زیر استفاده کنیم
    SD.mkdir("dirName")
    مشکل اول که چجوری متغییر رو داخل "" تعریف کنم؟!متغییر بره تو ""فکر میکنه که مقدار ثابته!!!!!!!!
    مشکل دوم
    من اومدم بیخیال "" شدم گفتم نذارمش و یه دایرکتوری دیگه تو دایرکتوری اول بسازم به این صورت

    SD.mkdir(dirName/dirName2)
    اینجا ایراد گرفت چرا دوتا متغیر String رو تقسیم بر هم میکنی!!!!!!درصورتی برای ادرس دهی از / استفاده میکنن.
    کسی راه حلشو میدونه بگه بدجور توش گیر کردم ممنون


    سلام
    درمورد سوال اول، شما در واقع دارید با رشته ها کار میکنید. تعریف متغیری رشته ها به شکل آرایه ای از char هستش که خونه آخر رشته متنی به یک کاراکتر خالی '0\' ختم میشه. مثلا رشته ای به اسم str به شکل زیر تعریف میشه و با تابع sprint که توی کتابخونه <stdio.h> هست میشه تو طول برنامه بهش مقدار داد:

    char str[20];
    sprintf(str, "hello!");

    البته میشه موقع تعریف رشته هم به شکل زیر بهش مقدار اولیه داد:

    char str[20] = "hello!"

    با این دو روش که گفتم به صورت خودکار رشته تنظیم میشه و شما کافیه به شکل زیر اونو به تابعی که میخوایید بدید:

    SD.mkdir(str);

    اما در مورد سوال دوم هم بگم که خوب معلومه نباید همچین کاری بشه! شما در واقع دارید آدرس خونه اول دوتا رشته رو برهم تقسیم میکنید که خوب از نظر کامپایلر هم این کار اشتباهه! شما باید تحقیق کنید ببینید چطور میشه دوتا رشته رو با هم ترکیب کرد و بینشون کاراکتر '/' که مد نظر هست قرار داد. من روشش رو یادم رفته ولی شما میتونید با یک سرچ ساده توی اینترنت روشش رو پیدا کنید

    دیدگاه


      #3
      پاسخ : مشکل در ایجاد دایرکتوری تو در تو با نام متغییر برای SD card

      نوشته اصلی توسط hossein.m98 نمایش پست ها
      سلام
      درمورد سوال اول، شما در واقع دارید با رشته ها کار میکنید. تعریف متغیری رشته ها به شکل آرایه ای از char هستش که خونه آخر رشته متنی به یک کاراکتر خالی '0\' ختم میشه. مثلا رشته ای به اسم str به شکل زیر تعریف میشه و با تابع sprint که توی کتابخونه <stdio.h> هست میشه تو طول برنامه بهش مقدار داد:

      char str[20];
      sprintf(str, "hello!");

      البته میشه موقع تعریف رشته هم به شکل زیر بهش مقدار اولیه داد:

      char str[20] = "hello!"

      با این دو روش که گفتم به صورت خودکار رشته تنظیم میشه و شما کافیه به شکل زیر اونو به تابعی که میخوایید بدید:

      SD.mkdir(str);

      اما در مورد سوال دوم هم بگم که خوب معلومه نباید همچین کاری بشه! شما در واقع دارید آدرس خونه اول دوتا رشته رو برهم تقسیم میکنید که خوب از نظر کامپایلر هم این کار اشتباهه! شما باید تحقیق کنید ببینید چطور میشه دوتا رشته رو با هم ترکیب کرد و بینشون کاراکتر '/' که مد نظر هست قرار داد. من روشش رو یادم رفته ولی شما میتونید با یک سرچ ساده توی اینترنت روشش رو پیدا کنید
      سلام دوست عزیز دستت دردنکنه فهمیدم چی به چی شدش
      لپ کلام اینه که باید از آرایه کارکتری استفاده کنیم.
      تو نت دنبال یه مثال گشتم به کد زیر رسیدم
      #include <SD.h>
      #include "RTClib.h"
      #include <Wire.h>
      #include <string.h>
      RTC_DS1307 RTC;
      char FileName[] = "P00-0000.txt";
      char FolderName[] = "0000-00";
      File PicFile;

      void setup()
      {
      Serial.begin(115200);
      Wire.begin(); //Important for RTClib.h
      RTC.begin();
      if (! RTC.isrunning()) {
      Serial.println("RTC is NOT running!");
      // following line sets the RTC to the date & time this sketch was compiled
      // RTC.adjust(DateTime(__DATE__, __TIME__));
      return;
      }
      Serial.print("Initializing SD card...");
      // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
      // Note that even if it's not used as the CS pin, the hardware SS pin
      // (10 on most Arduino boards, 53 on the Mega) must be left as an output
      // or the SD library functions will not work.
      pinMode(53, OUTPUT);
      if (!SD.begin(53)) {
      Serial.println("initialization failed!");
      return;
      }
      Serial.println("initialization done.");
      }

      void loop()
      {
      GetFolder();
      CreateFolderName();
      delay(3000);
      GetFileName();
      CreateFile();
      delay(3000);
      }

      void GetFolderName(){
      DateTime now = RTC.now();
      FolderName[0] = (now.year()/1000)%10 + '0'; //To get 1st digit from year()
      FolderName[1] = (now.year()/100)%10 + '0'; //To get 2nd digit from year()
      FolderName[2] = (now.year()/10)%10 + '0'; //To get 3rd digit from year()
      FolderName[3] = now.year()%10 + '0'; //To get 4th digit from year()
      FolderName[5] = now.month()/10 + '0'; //To get 1st digit from month()
      FolderName[6] = now.month()%10 + '0'; //To get 2nd digit from month()
      Serial.println(FolderName);
      }

      void CreateFolder(){
      if (SD.exists(FolderName)) {
      Serial.println("exists.");
      }
      else {
      Serial.println("doesn't exist.");
      Serial.println("Creating new file");
      Serial.println(FolderName);
      SD.mkdir(FolderName);
      }
      }

      void GetFileName(){
      DateTime now = RTC.now();
      FileName[1] = now.day()/10 + '0'; //To get 1st digit from day()
      FileName[2] = now.day()%10 + '0'; //To get 2nd digit from day()
      FileName[4] = now.hour()/10 + '0'; //To get 1st digit from day()
      FileName[5] = now.hour()%10 + '0'; //To get 2nd digit from day()
      FileName[6] = now.minute()/10 + '0'; //To get 1st digit from day()
      FileName[7] = now.minute()%10 + '0'; //To get 2nd digit from day()
      Serial.println(FileName);
      }

      void CreateFile(){
      if (SD.exists(/FolderName/FileName)) { //<<-Not sure about the syntax needed here
      Serial.println("Exists.");
      }
      else {
      Serial.println("doesn't exist.");
      Serial.println("Creating new file");
      Serial.println(FileName);
      PicFile = SD.open(/FolderName/FileName, FILE_WRITE); //<<-Not sure about the syntax needed here
      PicFile.close();
      }
      }


      خط 6 و خط 69 تا 74 رو میشه به فارسی توضیح بدید چه اتفاقی میفته؟
      دقیق متوجه نشدم
      خیلی ممنون

      دیدگاه


        #4
        پاسخ : مشکل در ایجاد دایرکتوری تو در تو با نام متغییر برای SD card

        نوشته اصلی توسط MrERFAN نمایش پست ها
        خط 6 و خط 69 تا 74 رو میشه به فارسی توضیح بدید چه اتفاقی میفته؟
        دقیق متوجه نشدم
        خیلی ممنون
        خوب خط 6 که مشخصه چیه. یه رشته مشخص کرده و مقدار اولیه بهش داده تا کامپایلر با توجه به اون مقدار اولیه خودش سایز آرایه رو مشخص کنه.
        اما در مورد خطوط 69 تا 74. ببینید ظاهرا پروژه قابلیت استفاده از ساعت و تاریخ رو داره؛ برای مثال تابع ()now.day تاریخ روز رو به صورت عددی برمیگردونه. حال با توجه به کارکرد برنامه باید ارقام عدد برگشتی از هم تفکیک بشن. یعنی برای مثال اگر تابع مقدار 23 رو برگردوند، باید مقدار 2 و 3 از هم تفکیک بشن. خوب برای جدا کردن رقم دهگان اومده و مقدار بازگشتی رو بر 10 تقسیم کرده. برای مثال اگر ما 23 رو بر 10 تقسیم کنیم جواب میشه 2.3 اما از اونجایی که نمیتونیم اعداد اعشاری داشته باشیم، برنامه مقدار 2 رو برمیگردونه و ارقام بعد از اعشار رو از بین میبره. پس تا اینجا رقم دهگان رو که تو مثال من 2 بود رو بدست آوردیم. برای رقم یکان هم از عملگر باقی مانده تقسیم که علامتش به شکل % هستش استفاده کرده که این کار هم رقم یکان که توی مثال من 3 بود رو برمیگردونه.
        خوب تا اینجای کار ما ارقام رو به صورت تفکیک شده داریم. اما ما احتیاج داریم هر کدوم از ارقام رو به یک خونه از رشته متنی نسبت بدیم. همونطور که میدونید رشته ها از کد ASCII استفاده میکنن. بخاطر همین باید کد اسکی مربوط به ارقام رو بدست بیاریم. راه حل این مورد هم اینه که رقم بدست اومده رو با کد اسکی عدد صفر، یعنی مقدار '0' جمع کنیم تا کد اسکی عدد مورد نظر رو به ما بده. مثلا بنویسیم (2 + '0') تا کد اسکی 2 یا همون '2' رو به ما بده

        دیدگاه


          #5
          پاسخ : مشکل در ایجاد دایرکتوری تو در تو با نام متغییر برای SD card

          چه مثال خوبی هست همه کار داخلش انجام شده
          خط ۶ و ۷ به متغیر نام فولدر و نام فایل مقدار اولیه میده تا از زباله بودن مولفه آرایه مطمئن باشه .

          دو تا تابع ساخته یکی برای ایجاد نام فولدر که میاد از rtc ۴ رقم سال رو در آرایه ذخیره می*کنه .
          تابع دوم نام فایل رو با عدد روز ، ساعت و دقیقه در آرایه نام فایل ذخیره می*کنه .
          که با این دو آرایه در مرحله بعد فولدر و فایل رو میسازه

          دیدگاه


            #6
            پاسخ : مشکل در ایجاد دایرکتوری تو در تو با نام متغییر برای SD card

            واقعا ممنونم

            دیدگاه


              #7
              پاسخ : مشکل در ایجاد دایرکتوری تو در تو با نام متغییر برای SD card

              داشتم فکر میکردم دیدم چرا بیام این حجم زیاد کد رو به کار ببرم یه راه ساده تر به ذهنم رسید.

              char FolderNameYear[5];
              String dateDS;

              اومدم یه رشته تعریف کردم و هر مقداری بخوام توش میریزم به راحتی با =+ میشه به رشته کارکتر اضافه کرد.
              بعد به جای خط 69 تا 74 میام یه خط کد مینویسم

              dateDS.toCharArray(FolderNameYear, 5);

              این تابع میاد رشته رو تو آرایه کارکتری قرار میده
              دوتا مقدار هم میگیره که مقدار اولمون نام آرایه کارکتری و مقدار دوم طول آرایه
              البته تو کار کردن باهاش باید عدد طول آرایه رو یکی بیشتر از مقدار واقعی حساب کنی تا درست کار کنه
              چراش رو نمیدونم ولی رشته من 4 کارکتری بود ولی برای درست کار کردن تابع آرایه 5 تایی استفاده کردم

              دیدگاه


                #8
                پاسخ : مشکل در ایجاد دایرکتوری تو در تو با نام متغییر برای SD card

                نوشته اصلی توسط MrERFAN نمایش پست ها
                داشتم فکر میکردم دیدم چرا بیام این حجم زیاد کد رو به کار ببرم یه راه ساده تر به ذهنم رسید.

                char FolderNameYear[5];
                String dateDS;

                اومدم یه رشته تعریف کردم و هر مقداری بخوام توش میریزم به راحتی با =+ میشه به رشته کارکتر اضافه کرد.
                بعد به جای خط 69 تا 74 میام یه خط کد مینویسم

                dateDS.toCharArray(FolderNameYear, 5);

                این تابع میاد رشته رو تو آرایه کارکتری قرار میده
                دوتا مقدار هم میگیره که مقدار اولمون نام آرایه کارکتری و مقدار دوم طول آرایه
                البته تو کار کردن باهاش باید عدد طول آرایه رو یکی بیشتر از مقدار واقعی حساب کنی تا درست کار کنه
                چراش رو نمیدونم ولی رشته من 4 کارکتری بود ولی برای درست کار کردن تابع آرایه 5 تایی استفاده کردم
                سلام دوست عزیز
                این تابع مربوط به کدوم کتابخانه اردوینو میشه ؟؟

                دیدگاه


                  #9
                  پاسخ : مشکل در ایجاد دایرکتوری تو در تو با نام متغییر برای SD card

                  نوشته اصلی توسط Shimadzu نمایش پست ها
                  سلام دوست عزیز
                  این تابع مربوط به کدوم کتابخانه اردوینو میشه ؟؟
                  درود . کتابخانه خود آردو
                  SD Library for Arduino. Contribute to arduino-libraries/SD development by creating an account on GitHub.

                  دیدگاه

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