Счетчик для водомеров

Чайник в ардуино
Offline
Зарегистрирован: 10.06.2016

Добрый день!

Решил написать программу считывания показаний с водомеров, пробовал оператор countr считает не корректно, пришлось описать это все через условие if (...) программа получилась большой, но работает четко. Теперь стал вопрос о сохранении показаний на SD но так чтоб сохранялись показания при пропадании питания, но при подаче питания чтоб происходило считывание с SD переменных, которые далее обрабатываются прогрммой с последующим сохранением на SD. удалось записать на SD значения переменных   пример: А=1; B=2; С=3;  D=4;  E=5  в итоге на SD получился файл log.txt в котором получилось число 12345

ВОПРОС!  как считать с SD число разложив его опять на переменные А=1; B=2; С=3;  D=4;  E=5 ?

Скетч:

/////////////////////////////// подключение библиотек SPI и SD:
#include <Wire.h>                  // библиотека для работы I²C
#include <SPI.h>
#include <SD.h>
#include <LiquidCrystal_I2C.h>    // библиотека для работы с LCD индикатором  1602L
LiquidCrystal_I2C lcd(0x27, 20, 4); // установка  LCD адреса  0x27 для 20 символов и 4 строки на дисплее
#define printByte(args) write(args);
 
 
//float refresh_rate = 0.0;         // переменая для работы с SD картой
 
 
byte smile[8] = {B00000, B00000, B00000, B00000, B01110, B01110, B01110, B00000,}; // символ увеличенная точка
const uint8_t PIN_CS = 4;   // указываем номер вывода arduino подключенного к выводу CS адаптера
const int button  = 2;          // вывод контроллера для COOL WATER 1
const int button4  = 4;         // вывод контроллера для коррекция показаний
int i = 0;                              // разряд учета литров первой строки
int a = 0;                              // разряд учета десятков литров первой строки
int b = 0;                              // разряд учета сотен литров первой строки
int c = 0;                              // разряд учета едениц кубометров первой строки
int d = 0;                              // разряд учета десятков кубометров первой строки
int e = 0;                              // разряд учета сотен кубометров первой строки
int f = 0;                              // разряд учета тысяч кубометров первой строки
int g = 0;                              // разряд учета десятков тысяч кубометров первой строки
int button_old   = 1;                   // предыдущее значение входа для отлавливания момента cool WATER  1
File myFile;                            // создаём переменную myFile класса File, которая будет служить "указателем" на открытый файл
void setup()
{
  lcd.init();                           // инициализация ЖК дисплея
  lcd.clear();                          // очистка экрана
  lcd.backlight();                      // включение подсветки дисплея
  lcd.begin(20, 4);                     // настройка дисплея (число солбцов и строк)
  //lcd.createChar(3, smile);           // создаём символ увеличенная точка
  pinMode(button,  INPUT_PULLUP);       // активируем внутренней подтягивающий резистор для первого входа
  pinMode(button4, INPUT_PULLUP);       // активируем внутренней подтягивающий резистор для коррекции первого входа
  pinMode (PIN_CS, OUTPUT);             // настраиваем пин как выход для управления SD картой
 
  Serial.begin(9600);                   // открываем последовательный порт на скорости 9600 бод
  Serial.println ("Initializing card"); // вывод информации в COM-порт
  //////////////////////////////////////// используем ответ инициализации, для определения работоспособности карты и адаптера
  if (!SD.begin(PIN_CS)) {              // инициализация SD карты с указанием номера вывода CS
    Serial.println("initialization failed!"); // Карта не инициализирована вывод информации в COM-порт
    lcd.setCursor(1, 0);                      // курсор в первую строку на первый знак
    lcd.print("initializing failed");         // выводим на экран фразу
    lcd.setCursor(5, 2);                      // курсор в третью строку на пятый знак
    lcd.print("None card");                   // выводим  на экран фразу
    while (1);  // ошибка инициализации. карта не обнаружена или не подключён (неправильно подключён) адаптер карт MicroSD
  }
 
 
  Serial.println("Card Ready");
  myFile = SD.open("log.txt", FILE_WRITE);    // если файла с именем "log.txt" - нет, то он будет создан.
  ////////////////////////////////////////////// проверяем наличие файла "iarduino.txt" на SD-карте
  if (SD.exists("log.txt")) {                 // если файл с именем "log.txt" существует, то ...
    Serial.println("Ready fail log.txt");
  } else {                                    // иначе ...
    Serial.println ("File access denied. ");
    Serial.println("Don't ready file log.txt");
    lcd.clear();                              // очищаем экран
    lcd.setCursor(3, 0);                      // курсор в первую строку на первый знак
    lcd.print("Access denied");               // выводим  на экран фразу
    lcd.setCursor(2, 2);                      // курсор в первую строку на первый знак
    lcd.print("Don't ready file");            // выводим  на экран фразу
    // Serial.print ("Don't ready file ");
    lcd.setCursor(6, 3);                      // курсор в первую строку на первый знак
    lcd.print("Log.txt");                     // выводим  на экран фразу
    //Serial.println ("Log.txt");
    while (1);
  }
  Serial.println("file is opened");
  //////////////////////////////////////// Вывод закрепленных сообщений на дисплее
  lcd.setCursor(0, 0);                  // курсор в четвертую строку на первый знак
  lcd.print("Card GOOD:");              // вывести на LCD надпись в кавычках
  delay (5000);
 
 
  // читаем с флешки значение переменных и присваиваем их
  // помогите вставить сюда скетч считывания переменных с SD
 
 
}
void loop()
{
  myFile.close();
  lcd.clear();                          // очистка экрана
  lcd.setCursor(0, 0);                  // курсор в первую строку на первый знак
  lcd.print("File close");              // вывести на LCD надпись в кавычках **туалет**
  delay (1000);
  //  удаляем файл "log.txt"
  SD.remove("log.txt ");
  if (SD.remove("log.txt "))
  {
    //delay (1000);
    lcd.clear();                        // очистка экрана
    lcd.setCursor(0, 1);                  // курсор во вторую строку на первый знак
    lcd.print("File deleted");            // вывести на LCD надпись в кавычках **туалет**
  }
  else
  {
    delay (1000);
    lcd.clear();                        // очистка экрана
    lcd.setCursor(0, 3);                  // курсор в четвертую строку на первый знак
    lcd.print("File don't deleted");      // вывести на LCD надпись в кавычках **туалет**
  }
  delay (1000);
  while (1);
 
  ///  чтение с карты
  myFile = SD.open("log.txt");
  if (myFile)
  {
    Serial.println("log.txt:");
 
    // прочитать весь текст, записанный в файле
    while (myFile.available())
    {
      Serial.write(myFile.read());
    }
    // закрыть файл
    myFile.close();
  }
  else // если файл не может быть открыт, то выдать сообщение об ошибке
  {
    Serial.println("error opening the text file!");
  }
}
 
// матиматическая часть
 
if (digitalRead(button) == LOW)   // кнопка корриктировки показаний в ручном режиме
{
  lcd.setCursor(16, 0);               // устанавливаем курсор на строку 1, символ 16
  lcd.printByte(3);                   // печатаем символ увеличенная точка
  delay(5);                           // пауза 0,005 сек.
}
else if (digitalRead(button) == HIGH)
{
  lcd.setCursor(16, 0);               // устанавливаем курсор на строку 1, символ 16
  lcd.print(".");                     // печатаем символ уменьшенная точка
  delay(5);                           // пауза 0,005 сек.
}
if (digitalRead(button4) == LOW)      // КОРРЕКЦИЯ КУБОМЕТРОВ
{
  c = c + 1;
  delay(500);                        // пауза 1 сек.
}
 
// вывод информации на дисплей LCD
//////////////////////////////////////// Здесь программа обработки входного сигнала 1 и вывод на дисплей в первую строку
if ((digitalRead(button) == LOW) && (button_old == 1))    // для процесса отладки условие забить ремаркой
  i = i + 1;
if (i < 9.5)
{
  lcd.setCursor(19, 0);               // курсор в верхнюю строку на 19 знак
  lcd.print (i);                      // вывести на LCD значение I
}
if (i > 9.5)
{
  i = 0;
  lcd.setCursor(19, 0);               // курсор в верхнюю строку на 19 знак
  lcd.print (i);                      // вывести на LCD значение I
  a = a + 1;
  lcd.setCursor(18, 0);               // курсор в верхнюю строку на 18 знак
  lcd.print (a);                      // вывести на LCD значение A
}
if (a < 9.5)
{
  lcd.setCursor(18, 0);               // курсор в верхнюю строку на 19 знак
  lcd.print (a);                      // вывести на LCD значение I
}
if (a > 9.5)
{
  i = 0;
  lcd.setCursor(19, 0);               // курсор в верхнюю строку на 19 знак
  lcd.print (i);                      // вывести на LCD значение I
  a = 0;
  lcd.setCursor(18, 0);               // курсор в верхнюю строку на 18 знак
  lcd.print (a);                      // вывести на LCD значение A
  b = b + 1;
  lcd.setCursor(17, 0);               // курсор в верхнюю строку на 17 знак
  lcd.print (b);                      // вывести на LCD значение B
}
if (b < 9.5)
{
  lcd.setCursor(17, 0);               // курсор в верхнюю строку на 19 знак
  lcd.print (b);                      // вывести на LCD значение I
}
if (b > 9.5)
{
  i = 0;
  lcd.setCursor(19, 0);               // курсор в верхнюю строку на 19 знак
  lcd.print (i);                      // вывести на LCD значение I
  a = 0;
  lcd.setCursor(18, 0);               // курсор в верхнюю строку на 18 знак
  lcd.print (a);                      // вывести на LCD значение A
  b = 0;
  lcd.setCursor(17, 0);               // курсор в верхнюю строку на 17 знак
  lcd.print (b);                      // вывести на LCD значение B
  lcd.setCursor(16, 0);               // курсор в верхнюю строку на 16 знак
  lcd.print(".");                     // вывести на LCD надпись в кавычках
  c = c + 1;
  lcd.setCursor(15, 0);               // курсор в верхнюю строку на 15 знак
  lcd.print (c);                      // вывести на LCD значение C
}
if (c < 9.5)
{
  lcd.setCursor(15, 0);               // курсор в верхнюю строку на 19 знак
  lcd.print (c);                      // вывести на LCD значение I
}
if (c > 9.5)
{
  i = 0;
  lcd.setCursor(19, 0);               // курсор в верхнюю строку на 19 знак
  lcd.print (i);                      // вывести на LCD значение I
  a = 0;
  lcd.setCursor(18, 0);               // курсор в верхнюю строку на 18 знак
  lcd.print (a);                      // вывести на LCD значение A
  b = 0;
  lcd.setCursor(17, 0);               // курсор в верхнюю строку на 17 знак
  lcd.print (b);                      // вывести на LCD значение B
  lcd.setCursor(16, 0);               // курсор в верхнюю строку на 16 знак
  lcd.print(".");                     // вывести на LCD надпись в кавычках
  c = 0;
  lcd.setCursor(15, 0);               // курсор в верхнюю строку на 15 знак
  lcd.print (c);                      // вывести на LCD значение C
  d = d + 1;
  lcd.setCursor(14, 0);               // курсор в верхнюю строку на 14 знак
  lcd.print (d);                      // вывести на LCD значение D
}
if (d < 9.5)
{
  lcd.setCursor(14, 0);               // курсор в верхнюю строку на 19 знак
  lcd.print (d);                      // вывести на LCD значение I
}
if (d > 9.5)
{
  i = 0;
  lcd.setCursor(19, 0);               // курсор в верхнюю строку на 19 знак
  lcd.print (i);                      // вывести на LCD значение I
  a = 0;
  lcd.setCursor(18, 0);               // курсор в верхнюю строку на 18 знак
  lcd.print (a);                      // вывести на LCD значение A
  b = 0;
  lcd.setCursor(17, 0);               // курсор в верхнюю строку на 17 знак
  lcd.print (b);                      // вывести на LCD значение B
  lcd.setCursor(16, 0);               // курсор в верхнюю строку на 16 знак
  lcd.print(".");                     // вывести на LCD надпись в кавычках
  c = 0;
  lcd.setCursor(15, 0);               // курсор в верхнюю строку на 15 знак
  lcd.print (c);                      // вывести на LCD значение C
  d = 0;
  lcd.setCursor(14, 0);               // курсор в верхнюю строку на 14 знак
  lcd.print (d);                      // вывести на LCD значение D
  e = e + 1;
  lcd.setCursor(13, 0);               // курсор в верхнюю строку на 13 знак
  lcd.print (e);                      // вывести на LCD значение E
}
if (e < 9.5)
{
  lcd.setCursor(13, 0);               // курсор в верхнюю строку на 19 знак
  lcd.print (e);                      // вывести на LCD значение I
}
if (e > 9.5)
{
  i = 0;
  lcd.setCursor(19, 0);               // курсор в верхнюю строку на 19 знак
  lcd.print (i);                      // вывести на LCD значение I
  a = 0;
  lcd.setCursor(18, 0);               // курсор в верхнюю строку на 18 знак
  lcd.print (a);                      // вывести на LCD значение A
  b = 0;
  lcd.setCursor(17, 0);               // курсор в верхнюю строку на 17 знак
  lcd.print (b);                      // вывести на LCD значение B
  lcd.setCursor(16, 0);               // курсор в верхнюю строку на 16 знак
  lcd.print(".");                     // вывести на LCD надпись в кавычках
  c = 0;
  lcd.setCursor(15, 0);               // курсор в верхнюю строку на 15 знак
  lcd.print (c);                      // вывести на LCD значение C
  d = 0;
  lcd.setCursor(14, 0);               // курсор в верхнюю строку на 14 знак
  lcd.print (d);                      // вывести на LCD значение D
  e = 0;
  lcd.setCursor(13, 0);               // курсор в верхнюю строку на 13 знак
  lcd.print (e);                      // вывести на LCD значение E
  f = f + 1;
  lcd.setCursor(12, 0);               // курсор в верхнюю строку на 12 знак
  lcd.print (f);                      // вывести на LCD значение F
}
if (f < 9.5)
{
  lcd.setCursor(12, 0);               // курсор в верхнюю строку на 19 знак
  lcd.print (f);                      // вывести на LCD значение I
}
if (f > 9.5)
{
  i = 0;
  lcd.setCursor(19, 0);               // курсор в верхнюю строку на 19 знак
  lcd.print (i);                      // вывести на LCD значение I
  a = 0;
  lcd.setCursor(18, 0);               // курсор в верхнюю строку на 18 знак
  lcd.print (a);                      // вывести на LCD значение A
  b = 0;
  lcd.setCursor(17, 0);               // курсор в верхнюю строку на 17 знак
  lcd.print (b);                      // вывести на LCD значение B
  lcd.setCursor(16, 0);               // курсор в верхнюю строку на 16 знак
  lcd.print(".");                     // вывести на LCD надпись в кавычках
  c = 0;
  lcd.setCursor(15, 0);               // курсор в верхнюю строку на 15 знак
  lcd.print (c);                      // вывести на LCD значение C
  d = 0;
  lcd.setCursor(14, 0);               // курсор в верхнюю строку на 14 знак
  lcd.print (d);                      // вывести на LCD значение D
  e = 0;
  lcd.setCursor(13, 0);               // курсор в верхнюю строку на 3 знак
  lcd.print (e);                      // вывести на LCD значение E
  f = 0;
  lcd.setCursor(12, 0);               // курсор в верхнюю строку на 12 знак
  lcd.print (f);                      // вывести на LCD значение F
  g = g + 1;
  lcd.setCursor(11, 0);               // курсор в верхнюю строку на 11 знак
  lcd.print (g);                      // вывести на LCD значение G
}
if (g < 9.5)
{
  lcd.setCursor(11, 0);               // курсор в верхнюю строку на 11 знак
  lcd.print (g);                      // вывести на LCD значение G
}
if (g > 9.5)
{
  i = 0;
  lcd.setCursor(19, 0);               // курсор в верхнюю строку на 19 знак
  lcd.print (i);                      // вывести на LCD значение I
  a = 0;
  lcd.setCursor(18, 0);               // курсор в верхнюю строку на 18 знак
  lcd.print (a);                      // вывести на LCD значение A
  b = 0;
  lcd.setCursor(17, 0);               // курсор в верхнюю строку на 17 знак
  lcd.print (b);                      // вывести на LCD значение B
  lcd.setCursor(16, 0);               // курсор в верхнюю строку на 16 знак
  lcd.print(".");                     // вывести на LCD надпись в кавычках
  c = 0;
  lcd.setCursor(15, 0);               // курсор в верхнюю строку на 15 знак
  lcd.print (c);                      // вывести на LCD значение C
  d = 0;
  lcd.setCursor(14, 0);               // курсор в верхнюю строку на 14 знак
  lcd.print (d);                      // вывести на LCD значение D
  e = 0;
  lcd.setCursor(13, 0);               // курсор в верхнюю строку на 13 знак
  lcd.print (e);                      // вывести на LCD значение E
  f = 0;
  lcd.setCursor(12, 0);               // курсор в верхнюю строку на 12 знак
  lcd.print (f);                      // вывести на LCD значение E
  g = 0;
  lcd.setCursor(11, 0);               // курсор в верхнюю строку на 11 знак
  lcd.print (g);                      // вывести на LCD значение G
  i = 0;
}
button_old  = digitalRead(button);
 
// открываем файл "log.txt" для чтения и записи, начиная с конца файла, и записываем в него строку
myFile = SD.open("log.txt", FILE_WRITE);// если файла с именем "log.txt" - нет, то он будет создан.
if (myFile)
{ // если файл доступен (открыт для записи), то ...
  Serial.println("file is opened");
  Serial.print("counter: ");
  Serial.print (g);
  Serial.print (f);
  Serial.print (e);
  Serial.print (d);
  Serial.print (c);
  Serial.print (".");
  Serial.print (b);
  Serial.print (a);
  Serial.print (i);
  Serial.println ();
  myFile.print (g);
  myFile.print (f);
  myFile.print (e);
  myFile.print (d);
  myFile.print (c);
  myFile.print (".");
  myFile.print (b);
  myFile.print (a);
  myFile.print (i);
  myFile.println();
  myFile.close  ();
  //myFile.print("The beginning of a line, "); // записываем первую часть строки в файл
  //myFile.println("The end of the line");     // записываем вторую часть строки в файл
  Serial.println("data written to the file");
  myFile.close();                             // закрываем файл
  Serial.println("file is closed");
  delay (500);
  * /
  //}
  //else {                                    // иначе ...
  //  Serial.println("file is not opened");
  //}
  // проверяем наличие файла "iarduino.txt" на SD-карте
  //if (SD.exists("log.txt")) {     // если файл с именем "iarduino.txt" существует, то ...
  /// Serial.println("the file exists");
  //} else {                           // иначе ...
  //Serial.println("file doesn't exist");
  //}
}
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Блин, человек "джва года" на форуме!

Читайте - ПЕСОЧНИЦА. ДЛЯ ВСЕХ НОВИЧКОВ.. Внимательно читайте. Потом перепишите свой пост заново (можно в этом топике - не обязательно создавать новый)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Чайник в ардуино пишет:

удалось записать на SD значения переменных   пример: А=1; B=2; С=3;  D=4;  E=5  в итоге на SD получился файл log.txt в котором получилось число 12345

ВОПРОС!  как считать с SD число разложив его опять на переменные А=1; B=2; С=3;  D=4;  E=5 ?

Ну, если заранее известно, что А=1; B=2; С=3;  D=4;  E=5, то именно так можно и написать в самом скетче.

А вообще, непонятен сам вопрос:

- если числа гарантированно одноразрядные, решение тривиально,

- если хотя бы одно число может содерджать в десятичной записи более одно разряда, задача неразрешима.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Чайник в ардуино пишет:
пример: А=1; B=2; С=3;  D=4;  E=5  в итоге на SD получился файл log.txt в котором получилось число 12345

ВОПРОС!  как считать с SD число разложив его опять на переменные А=1; B=2; С=3;  D=4;  E=5 ?

А не пробовали писать числа в файл "в столбик" через println() - каждое на свою строку файла?

Тогда может и читать станет проще: читаем строку (типа fgets() не знаю как оно там в вашей библиотеке) и потом преобразуем её в число через что-то типа atoi() или scanf() и присваиваем в нужную переменную согласно номеру строки или порядку чтения .. не пробовали?

Чайник в ардуино
Offline
Зарегистрирован: 10.06.2016

Arhat109-2]</p> <p>[quote=Чайник в ардуино пишет:
пример: А=1; B=2; С=3;  D=4;  E=5  в итоге на SD получился файл log.txt в котором получилось число 12345

ВОПРОС!  как считать с SD число разложив его опять на переменные А=1; B=2; С=3;  D=4;  E=5 ?

А не пробовали писать числа в файл "в столбик" через println() - каждое на свою строку файла?

Тогда может и читать станет проще: читаем строку (типа fgets() не знаю как оно там в вашей библиотеке) и потом преобразуем её в число через что-то типа atoi() или scanf() и присваиваем в нужную переменную согласно номеру строки или порядку чтения .. не пробовали?

подскажтте на примере, пожалуста...