sd card модуль и lcd

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

Всем здравствуйте. Помогите разобраться. Задача такова: есть четыре кнопки "запись", "чтение", "вперед", "назад"

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

Заранее спасибо

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

И с чем нужно разбираться?

vankenshtein
Offline
Зарегистрирован: 15.04.2014
#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);

Time t;
File myFile;

int num=0;
int Recflag=0;

 int podacha10bt3 = 36;    
 int kurokbt3 = 38;
  int offbt = 39;
 int readbt = 40;
 
 void setup()
{
   Serial.begin(9600);   

  pinMode(podacha10bt3, INPUT);  
  pinMode(kurokbt3, INPUT);
  pinMode(offbt, INPUT);
  pinMode(readbt, INPUT);
  
  
   pinMode(10, OUTPUT);
  lcd.begin(20, 4);
  delay(100);
   if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  
}
void loop()

{
   t = rtc.getTime();
   
   
   if(digitalRead(offbt) == LOW  && Recflag==0) 
    { 
       Recflag=1;
       }
  if(digitalRead(offbt) == HIGH && Recflag==1){ 
   myFile = SD.open("test.txt", FILE_WRITE);
  if (myFile) {
    myFile.print(num);
    myFile.print("---");
    myFile.print(rtc.getTimeStr());
    myFile.print("---");
    myFile.println("test test test");
    num++;
    myFile.close();
  } else {
    // if the file didn't open, print an error:
  Serial.println("Error writing ");
    }
      Recflag=0;
 }
   
    if(digitalRead(readbt) == HIGH && Recflag==1){ 
 myFile = SD.open("test.txt");
  if (myFile) {

    while (myFile.available()) {
       lcd.setCursor(0, 0);
  lcd.print(myFile.read()); 
    }
    // close the file:
    myFile.close();
    
  } else {
  	// if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
   
}
}

 

 

нужно сделать что б при нажатии кнопки"вперед" переходил на следущую строчку, при нажатии на кнопки "назад" на предыдущую

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

А строчка это что?

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Puhlyaviy пишет:
А строчка это что?

Это набор буквенно-цифровых символов ограниченных размерами листа/страницы/экрана по вертикали для некоторых стран юго-востока либо по горизонтали для остальных.

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

на сд карту записывается строка из 20 символов после нажатия на кнопку "запись", т.е. файл постоянно пополняться будет. один раз нажал на "запись", строка записалась, нажал второй раз на "запись" записалась вторая строка, и т.д. А потом если вошли в режим просмотра файла на дисплее выводится первая строка, нажали кнопку "вперед" отобразилась следующая строка, и т.д. до последней строки

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

набор цифр и символов, например:

21.06.2015-10:00-54

21.06.2015-11:25-4

21.06.2015-12:00-19

21.06.2015-13:09-48

21.06.2015-14:50-54

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

Ну так и читайте 1 строку.

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

не могли бы вы подсказать как?

vankenshtein
Offline
Зарегистрирован: 15.04.2014
 
 while (myFile.available()) {

       lcd.setCursor(0, 0);

  lcd.print(myFile.read());

    }

Считывается весь файл, а как по одной строке считывать?

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

// until the file is not finished
while (myFile.available()) {
// read from the file into buffer
myFile.read(buffer, sizeof(buffer));

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

спасибо за помощь, щас буду пробовать

vankenshtein
Offline
Зарегистрирован: 15.04.2014
int buffer[20];


  while (myFile.available()) {
       lcd.setCursor(0, 0);
       myFile.read(buffer, sizeof(buffer))
  lcd.print(buffer); 

Так правильно?

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

Аммм, а где все остальное? О.о

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

простите вот

#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);

Time t;
File myFile;

int num=0;
int Recflag=0;

int buffer[20];

 int podacha10bt3 = 36;    
 int kurokbt3 = 38;
  int offbt = 39;
 int readbt = 40;
 
 void setup()
{
   Serial.begin(9600);   

  pinMode(podacha10bt3, INPUT);  
  pinMode(kurokbt3, INPUT);
  pinMode(offbt, INPUT);
  pinMode(readbt, INPUT);
  
  
   pinMode(10, OUTPUT);
  lcd.begin(20, 4);
  delay(100);
   if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  
}
void loop()

{
   t = rtc.getTime();
   
   
   if(digitalRead(offbt) == LOW  && Recflag==0) 
    { 
       Recflag=1;
       }
  if(digitalRead(offbt) == HIGH && Recflag==1){ 
   myFile = SD.open("test.txt", FILE_WRITE);
  if (myFile) {
    myFile.print(num);
    myFile.print("---");
    myFile.print(rtc.getTimeStr());
    myFile.print("---");
    myFile.println("test test test");
    num++;
    myFile.close();
  } else {
    // if the file didn't open, print an error:
  Serial.println("Error writing ");
    }
      Recflag=0;
 }
   
    if(digitalRead(readbt) == HIGH && Recflag==1){ 
 myFile = SD.open("test.txt");
  if (myFile) {

    while (myFile.available()) {
       lcd.setCursor(0, 0);
       myFile.read(buffer, sizeof(buffer))
  lcd.print(buffer); 
    }
    // close the file:
    myFile.close();
    
  } else {
  	// if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
   
}
}

При нажатии на кнопку вперед buffer++;  на кнопку нвзвд buffer--;  ?

 

не успел еще

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

Не. Даю на водку.
сколько строк в файле?

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

это не известно, строки добавляться будут постоянно

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

int buffer[20]; получается тут надо прописать количество строк, а не количество символов в строке. как же тогда узнать количество строк если это число меняться постоянно будет?  а возможно так?

int buffer[stroka]; а в loop после нажатия на кнопку запись stroka++?

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

vankenshtein пишет:

это не известно, строки добавляться будут постоянно


Смелое заявление...
А если посчитать?
И не забыть считать что на экране они все не поместятся.

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

Мдааа, я уж думал вот сообразительный ученик попался. :(
Предположим что при включении наверное мы можем читать блоки по 20 символов и считать сколько прочитали блоков?
Предположим что мы можем завести переменную которая будет обозначать строку на экоане ...
Дальше догадаетесь?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

vankenshtein пишет:

это не известно, строки добавляться будут постоянно

после нажатия на кнопку "чтение" - очень даже известно

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

SU-27-16 пишет:

vankenshtein пишет:

это не известно, строки добавляться будут постоянно

после нажатия на кнопку "чтение" - очень даже известно


Нажми на кнопку mute

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

Простите за несообразительность. 

    char simvol[20];
   int stroka=0;
    while (myfile.available()) { 
     simvol[tstroka]=myfile.read();
}

в итоге переменная stroka будет равна количеству строк в файле?

или опять не так понял

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

Зайдем с другой стороны.
На экране сколько строк за раз помещается? Есть идеи как их пролистывать?

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

vankenshtein пишет:

Простите за несообразительность. 

    char simvol[20];
   int stroka=0;
    while (myfile.available()) { 
     simvol[tstroka]=myfile.read();
}

в итоге переменная stroka будет равна количеству строк в файле?

или опять не так понял


У вас всегда есть под рукой возможность отправить переиенную в serial и посмотреть что ваи таи насчиталось.

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

на экране четиыре строки, не могу понять как

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

vankenshtein пишет:

на экране четиыре строки, не могу понять как


Бааальшой список... рамочка в 4 строки движется вверх или вниз по списку. ..

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

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

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

vankenshtein пишет:

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


Что еще может быть не понятно?
Зная общее количество строк, пнрнмещаем по ним метку и ввводи на печать 4 строки от метки вниз...
Начните с начала. У вас все перепуталось в голове.

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

Это точно, насчет перепуталось в голове

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

vankenshtein пишет:

Это точно, насчет перепуталось в голове


Значит нужно отложить в сторону. Пойти попить чайку. Погулять. И вернуться к этому чуть позже. Это будет чуть сложнее чем вы предполагали.

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

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

vankenshtein
Offline
Зарегистрирован: 15.04.2014
#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);

Time t;
File myFile;

int num=0;
int Recflag=0;


 int podacha10bt3 = 36;    
 int kurokbt3 = 38;
  int offbt = 39;
 int readbt = 41;
 
 void setup()
{
   Serial.begin(9600);   

  pinMode(podacha10bt3, INPUT);  
  pinMode(kurokbt3, INPUT);
  pinMode(offbt, INPUT);
  pinMode(readbt, INPUT);
  
  
   pinMode(10, OUTPUT);
  lcd.begin(20, 4);
  delay(100);
   if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  
}
void loop()

{
   t = rtc.getTime();
   
   
   if(digitalRead(offbt) == LOW  && Recflag==0) 
    { 
       Recflag=1;
       }
  if(digitalRead(offbt) == HIGH && Recflag==1){ 
   myFile = SD.open("test.txt", FILE_WRITE);
  if (myFile) {
    myFile.print(num);
    myFile.print("---");
    myFile.print(rtc.getTimeStr());
    myFile.print("---");
    myFile.println("test test test");
    num++;
    myFile.close();
     Serial.println("writing... ");
  } else {
    // if the file didn't open, print an error:
  Serial.println("Error writing ");
    }
      Recflag=0;
 }
   
    if(digitalRead(readbt) == HIGH){ 
 myFile = SD.open("test.txt");
  if (myFile) {
    while (myFile.available()) {
   char simvol[20];
   int stroka=0;
     simvol[stroka]=myFile.read();
        myFile.close();
        Serial.println(stroka);
}
  } else {
  	// if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
   
}
}
Serial.println(stroka); в сериале 0

в фпйле строки есть

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

vankenshtein пишет:

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

вот !!!!!
подход один - а выводов два :
- спасибо ! научили думать
- ты тролль !
:)

я не рано отжал "mute" ?
:)

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

помогли бы лучше......

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

vankenshtein пишет:

помогли бы лучше......

не обращайте внимание !
вам подсказывает самый злой тролль ! ( по версии форума ) - это уже помощь !!!!!!!

он же вам вектор указал - куда рыть !
это больше - чем дать готовый код....

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

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

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012
int stroka=0;

а что Вы хотели там увидеть?

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

количество строк в файле

дальше же считывается кол во строк  simvol[stroka]=myFile.read();  или не так?

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

так, но только один раз. переменная stroka у Вас не меняется. Она всегда равна 0

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

а все понял вынести из цикла while

 char simvol[20];
74

   int stroka=0;

до setup() прописать?

обе переменных?

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

+ как переменная должна узнать что ей надо изменяться? Только Вы можете ее наставить на путь истинный :)

vankenshtein
Offline
Зарегистрирован: 15.04.2014
if (myFile) {

    while (myFile.available()) {
     simvol[stroka]=myFile.read();
stroka++;
        myFile.close();
        Serial.println(stroka);

}

Вот так?

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

строки всего три в файлк счетчик доходит до 218 потом перестает открывать файл т.е. выводится в сериал эта строка  

Serial.println("error opening test.txt");

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Теперь смотрим указания Пухлявого в начале обсуждения и находим разницу.

Arhat109
Offline
Зарегистрирован: 26.05.2015

Нет, не так.

Для начала, немного терминологии:

Файл - некая последовательность символов в нем хранящаяся. Вы его создаете в том куске кода, который по кнопке Write. Обратите внимание, что данные вы в него пихаете не по 1 символу, а "пачками" - строкой. Которая нормально кончается символом "\n". println()? как раз и пишет, формируя этот признак "конец строки".

То что вам надо, это теперь организовать чтение так, чтобы обратно читался не весь файл, а только 1 (одна) строка. То бишь от первого символа и до ... первого конца строки. А когда вы нажимаете на "вперед", читалась "следующая" такая порция... соответственно, когда "назад" ... предыдущая.

поищите КАК в той библиотеке, что вы пользуете читать не весь файл, а только одну строчку из него И (главное) КАК позиционаровать указатель текущей позиции в файле "вперед и назад" по файлу. Зная размер только что считанной и предыдущей строчек вернуться назад - означает всего лишь изменить текущую позицию файла на сумму этих размеров и считать снова 1 строку.

Как-то так.

Arhat109
Offline
Зарегистрирован: 26.05.2015

Посмотрел SD.h. "так оно и есть". :)

Откройте для себя методы position()  и seek(), в частности.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Arhat109 пишет:

Нет, не так.

Для начала, немного терминологии:

Файл - некая последовательность символов в нем хранящаяся.

<skipped>

ОЙ! И давно? А если музыкальный диск на свет посмотреть то текст песни можно прочитать?

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

спасибо а советы, почиталпро функции, но серавно не могу понять......... не могли бы вы на каком нибудь  примере показать

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

Arhat109 пишет:

Посмотрел SD.h. "так оно и есть". :)

Откройте для себя методы position()  и seek(), в частности.


Чё ж ты код не написал сразу? Помошник блин.
Мы тут деревяным методом решаем сначала. А оптимизация потом. Иди займись сыном, блин бедный ребенок.
Иди лучше огород вскопай. Детской лопаткой. На глубину метра. 3 раза

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

myFile.read(buffer, sizeof(buffer)); что делает?