пролистывание строк на дисплее

vankenshtein
Offline
Зарегистрирован: 15.04.2014

Наконец кое что получилось и заработало, только есть проблемка, при перезагрузки перестают листаться строчки. Насколько понимаю обнуляется какая то переменная, много чего перепробовал но ничего не вышло. Подскажите пожалуйста что делать дальше?

 

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

void loop(){

//РЕЖИМ ЧТЕНИЯ
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;
   
   
    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,2);
    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,3);
    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 < MAX_STRS-1)  firststr++; // если уже стоим на предпоследней строке, дальше двигаться нельзя.
menudown_flag=0;
lcd.clear();
}
}
//ЗАПИСЬ БАЗЫ
if(outoffbt == LOW  && Recflag==0)
    {
      Recflag=1;
      }
  if(outoffbt == HIGH && Recflag==1){
lcd.clear();

  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();
  } else {
    // if the file didn't open, print an error:
  Serial.println("Error writing ");
  }
// var++;
  Recflag=0;
    }
}

}

 

vankenshtein
Offline
Зарегистрирован: 15.04.2014

Ни у кого никаких идей нет?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Задумался. ..
При перезагрузке перестают листаться строчки....
А когда ж они вообще листаются, если при оестарте не работают. ..
Все страньше и страньше. ..

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Посмотрел код... а тот кто вам его написал, не хочет ремонтировать? Или вы забыли ему заплатить?

vankenshtein
Offline
Зарегистрирован: 15.04.2014

с кодом помог человек который щас занят, дело не в деньгах

vankenshtein
Offline
Зарегистрирован: 15.04.2014

значит дело не в обнулении переменной? не подскажете хотя б направление где искать?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

vankenshtein пишет:

с кодом помог человек который щас занят, дело не в деньгах


Не помог. А сделал за вас!
Такой маленький нюанс.

Может пойти к тому человеку и отблагодарить? Глядишь и не очень он занят.

vankenshtein
Offline
Зарегистрирован: 15.04.2014

Согласен эту часть сделал за меня. Отблагодарил конечно

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

vankenshtein пишет:

Согласен эту часть сделал за меня. Отблагодарил конечно


Ну в целом вас можно показывать в разделе " им помогли" :)
оно вообще работает? :)

vankenshtein
Offline
Зарегистрирован: 15.04.2014

работает все листается пока не ребутнешь, и тогда все по новой удаляешь файл пишешь в него знавов и тогда работает пока не перегрузишь опять

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Ну то что вы выдрали. Работать не может.

Где то еще куски потерялись.. а вообще эпично.. попробуйте компу по жесткому диску молотком стучать когда он пишет или читает.

Впечатление что писал человек далекий от мк

vankenshtein
Offline
Зарегистрирован: 15.04.2014
#include <DS1302.h>
#include <Wire.h>
#include <LiquidCrystal.h>
#include <SD.h>
#include <EEPROM.h>
#include <Wtv020sd16p.h>

DS1302 rtc(22, 24, 26);    // (RST, DAT, CLK)
LiquidCrystal lcd(7, 6, 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 flag=0;
int flag1=0;
int flag2=0;
int flag2_1=0;
int flag3=0;
int flag3_1=0;
int flag_zad=0;
int flag_zad1_1=0;
int flag_zad3=0;
int flag_zad3_2=0;
int flag_zad2=0;
int flag_zad2_2=0;

boolean prevState = false;
int addr1 = 0;
int addr2 = 1;
int addr3 = 2;
int addr4 = 3;
int interval = 60;
int interval2 = 60;
int interval3 = 60;

 int podacha10bt1 = 34;    
 int podacha1bt1 = 35;
 int kurokbt1 = 39;
 int podacha10bt2 = 32;    
 int podacha1bt2 = 33;
 int kurokbt2 = 38;
 int dvig3 = 23;
 int dvig2 = 25;
 int dvig = 27;
 int podacha10bt3 = 30;    
 int podacha1bt3 = 31;
 int kurokbt3 = 36;
 int offbt = 37;
 int readbt = 28;
 int nastrbt = 29;
 int resetPin = 42;  // The pin number of the reset pin.
int clockPin = 43;  // The pin number of the clock pin.
int dataPin = 44;  // The pin number of the data pin.
int busyPin = 45;  // The pin number of the busy pin.
 int led1 = 54;
 int led2 = 55;
 int led3 = 56;
 
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;


Wtv020sd16p wtv020sd16p(resetPin,clockPin,dataPin,busyPin);

unsigned long math_time,old_time,real_time;  
unsigned long math_time1,old_time1,real_time1;  
unsigned long math_time2,old_time2,real_time2;
unsigned long math_time2_2,old_time2_2,real_time2_2;
unsigned long math_time3,old_time3,real_time3;
unsigned long math_time3_2,old_time3_2,real_time3_2;

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()
{
  wtv020sd16p.reset();
     //  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(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  
   interval = EEPROM.read(addr1);
  delay(10);
  interval2 = EEPROM.read(addr2);
    delay(10);
  interval3 = EEPROM.read(addr3);
    delay(10);

  pinMode(10, OUTPUT);
  lcd.begin(20, 4);
  delay(100);
   if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  Serial.println(lastfilestr);
}

void loop()

{
   t = rtc.getTime();
 // digitalWrite(led3, HIGH); 
 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 && readbt_state == HIGH){
   digitalWrite(led1, HIGH);
   digitalWrite(led2, HIGH);
   digitalWrite(led3, HIGH);
   delay(500);
   digitalWrite(led1, LOW);
   digitalWrite(led2, LOW);
   digitalWrite(led3, LOW);
   delay(500);
 }
 
      // НАСТРОЙКА
      
        boolean state = digitalRead(nastrbt);
  if(state == true)
  {
    if(nastrbt_state == HIGH && readbt_state == LOW){
  
  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;
    
    
     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,2);
    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,3);
    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 < 2000 && output > LOW)  
          {  
             real_time = millis();             //получить реальное время   
             math_time = real_time - old_time; //считаем длительность удержания 
             output=digitalRead(podacha10bt1);  
          }   
        if(math_time > 1999 && magaz1 < 100) 
          { 
            magaz1 += 300;  
           wtv020sd16p.asyncPlayVoice(0);
          }
          else if(math_time > 30 && magaz1 >= 10 && flag_zad==0) 
            { 
              flag_zad=1;
          } 
           else if(math_time > 30 && magaz1 >= 10 && flag_zad==1) 
            { 
              wtv020sd16p.asyncPlayVoice(0);
              zadanie1 +=10; 
              flag_zad=0;
          } 
     }   
  
  if(digitalRead(podacha1bt1)==HIGH && output2==HIGH) 
     { 
        math_time1 = 0;  
        old_time1 = millis(); 
        while(math_time1 < 2000 && output2 > LOW)  
          { 
             real_time1 = millis();             //получить реальное время   
             math_time1 = real_time1 - old_time1; //считаем длительность удержания 
             output2=digitalRead(podacha1bt1);  
          }   
        if(math_time1 > 1999) 
          { 
            zadanie1 = 0;  
          }
          else if(math_time1 > 30 && magaz1 >= 10 && flag_zad1_1==0) 
            { 
             flag_zad1_1=1; 
          } 
          else if(math_time1 > 30  && magaz1 >= 10 && flag_zad1_1==1) 
            { 
                zadanie1 +=1; 
         nastrel1 = nastrel1 -= 1;
         obsh_nastrel = obsh_nastrel -=1 ; 
          flag_zad1_1=0;
          } 
     } 

  if(output3==LOW && zadanie1 > 0 && flag==0) 
     { 
       flag=1;  
  }
  if(output3==HIGH && zadanie1 > 0 && flag==1) 
     {  
       wtv020sd16p.asyncPlayVoice(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 < 2000 && output2_1 > LOW)  
          {  
             real_time2 = millis();             //получить реальное время   
             math_time2 = real_time2 - old_time2; //считаем длительность удержания 
             output2_1=digitalRead(podacha10bt2);  
          }   
        if(math_time2 > 1999 && magaz2 < 100) 
          { 
            wtv020sd16p.asyncPlayVoice(0);
            magaz2 += 300;  
          }
          else if(math_time2 > 30 && magaz2 >= 10 && flag_zad2==0) 
            { 
              flag_zad2=1;
          } 
           else if(math_time2 > 30 && magaz2 >= 10 && flag_zad2==1) 
            { 
              wtv020sd16p.asyncPlayVoice(0);
              zadanie2 +=10; 
              flag_zad2=0;
          } 
     }  
 
 if(digitalRead(podacha1bt2)==HIGH && output2_2==HIGH) 
     { 
        math_time2_2 = 0;  
        old_time2_2 = millis(); 
        while(math_time2_2 < 2000 && output2_2 > LOW)  
          { 
             real_time2_2 = millis();             //получить реальное время   
             math_time2_2 = real_time2_2 - old_time2_2; //считаем длительность удержания 
             output2_2=digitalRead(podacha1bt2);  
          }   
        if(math_time2_2 > 1999) 
          { 
            zadanie2 = 0;  
          }
          else if(math_time2_2 > 30 && magaz2 >= 10 && flag_zad2_2==0) 
            { 
             flag_zad2_2=1; 
          } 
          else if(math_time2_2 > 30  && magaz2 >= 10 && flag_zad2_2==1) 
            { 
                zadanie2 +=1; 
         nastrel2 = nastrel2 -= 1;
         obsh_nastrel = obsh_nastrel -=1 ; 
          flag_zad2_2=0;
          } 
     } 

  if(output2_3==LOW && zadanie2 > 0 && flag2_1==0) 
     { 
       flag2_1=1;  
  }
  if(output2_3==HIGH && zadanie2 > 0 && flag2_1==1) 
     {  
       wtv020sd16p.asyncPlayVoice(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 < 2000 && output3_1 > LOW)  
          {  
             real_time3 = millis();             //получить реальное время   
             math_time3 = real_time3 - old_time3; //считаем длительность удержания 
             output3_1=digitalRead(podacha10bt3);  
          }   
        if(math_time3 > 1999 && magaz3 < 100) 
          { 
            wtv020sd16p.asyncPlayVoice(0);
            magaz3 += 300;  
          }
          else if(math_time3 > 30 && magaz3 >= 10 && flag_zad3==0) 
            { 
              flag_zad3=1;
          } 
          else if(math_time3 > 30 && magaz3 >= 10 && flag_zad3==1) 
            { 
              wtv020sd16p.asyncPlayVoice(0);
              zadanie3 +=10; 
              flag_zad3=0;
          } 
     }    
     if(digitalRead(podacha1bt3)==HIGH && output3_2==HIGH) 
     { 
        math_time3_2 = 0;  
        old_time3_2 = millis(); 
        while(math_time3_2 < 2000 && output3_2 > LOW)  
          { 
             real_time3_2 = millis();             //получить реальное время   
             math_time3_2 = real_time3_2 - old_time3_2; //считаем длительность удержания 
             output3_2=digitalRead(podacha1bt3);  
          }   
        if(math_time3_2 > 1999) 
          { 
            zadanie3 = 0;  
          }
          else if(math_time3_2 > 30 && magaz3 >= 10 && flag_zad3_2==0) 
            { 
             flag_zad3_2=1; 
          } 
          
          else if(math_time3_2 > 30  && magaz3 >= 10 && flag_zad3_2==1) 
            { 
                zadanie3 +=1; 
         nastrel3 = nastrel3 -= 1;
         obsh_nastrel = obsh_nastrel -=1 ; 
          flag_zad3_2=0;
          } 
     } 
  if(output3_3==LOW && zadanie3 > 0 && flag3_1==0) 
     { 
       flag3_1=1;  
  }
  if(output3_3==HIGH && zadanie3 > 0 && flag3_1==1) 
     {  
       wtv020sd16p.asyncPlayVoice(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();

   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.print("---");
 //  myFile.println(lastfilestr);
    lastfilestr++;
    myFile.close();
     Serial.print("Writing to tir.txt...");
     Serial.println();
  } else {
    // if the file didn't open, print an error:
  Serial.println("Error writing ");
  }
  Recflag=0;
    }
 }
 
 
 
 if(zadanie1 > 0){
   digitalWrite(led1, HIGH);
 }else{
 digitalWrite(led1, LOW);
 }
 if(zadanie2 > 0){
   digitalWrite(led2, HIGH);
 }else{
 digitalWrite(led2, LOW);
 }
 if(zadanie3 > 0){
   digitalWrite(led3, HIGH);
 }else{
 digitalWrite(led3, LOW);
 }
 
  }
  
  if(state == false && prevState == true)
  {
    // сохранить в eeprom
    EEPROM.write(addr1, interval);
      delay(10);
    EEPROM.write(addr2, interval2);
      delay(10);
    EEPROM.write(addr3, interval3);
      delay(10);
      lcd.clear();
  }
  prevState = state;
}

Код конечно корявый, но работает

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

vankenshtein пишет:

Код конечно корявый, но работает


Ах у ели, ах у елки, ах у ели злые волки.
Гыыы

vankenshtein
Offline
Зарегистрирован: 15.04.2014

Только учусь.....

 

Все работает, осталось только разобраться с пролистыванием строк, но к сожалению ничего не получается(((

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Не, я пасс. 800 строк с кучей вложений. У меня глаз дергается.
Просто подход изначально не правильный. Нельзя постоянно читать sd. Она должна читаться только по необходимости. Иначе при обрыве питания файл будет биться.

vankenshtein
Offline
Зарегистрирован: 15.04.2014

так она читается только когда заходишь в режим чтения, щедкнуд тумблер перешел в режим чтения

vankenshtein
Offline
Зарегистрирован: 15.04.2014

поэтому в первый раз выложил только тот кусок кода где идет запись и чтение с карты)

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Угу щелкнул и как начало читать без остановки

vankenshtein
Offline
Зарегистрирован: 15.04.2014

так понял сделаю что б только один раз считывало, а с пролистыванием строк не подскажете что не так

vankenshtein
Offline
Зарегистрирован: 15.04.2014
int i =0;
 while ( i<1 )
    {
       //читаем файл
i++;
    }

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

vankenshtein пишет:

так понял сделаю что б только один раз считывало, а с пролистыванием строк не подскажете что не так


А что с ним?
Вообще странный подход . ИМХО.
Я бы сначала порядок навел. МК не должен ничего делать пока нет событий. А он у вас лопатит как мельница и не понятно зачем.

vankenshtein
Offline
Зарегистрирован: 15.04.2014

код аверно не просто странный а жуткий с точки зрения профи, тут согласен. Порядок постараюсь навести, хотя с моими знаниями будет сложно..... С пролистыванием строк писал в начале, после перезагрузки перестают пролистываться

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

vankenshtein пишет:

код аверно не просто странный а жуткий с точки зрения профи, тут согласен. Порядок постараюсь навести, хотя с моими знаниями будет сложно..... С пролистыванием строк писал в начале, после перезагрузки перестают пролистываться


Мне вот интересно, это с рождения у вас? Или приобретенное?
Я уже несколько раз написал. Да и неужели так тяжело причину определить?
Как вам видится sd card? Если не обращать внимания на размер, сильно от жесткого диска отличается?
Вот вы читаете книгу и тут вам по башке кирпич прилетел. Я думаю вы забудете и что читали и на какой странице и вообще книгу будет проще выкинуть, ибо кровью зальет.

vankenshtein
Offline
Зарегистрирован: 15.04.2014

считывать в setup() а пролистывание строк сделать в loop() ? а с записью в файл все нормально?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Есть такой прием, создание функций.

vankenshtein
Offline
Зарегистрирован: 15.04.2014

прошлый раз у нас ничего не получилось с функциями((

vankenshtein
Offline
Зарегистрирован: 15.04.2014

переделал, теперь считывание файла происходит только при нажатии на кнопки меню вверх и вниз, работает так же строки пролистываются и вверх и вниз, но при перезагрузки ардуины, опять отображаются только первые четыре строки и не листаются дальше

                //РЕЖИМ ЧТЕНИЯ
 if(readbt_state == HIGH && nastrbt_state == LOW){
  char tmpstr1[20];
    char tmpstrlen1=0;
    char tmpstr2[20];
    char tmpstrlen2=0;
    char tmpstr3[20];
    char tmpstrlen3=0;
    char tmpstr4[20];
    char tmpstrlen4=0;
 if(output3_1 == LOW && menuup_flag==0) 
    { 
       menuup_flag=1;
       }
if (output3_1 == HIGH && menuup_flag==1)
{
  myFile = SD.open("tir5.txt");
  if (myFile)
{
    myFile.seek(filestrs[firststr]);
    tmpstrlen1=0;
    while (myFile.available()) { // читаем первую строку
      tmpstr1[tmpstrlen1]=myFile.read();
      if ((tmpstr1[tmpstrlen1]=='\n')||(tmpstr1[tmpstrlen1]=='\r')) break;
       tmpstrlen1++;
    }
   
    tmpstr1[tmpstrlen1]=0;
    while (myFile.available()) { // гоним до следующей строки, пока не пропустим все переводы строки
      char ch=myFile.read();
      if ((ch!='\n')&&(ch!='\r')) break;
    }   
    tmpstrlen2=0;
    while (myFile.available()) {// читаем вторую строку
      tmpstr2[tmpstrlen2]=myFile.read();
      if ((tmpstr2[tmpstrlen2]=='\n')||(tmpstr2[tmpstrlen2]=='\r')) break;
      tmpstrlen2++;
    }
    
   
    tmpstr2[tmpstrlen2]=0;
    
    
     while (myFile.available()) { // гоним до следующей строки, пока не пропустим все переводы строки
      char ch=myFile.read();
      if ((ch!='\n')&&(ch!='\r')) break;
    }   
   tmpstrlen3=0;
    while (myFile.available()) {// читаем третью строку
      tmpstr3[tmpstrlen3]=myFile.read();
      if ((tmpstr3[tmpstrlen3]=='\n')||(tmpstr3[tmpstrlen3]=='\r')) break;
      tmpstrlen3++;
    }
    
  
    tmpstr3[tmpstrlen3]=0;
    
    
    while (myFile.available()) { // гоним до следующей строки, пока не пропустим все переводы строки
      char ch=myFile.read();
      if ((ch!='\n')&&(ch!='\r')) break;
    }   
    tmpstrlen4=0;
    while (myFile.available()) {// читаем четвертую строку
      tmpstr4[tmpstrlen4]=myFile.read();
      if ((tmpstr4[tmpstrlen4]=='\n')||(tmpstr4[tmpstrlen4]=='\r')) break;
      tmpstrlen4++;
    }
    
   
    tmpstr4[tmpstrlen4]=0;  
    myFile.close();
}
    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)
{ 
  myFile = SD.open("tir5.txt");
  if (myFile)
{
    myFile.seek(filestrs[firststr]);
    tmpstrlen1=0;
    while (myFile.available()) { // читаем первую строку
      tmpstr1[tmpstrlen1]=myFile.read();
      if ((tmpstr1[tmpstrlen1]=='\n')||(tmpstr1[tmpstrlen1]=='\r')) break;
       tmpstrlen1++;
    }
   
    tmpstr1[tmpstrlen1]=0;
    while (myFile.available()) { // гоним до следующей строки, пока не пропустим все переводы строки
      char ch=myFile.read();
      if ((ch!='\n')&&(ch!='\r')) break;
    }   
    tmpstrlen2=0;
    while (myFile.available()) {// читаем вторую строку
      tmpstr2[tmpstrlen2]=myFile.read();
      if ((tmpstr2[tmpstrlen2]=='\n')||(tmpstr2[tmpstrlen2]=='\r')) break;
      tmpstrlen2++;
    }
    
   
    tmpstr2[tmpstrlen2]=0;
    
    
     while (myFile.available()) { // гоним до следующей строки, пока не пропустим все переводы строки
      char ch=myFile.read();
      if ((ch!='\n')&&(ch!='\r')) break;
    }   
   tmpstrlen3=0;
    while (myFile.available()) {// читаем третью строку
      tmpstr3[tmpstrlen3]=myFile.read();
      if ((tmpstr3[tmpstrlen3]=='\n')||(tmpstr3[tmpstrlen3]=='\r')) break;
      tmpstrlen3++;
    }
    
  
    tmpstr3[tmpstrlen3]=0;
    
    
    while (myFile.available()) { // гоним до следующей строки, пока не пропустим все переводы строки
      char ch=myFile.read();
      if ((ch!='\n')&&(ch!='\r')) break;
    }   
    tmpstrlen4=0;
    while (myFile.available()) {// читаем четвертую строку
      tmpstr4[tmpstrlen4]=myFile.read();
      if ((tmpstr4[tmpstrlen4]=='\n')||(tmpstr4[tmpstrlen4]=='\r')) break;
      tmpstrlen4++;
    }
    
   
    tmpstr4[tmpstrlen4]=0;  
    myFile.close();
}
  
  if (firststr < 99)   firststr++; // если уже стоим на предпоследней строке, дальше двигаться нельзя.
menudown_flag=0;
lcd.clear();
}
 lcd.setCursor(0,0);
    lcd.print(tmpstr1); 
     lcd.setCursor(0,1);
    lcd.print(tmpstr2);
      lcd.setCursor(0,2);
    lcd.print(tmpstr3);
     lcd.setCursor(0,3);
    lcd.print(tmpstr4);
 

 

Radjah
Offline
Зарегистрирован: 06.08.2014

// объявление массива начал строк

И вот это всё влезло в память ардуины? o_0

> Нужно смотреть за расходом ОЗУ.

Взоржал в голос! И прямо за этим комментарием куча констант которые нужны раз за весь код.

vankenshtein
Offline
Зарегистрирован: 15.04.2014
myFile.seek(filestrs[firststr]);
    Serial.print("filestrs[firststr]_____");
  Serial.println(filestrs[firststr]);
    Serial.print("firststr_____");
    Serial.println(firststr);

до перезагрузки при нажатии на кнопку +

filestrs[firststr]_____16

firststr_____1

filestrs[firststr]_____32

firststr_____2

filestrs[firststr]_____48

firststr_____3

filestrs[firststr]_____64

firststr_____4



после перезагрузки при нажатии на кнопку +



filestrs[firststr]_____0

firststr_____1

filestrs[firststr]_____0

firststr_____2

filestrs[firststr]_____0

firststr_____3

filestrs[firststr]_____0

firststr_____4



пробовал сохранить в еепром filestrs[firststr] потом считать, в итоге в сериале 0 всеравно

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Я вообще не понимаю зачем массив

Logik
Offline
Зарегистрирован: 05.08.2014

Puhlyaviy пишет:
Я вообще не понимаю зачем массив

Так в нем смещения начала строк в файле накапливаю по мере записи - строка 651. А при выводе на экран по ним строки и берутся. После ребута, понятно, массив чист и мы имеем эту тему. Но ТС чёто заподозрил и пытается сохранить массив в еепром, пока неудачно :) Воще конечно без массива наверно проще.

К стати в частом чтении SD воще криминала нет, зря переделывали.

vankenshtein
Offline
Зарегистрирован: 15.04.2014

Подскажите пожалуйста что делать?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Опять?
В прошлый раз, разобрали
1. Как прочитать из файла строку
2. Как посчитать строки в файле
3. Как их вывести на дисплей
Чего не хватает?

vankenshtein
Offline
Зарегистрирован: 15.04.2014

2. Как посчитать строки в файле

vankenshtein
Offline
Зарегистрирован: 15.04.2014

вы предлогаете другую схему без использования массивов?

vankenshtein
Offline
Зарегистрирован: 15.04.2014
 myFile = SD.open("tir.txt");
  if (myFile)
{
    
    while (myFile.available()) { // читаем первую строку
      stroka = myFile.read();
      if ((stroka=='\n')||(stroka=='\r')) break;
       tmpstrlen++;
    }
}

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Я ничего не предлагаю. Писать вам код я не буду. А обьяснять по 5 кругу лень.

vankenshtein
Offline
Зарегистрирован: 15.04.2014

так вроде с подсчетом строк разобрался

       if (output3_2 == HIGH && menudown_flag==1)
{ 
  myFile = SD.open("tir7.txt");
  if (myFile)
{
   
   char tmpstr1[20];
    char tmpstrlen1=0;
    while (myFile.available()) { // читаем первую строку
      tmpstr1[tmpstrlen1]=myFile.read();
             for (i = 0; i < lastfilestr; i++) {
           if ((tmpstr1[tmpstrlen1]=='\n')||(tmpstr1[tmpstrlen1]=='\r')) {
                stroki++; 
            }
        }
        
        
  if(outoffbt == HIGH && Recflag==1){
 lcd.clear();
   myFile = SD.open("tir8.txt", FILE_WRITE);
  if (myFile) {
     filestrs[lastfilestr]=myFile.position();
    myFile.print(var);
    myFile.print("---");
    myFile.print("---");
    myFile.print(obsh_nastrel);
    myFile.print("---");
    myFile.println("---");
    lastfilestr++;
    var++;
    myFile.close();
    EEPROM.write(addr4, lastfilestr);
      delay(10);
     Serial.print("Writing to tir.txt...");
   Serial.println(lastfilestr);
  } else {
  Serial.println("Error writing ");
  }
  Recflag=0;
    }

скажите правильно нет?

boban_
Offline
Зарегистрирован: 09.10.2013

Пухлявый, ты хоть точку отсчета дай.

Примерный алгоритм, дальше пусть сам.

Я понимаю, жизнь скучна, но не за счет других.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

boban_ пишет:
Пухлявый, ты хоть точку отсчета дай.

Примерный алгоритм, дальше пусть сам.

Я понимаю, жизнь скучна, но не за счет других.


Слышь, баклан.. там ниже тема на 3 страницы жевали ему что и как... сходи и почитай. .. мне как бы надоело уже

vankenshtein
Offline
Зарегистрирован: 15.04.2014

тааак вроде заработало, подскажите правильно нет?

  myFile = SD.open("test2.txt");
  if (myFile) {
    char tmpstr[20];
    char tmpstrlen=0;
    int i;
    while (myFile.available()) { // читаем первую строку
      tmpstr[tmpstrlen]=myFile.read();   
           if ((tmpstr[tmpstrlen]=='\n')||(tmpstr[tmpstrlen]=='\r')) {
                stroki++; 
                
                Serial.print("stroki");
                    Serial.println(stroki);
              // Serial.println("test.txt:");
     	//Serial.write(myFile.read());
        }
    }   
    myFile.close();

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Писец... гадания на кусках кода... вырву там ку ок и влеплю куда нибуть...
Вернемся к началу. Бумага и карандаши. Блок схемы и алгоритмы. Азы програмирования.

vankenshtein
Offline
Зарегистрирован: 15.04.2014
#include <SD.h>


 int offbt = 37;
 int podacha10bt3 = 30;    
 int podacha1bt3 = 31;
 int kurokbt3 = 36;

File myFile;
int stroki;
static boolean outoffbt = LOW;
static boolean output3_3 = LOW; 
int menuup_flag=0;
 int Recflag=0;
 
void setup()
{
 
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
   pinMode(53, OUTPUT);
   
  if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done."); 
}

void loop()
{
  output3_3 = digitalRead(kurokbt3);
  outoffbt = digitalRead(offbt);
 if(outoffbt == LOW  && Recflag==0) 
    { 
       Recflag=1;
       }
  if(outoffbt == HIGH && Recflag==1){
    writeStr();
 Recflag=0;
    }	
    
    if(output3_3 == LOW && menuup_flag==0) 
    { 
       menuup_flag=1;
       }
if (output3_3 == HIGH && menuup_flag==1)
{
  kolvoStr();
 menuup_flag=1; 
}

}

void kolvoStr()
{
 myFile = SD.open("test4.txt");
  if (myFile) {
    char tmpstr[16];
    char tmpstrlen=0;
    int i;
    while (myFile.available()) { // читаем первую строку
      tmpstr[tmpstrlen]=myFile.read();   
           if ((tmpstr[tmpstrlen]=='\n')||(tmpstr[tmpstrlen]=='\r')) {
                stroki++; 
                Serial.print("stroki");
                    Serial.println(stroki);
        }
    }   
    myFile.close();
  } else {
    Serial.println("error opening test4.txt");
  }
}

void writeStr()
{
myFile = SD.open("test4.txt", FILE_WRITE);
  if (myFile) {
    Serial.print("Writing to test4.txt...");
    myFile.println("testing 1, 2, 3.");
     myFile.close();
    Serial.println("done.");
  } else {
    Serial.println("error opening test4.txt");
  }
}

вот полный код, сделал функции чтения и записи

vankenshtein
Offline
Зарегистрирован: 15.04.2014
myFile = SD.open("test4.txt");
  if (myFile) {
    char tmpstr[16];
    char tmpstrlen=0;
    while (myFile.available()) { // читаем первую строку
      tmpstr[tmpstrlen]=myFile.read();   
           if ((tmpstr[tmpstrlen]=='\n')||(tmpstr[tmpstrlen]=='\r')) {
                stroki++; 
                Serial.print("stroki");
                    Serial.println(stroki);
        }
    }   
    myFile.close();
  } else {
    Serial.println("error opening test4.txt");
  }

вот только цикл почему то проходит 5 раз а не один

Radjah
Offline
Зарегистрирован: 06.08.2014

В #42 мне безмерно нравятся строки 23-26. Нету карты? Ну и пофиг!

> вот только цикл почему то проходит 5 раз а не один

Потому что

vankenshtein
Offline
Зарегистрирован: 15.04.2014

Возвращаемые значения

Количество доступных для чтения байт (int).

а как переделать?

boban_
Offline
Зарегистрирован: 09.10.2013

Пухлявый пенек ты неубиваемый. Совета не у тебя просят, а бакланишь ты один.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

boban_ пишет:

Пухлявый пенек ты неубиваемый. Совета не у тебя просят, а бакланишь ты один.


Вот кроме куч гавна с твоей стороны вообще ничего не слышно... а кроме меня ему вообще никто не пишет :) да и мне уже надоело.

Radjah
Offline
Зарегистрирован: 06.08.2014

vankenshtein пишет:

Возвращаемые значения

Количество доступных для чтения байт (int).

а как переделать?

Ну логику включай уже и подумай, почему у тебя цикл проходит столько раз.

vankenshtein
Offline
Зарегистрирован: 15.04.2014

Разобрался с подсчетом строк

 myFile = SD.open("test4.txt");
  if (myFile) {
    char tmpstr[16]; //кол-во символов в строке
    int tmpstrlen=0;
    while (myFile.available()) { // читаем первую строку
      tmpstr[tmpstrlen]=myFile.read();   
           if (tmpstr[tmpstrlen]=='\n')  
             tmpstrlen++;           
    } 
     myFile.close();
     Serial.print("stroki");
     Serial.println(tmpstrlen);    
  }

 

vankenshtein
Offline
Зарегистрирован: 15.04.2014

правильно или нет?