вопрос по SDмодулю и LCD2004 снова открыт

Тема в разделе "Arduino & Shields", создана пользователем vankenshtein, 29 июн 2015.

  1. vankenshtein

    vankenshtein Нерд

    нужно выводить построчно содержимое текстового файла, при этом файл дописывается раз два в сутки. Тут на форуме подсказали уже немного переделал вроде заработало, но возникла другая проблема при отключении питания переход по строчкам перестает работать. Я так понимаю переменную которая отвечает за нумерацию строк можно записывать в отдельный файл на sd? но ничего не получается. Помогите пожалуйста
     
  2. vankenshtein

    vankenshtein Нерд

  3. vankenshtein

    vankenshtein Нерд

    Вот сам скетч
    Код (Text):
    #include <DS1302.h>
    #include <Wire.h>
    #include <LiquidCrystal.h>
    #include <SD.h>

    DS1302 rtc(22, 24, 26);    // (RST, DAT, CLK)
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

    int var = 0;

    Time t;
    File myFile;

    // объявление массива начал строк
    #define MAX_STRS 365
    int filestrs [MAX_STRS];  // резервируем целых 730 байт. Нужно смотреть за расходом ОЗУ.
    int firststr=0; // номер первой строки на дисплее
    int lastfilestr; // количество строк в файле

    int menuup_flag=0;
    int menudown_flag=0;
    int Recflag=0;
    int menuup_flag3=0;
    int menudown_flag3=0;
    int menuup_flag2=0;
    int menudown_flag2=0;

    int interval = 60;
    int interval2 = 60;
    int interval3 = 60;

    int podacha10bt1 = 30;  
    int podacha1bt1 = 31;
    int kurokbt1 = 32;
    int podacha10bt2 = 33;  
    int podacha1bt2 = 34;
    int kurokbt2 = 35;
    int dvig3 = 23;
    int dvig2 = 25;
    int dvig = 27;
    int podacha10bt3 = 36;  
    int podacha1bt3 = 37;
    int kurokbt3 = 38;
    int offbt = 39;
    int readbt = 40;
    int nastrbt = 41;
    int nastrel1 = 0;
    int zadanie1 = 0;
    int magaz1 = 0;
    int nastrel2 = 0;
    int zadanie2 = 0;
    int magaz2 = 0;
    int nastrel3 = 0;
    int zadanie3 = 0;
    int magaz3 = 0;
    int obsh_nastrel= 0;
    int flag=0;
    int flag1=0;
    int flag2=0;
    int flag2_1=0;
    int flag3=0;
    int flag3_1=0;



    unsigned long math_time,old_time,real_time;
    unsigned long math_time2,old_time2,real_time2;
    unsigned long math_time3,old_time3,real_time3;

    static boolean output = LOW;
    static boolean output2 = LOW;
    static boolean output3 = LOW;
    static boolean output2_1 = LOW;
    static boolean output2_2 = LOW;
    static boolean output2_3 = LOW;
    static boolean output3_1 = LOW;
    static boolean output3_2 = LOW;
    static boolean output3_3 = LOW;
    static boolean outoffbt = LOW;
    static boolean readbt_state = LOW;
    static boolean rec_state = LOW;
    static boolean nastrbt_state = LOW;

    void setup()
    {
        //  rtc.halt(false);
        //rtc.writeProtect(false);
      // rtc.setDOW(SUNDAY);        // Set Day-of-Week to FRIDAY  Monday
      //rtc.setTime(12, 19, 0);    // Set the time to 12:00:00 (24hr format)
    //rtc.setDate(28, 06, 2015);  // Set the date to August 6th, 2010
      Serial.begin(9600);
      pinMode(podacha10bt1, INPUT);
      pinMode(podacha1bt1, INPUT);
      pinMode(kurokbt1, INPUT);
      pinMode(podacha10bt2, INPUT);
      pinMode(podacha1bt2, INPUT);
      pinMode(kurokbt2, INPUT);
      pinMode(podacha10bt3, INPUT);
      pinMode(podacha1bt3, INPUT);
      pinMode(kurokbt3, INPUT);
      pinMode(offbt, INPUT);
      pinMode(dvig3, OUTPUT);
      pinMode(dvig2, OUTPUT);
      pinMode(dvig, OUTPUT);
      pinMode(readbt, INPUT);
      pinMode(nastrbt, INPUT);
     
      pinMode(10, OUTPUT);
      lcd.begin(20, 4);
      delay(100);
      if (!SD.begin(10)) {
        Serial.println("initialization failed!");
        return;
      }
      Serial.println("initialization done.");
     
     
      myFile = SD.open("van.txt");
      if (myFile) {
        Serial.println("van.txt:");
        while (myFile.available()) {  
      lastfilestr=myFile.read();
        Serial.write(lastfilestr);
        }
        myFile.close();
        } else {
          lastfilestr=0;
              Serial.println("error reading van.txt");
      }
    }
     
     
  4. vankenshtein

    vankenshtein Нерд

    и вторая часть
    Код (Text):
    void loop()

    {
      t = rtc.getTime();
    output = digitalRead(podacha10bt1);
    output2 = digitalRead(podacha1bt1);
    output3 = digitalRead(kurokbt1);
    output2_1 = digitalRead(podacha10bt2);
    output2_2 = digitalRead(podacha1bt2);
    output2_3 = digitalRead(kurokbt2);
    output3_1 = digitalRead(podacha10bt3);
    output3_2 = digitalRead(podacha1bt3);
    output3_3 = digitalRead(kurokbt3);
    outoffbt = digitalRead(offbt);
    readbt_state = digitalRead(readbt);
    nastrbt_state = digitalRead(nastrbt);
    delay(10);
    if(nastrbt_state == HIGH){
      lcd.setCursor(0, 0);
      lcd.print(" N");
      lcd.print("  ");
      lcd.print("delay");
      lcd.setCursor(0, 1);
      lcd.print(" 1");
      lcd.print(".....");
      lcd.print(interval);
      lcd.setCursor(0, 2);
      lcd.print(" 2");
      lcd.print(".....");
      lcd.print(interval2);
      lcd.setCursor(0, 3);
      lcd.print(" 3");
      lcd.print(".....");
      lcd.print(interval3);
      //.............Устройство 3
      if(output3_1 == LOW && menuup_flag3==0) {
        menuup_flag3=1;
          }
      if(output3_1 == HIGH && menuup_flag3==1) {
      interval3 -=5;
      lcd.clear();
      menuup_flag3=0;
    }
    if(output3_2 == LOW && menudown_flag3==0)  {
      menudown_flag3=1;
          }
          if(output3_2 == HIGH && menudown_flag3==1)  {
    interval3 +=5;
    lcd.clear();
    menudown_flag3=0;
    }

    //.............Устройство 1
    if(output2 == LOW && menudown_flag==0)  {
      menudown_flag=1;
          }
          if(output2 == HIGH && menudown_flag==1)  {
    interval +=5;
    lcd.clear();
    menudown_flag=0;
    }
    if(output == LOW && menuup_flag==0) {
        menuup_flag=1;
          }
      if(output == HIGH && menuup_flag==1) {
      interval -=5;
      lcd.clear();
      menuup_flag=0;
    }

    //.............Устройство 2
    if(output2_2 == LOW && menudown_flag2==0)  {
      menudown_flag2=1;
          }
          if(output2_2 == HIGH && menudown_flag2==1)  {
    interval2 +=5;
    lcd.clear();
    menudown_flag2=0;
    }
    if(output2_1 == LOW && menuup_flag2==0) {
        menuup_flag2=1;
          }
      if(output2_1 == HIGH && menuup_flag2==1) {
      interval2 -=5;
      lcd.clear();
      menuup_flag2=0;
    }
    }
    else{
    if(readbt_state == HIGH && nastrbt_state == LOW){
      myFile = SD.open("tir.txt");
      if (myFile)
    {
        myFile.seek(filestrs[firststr]);
        char tmpstr[20];
        char tmpstrlen=0;
        while (myFile.available()) { // читаем первую строку
          tmpstr[tmpstrlen]=myFile.read();
          if ((tmpstr[tmpstrlen]=='\n')||(tmpstr[tmpstrlen]=='\r')) break;
          tmpstrlen++;
        }
        lcd.setCursor(0,0);
        lcd.print(tmpstr);
        tmpstr[tmpstrlen]=0;
        while (myFile.available()) { // гоним до следующей строки, пока не пропустим все переводы строки
          char ch=myFile.read();
          if ((ch!='\n')&&(ch!='\r')) break;
        }
        tmpstrlen=0;
        while (myFile.available()) {// читаем вторую строку
          tmpstr[tmpstrlen]=myFile.read();
          if ((tmpstr[tmpstrlen]=='\n')||(tmpstr[tmpstrlen]=='\r')) break;
          tmpstrlen++;
        }
     
        lcd.setCursor(0,1);
        lcd.print(tmpstr);
        tmpstr[tmpstrlen]=0;
        myFile.close();
    }
    // обрабатываем кнопки  menuup_flag

    if(output3_1 == LOW && menuup_flag==0)
        {
          menuup_flag=1;
          }
    if (output3_1 == HIGH && menuup_flag==1)
    {
        if (firststr > 0)    firststr--;
        lcd.clear();
      menuup_flag=0;
    }
    if (output3_2 == LOW && menudown_flag==0)
    {
            menudown_flag=1;
          }
    if (output3_2 == HIGH && menudown_flag==1)
    {
      if (firststr < 99)  firststr++; // если уже стоим на предпоследней строке, дальше двигаться нельзя.
    menudown_flag=0;
    lcd.clear();
    }
    }
    else {
          //.........Устройство 1.............
    if(digitalRead(podacha10bt1)==HIGH && output==HIGH)
        {
            math_time = 0;
            old_time = millis();
            while(math_time < 4000 && output > LOW)
              {
                real_time = millis();            //получить реальное время
                math_time = real_time - old_time; //считаем длительность удержания
                output=digitalRead(podacha10bt1);
              }
            if(math_time > 3999 && magaz1 < 100)
              {
                magaz1 += 300;
              }
              else if(math_time > 200 && zadanie1 == 0 && magaz1 >= 10)
                {
                  zadanie1 +=10;
              }
        }  
      if(output2==LOW && magaz1 > 0 && zadanie1 < 10 && flag1==0)
        {
          flag1=1;
          }
      if(output2==HIGH && magaz1 > 0 && zadanie1 < 10 && flag1==1)
        {
        zadanie1 +=1;
        nastrel1 = nastrel1 -= 1;
        obsh_nastrel = obsh_nastrel -=1 ;
        flag1=0;
      }


      if(output3==LOW && zadanie1 > 0 && flag==0)
        {
          flag=1;
      }
      if(output3==HIGH && zadanie1 > 0 && flag==1)
        {
        zadanie1 -=1;
        magaz1 -= 1;
        nastrel1 = nastrel1 +=1 ;
        obsh_nastrel = obsh_nastrel +=1 ;
        digitalWrite(dvig, HIGH);
        delay (interval);
        digitalWrite(dvig, LOW);
        flag=0;
     
      }
                //.........Устройство 2.............
      if(digitalRead(podacha10bt2)==HIGH && output2_1==HIGH)
        {
            math_time2 = 0;
            old_time2 = millis();
            while(math_time2 < 4000 && output2_1 > LOW)
              {
                real_time2 = millis();            //получить реальное время
                math_time2 = real_time2 - old_time2; //считаем длительность удержания
                output2_1=digitalRead(podacha10bt2);
              }
            if(math_time2 > 3999 && magaz2 < 100)
              {
                magaz2 += 300;
              }
              else if(math_time2 > 200 && zadanie2 == 0 && magaz2 >= 10)
                {
                  zadanie2 +=10;
              }
        }  
      if(output2_2==LOW && magaz2 > 0 && flag2==0)
        {
          flag2=1;
          }
      if(output2_2==HIGH && magaz2 > 0 && flag2==1)
        {
        zadanie2 +=1;
        nastrel2 = nastrel2 -= 1;
        obsh_nastrel = obsh_nastrel -=1 ;
        flag2=0;
      }


      if(output2_3==LOW && zadanie2 > 0 && flag2_1==0)
        {
          flag2_1=1;
      }
      if(output2_3==HIGH && zadanie2 > 0 && flag2_1==1)
        {
        zadanie2 -=1;
        magaz2 -= 1;
        nastrel2 = nastrel2 +=1 ;
        obsh_nastrel = obsh_nastrel +=1 ;
        digitalWrite(dvig2, HIGH);
        delay (interval2);
        digitalWrite(dvig2, LOW);
        flag2_1=0;
      }
            //.........Устройство 3.............
         
      if(digitalRead(podacha10bt3)==HIGH && output3_1==HIGH)
        {
            math_time3 = 0;
            old_time3 = millis();
            while(math_time3 < 4000 && output3_1 > LOW)
              {
                real_time3 = millis();            //получить реальное время
                math_time3 = real_time3 - old_time3; //считаем длительность удержания
                output3_1=digitalRead(podacha10bt3);
              }
            if(math_time3 > 3999 && magaz3 < 100)
              {
                magaz3 += 300;
              }
              else if(math_time3 > 200 && zadanie3 == 0 && magaz3 >= 10)
                {
                  zadanie3 +=10;
              }
        }  
      if(output3_2==LOW && magaz3 > 0 && flag3==0)
        {
          flag3=1;
          }
      if(output3_2==HIGH && magaz3 > 0 && flag3==1)
        {
        zadanie3 +=1;
        nastrel3 = nastrel3 -= 1;
        obsh_nastrel = obsh_nastrel -=1 ;
        flag3=0;
      }


      if(output3_3==LOW && zadanie3 > 0 && flag3_1==0)
        {
          flag3_1=1;
      }
      if(output3_3==HIGH && zadanie3 > 0 && flag3_1==1)
        {
        zadanie3 -=1;
        magaz3 -= 1;
        nastrel3 = nastrel3 +=1 ;
        obsh_nastrel = obsh_nastrel +=1 ;
        digitalWrite(dvig3, HIGH);
        delay (interval3);
        digitalWrite(dvig3, LOW);
        flag3_1=0;
      }

      lcd.setCursor(0, 0);
      lcd.print("No");
      lcd.print(" ");
      lcd.print("OST");
      lcd.print(" ");
      lcd.print("MAG");
      lcd.print(" ");
      lcd.print("SUM-");
      lcd.print(" ");
      lcd.print(obsh_nastrel);
      lcd.print(" ");
      lcd.setCursor(0, 1);
      lcd.print("1");        
      lcd.setCursor(3, 1);
      lcd.print(zadanie1);
      lcd.print(" ");
      lcd.setCursor(7, 1);
      lcd.print(magaz1);
      lcd.print(" ");
      lcd.setCursor(11, 1);
      lcd.print(nastrel1);
      lcd.print(" ");
      lcd.setCursor(17, 1);
      lcd.print("AIR");
      lcd.setCursor(0, 2);
      lcd.print("2");        
      lcd.setCursor(3, 2);
      lcd.print(zadanie2);
      lcd.print(" ");
      lcd.setCursor(7, 2);
      lcd.print(magaz2);
      lcd.print(" ");
      lcd.setCursor(11, 2);
      lcd.print(nastrel2);
      lcd.print(" ");
      lcd.setCursor(16, 2);
      lcd.print("SOFT");
      lcd.setCursor(0, 3);
      lcd.print("3");        
      lcd.setCursor(3, 3);
      lcd.print(zadanie3);
      lcd.print(" ");
      lcd.setCursor(7, 3);
      lcd.print(magaz3);
      lcd.print(" ");
      lcd.setCursor(11, 3);
      lcd.print(nastrel3);
      lcd.print(" ");
      lcd.setCursor(15, 3);
      lcd.print("ARENA");
    if(outoffbt == LOW  && Recflag==0)
        {
          Recflag=1;
          }
      if(outoffbt == HIGH && Recflag==1){
    lcd.clear();
    SD.remove("van.txt");
        delay(10);
      myFile = SD.open("van.txt", FILE_WRITE);
      if (myFile) {
        Serial.print("Writing to van.txt...");
        Serial.println(lastfilestr+1);
        myFile.print(lastfilestr+1);
        myFile.close();
        Serial.println("done.");
          } else {
          Serial.println("error writing van.txt");
      }
      myFile = SD.open("tir.txt", FILE_WRITE);
      if (myFile) {
        filestrs[lastfilestr]=myFile.position();
      // myFile.print(var);
        myFile.print("---");
      //  myFile.print(rtc.getDateStr());
      // myFile.print(" ");
        myFile.print(rtc.getTimeStr());
        myFile.print("---");
        myFile.print(obsh_nastrel);
        myFile.print("---");
      myFile.println(lastfilestr);
        lastfilestr++;
        myFile.close();
        Serial.print("Writing to tir.txt...");
        Serial.println(lastfilestr);
        //if(var == 99){
      // var = 0;
        //}
        // Serial.println("done.");
      } else {
        // if the file didn't open, print an error:
      Serial.println("Error writing ");
      }
    // var++;
      Recflag=0;
        }
    }
    }
    }
     
    [/CODE]