пролистывание строк на дисплее
- Войдите на сайт для отправки комментариев
Чт, 30/07/2015 - 19:55
Наконец кое что получилось и заработало, только есть проблемка, при перезагрузки перестают листаться строчки. Насколько понимаю обнуляется какая то переменная, много чего перепробовал но ничего не вышло. Подскажите пожалуйста что делать дальше?
#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;
}
}
}
Ни у кого никаких идей нет?
Задумался. ..
При перезагрузке перестают листаться строчки....
А когда ж они вообще листаются, если при оестарте не работают. ..
Все страньше и страньше. ..
Посмотрел код... а тот кто вам его написал, не хочет ремонтировать? Или вы забыли ему заплатить?
с кодом помог человек который щас занят, дело не в деньгах
значит дело не в обнулении переменной? не подскажете хотя б направление где искать?
с кодом помог человек который щас занят, дело не в деньгах
Не помог. А сделал за вас!
Такой маленький нюанс.
Может пойти к тому человеку и отблагодарить? Глядишь и не очень он занят.
Согласен эту часть сделал за меня. Отблагодарил конечно
Согласен эту часть сделал за меня. Отблагодарил конечно
Ну в целом вас можно показывать в разделе " им помогли" :)
оно вообще работает? :)
работает все листается пока не ребутнешь, и тогда все по новой удаляешь файл пишешь в него знавов и тогда работает пока не перегрузишь опять
Ну то что вы выдрали. Работать не может.
Где то еще куски потерялись.. а вообще эпично.. попробуйте компу по жесткому диску молотком стучать когда он пишет или читает.
Впечатление что писал человек далекий от мк
#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; }Код конечно корявый, но работает
Код конечно корявый, но работает
Ах у ели, ах у елки, ах у ели злые волки.
Гыыы
Только учусь.....
Все работает, осталось только разобраться с пролистыванием строк, но к сожалению ничего не получается(((
Не, я пасс. 800 строк с кучей вложений. У меня глаз дергается.
Просто подход изначально не правильный. Нельзя постоянно читать sd. Она должна читаться только по необходимости. Иначе при обрыве питания файл будет биться.
так она читается только когда заходишь в режим чтения, щедкнуд тумблер перешел в режим чтения
поэтому в первый раз выложил только тот кусок кода где идет запись и чтение с карты)
Угу щелкнул и как начало читать без остановки
так понял сделаю что б только один раз считывало, а с пролистыванием строк не подскажете что не так
int i =0; while ( i<1 ) { //читаем файл i++; }так понял сделаю что б только один раз считывало, а с пролистыванием строк не подскажете что не так
А что с ним?
Вообще странный подход . ИМХО.
Я бы сначала порядок навел. МК не должен ничего делать пока нет событий. А он у вас лопатит как мельница и не понятно зачем.
код аверно не просто странный а жуткий с точки зрения профи, тут согласен. Порядок постараюсь навести, хотя с моими знаниями будет сложно..... С пролистыванием строк писал в начале, после перезагрузки перестают пролистываться
код аверно не просто странный а жуткий с точки зрения профи, тут согласен. Порядок постараюсь навести, хотя с моими знаниями будет сложно..... С пролистыванием строк писал в начале, после перезагрузки перестают пролистываться
Мне вот интересно, это с рождения у вас? Или приобретенное?
Я уже несколько раз написал. Да и неужели так тяжело причину определить?
Как вам видится sd card? Если не обращать внимания на размер, сильно от жесткого диска отличается?
Вот вы читаете книгу и тут вам по башке кирпич прилетел. Я думаю вы забудете и что читали и на какой странице и вообще книгу будет проще выкинуть, ибо кровью зальет.
считывать в setup() а пролистывание строк сделать в loop() ? а с записью в файл все нормально?
Есть такой прием, создание функций.
прошлый раз у нас ничего не получилось с функциями((
переделал, теперь считывание файла происходит только при нажатии на кнопки меню вверх и вниз, работает так же строки пролистываются и вверх и вниз, но при перезагрузки ардуины, опять отображаются только первые четыре строки и не листаются дальше
//РЕЖИМ ЧТЕНИЯ 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);// объявление массива начал строк
И вот это всё влезло в память ардуины? o_0
> Нужно смотреть за расходом ОЗУ.
Взоржал в голос! И прямо за этим комментарием куча констант которые нужны раз за весь код.
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 всеравно
Я вообще не понимаю зачем массив
Так в нем смещения начала строк в файле накапливаю по мере записи - строка 651. А при выводе на экран по ним строки и берутся. После ребута, понятно, массив чист и мы имеем эту тему. Но ТС чёто заподозрил и пытается сохранить массив в еепром, пока неудачно :) Воще конечно без массива наверно проще.
К стати в частом чтении SD воще криминала нет, зря переделывали.
Подскажите пожалуйста что делать?
Опять?
В прошлый раз, разобрали
1. Как прочитать из файла строку
2. Как посчитать строки в файле
3. Как их вывести на дисплей
Чего не хватает?
2. Как посчитать строки в файле
вы предлогаете другую схему без использования массивов?
myFile = SD.open("tir.txt"); if (myFile) { while (myFile.available()) { // читаем первую строку stroka = myFile.read(); if ((stroka=='\n')||(stroka=='\r')) break; tmpstrlen++; } }Я ничего не предлагаю. Писать вам код я не буду. А обьяснять по 5 кругу лень.
так вроде с подсчетом строк разобрался
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; }скажите правильно нет?
Пухлявый, ты хоть точку отсчета дай.
Примерный алгоритм, дальше пусть сам.
Я понимаю, жизнь скучна, но не за счет других.
Примерный алгоритм, дальше пусть сам.
Я понимаю, жизнь скучна, но не за счет других.
Слышь, баклан.. там ниже тема на 3 страницы жевали ему что и как... сходи и почитай. .. мне как бы надоело уже
тааак вроде заработало, подскажите правильно нет?
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();Писец... гадания на кусках кода... вырву там ку ок и влеплю куда нибуть...
Вернемся к началу. Бумага и карандаши. Блок схемы и алгоритмы. Азы програмирования.
#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"); } }вот полный код, сделал функции чтения и записи
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 раз а не один
В #42 мне безмерно нравятся строки 23-26. Нету карты? Ну и пофиг!
> вот только цикл почему то проходит 5 раз а не один
Потому что
Возвращаемые значения
Количество доступных для чтения байт (int).
а как переделать?
Пухлявый пенек ты неубиваемый. Совета не у тебя просят, а бакланишь ты один.
Пухлявый пенек ты неубиваемый. Совета не у тебя просят, а бакланишь ты один.
Вот кроме куч гавна с твоей стороны вообще ничего не слышно... а кроме меня ему вообще никто не пишет :) да и мне уже надоело.
Возвращаемые значения
Количество доступных для чтения байт (int).
а как переделать?
Разобрался с подсчетом строк
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); }правильно или нет?