Официальный сайт компании Arduino по адресу arduino.cc
Счетчик для водомеров
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Чт, 07/03/2019 - 17:13
Добрый день!
Решил написать программу считывания показаний с водомеров, пробовал оператор 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");
//}
}
Блин, человек "джва года" на форуме!
Читайте - ПЕСОЧНИЦА. ДЛЯ ВСЕХ НОВИЧКОВ.. Внимательно читайте. Потом перепишите свой пост заново (можно в этом топике - не обязательно создавать новый)
удалось записать на SD значения переменных пример: А=1; B=2; С=3; D=4; E=5 в итоге на SD получился файл log.txt в котором получилось число 12345
ВОПРОС! как считать с SD число разложив его опять на переменные А=1; B=2; С=3; D=4; E=5 ?
А вообще, непонятен сам вопрос:
- если числа гарантированно одноразрядные, решение тривиально,
- если хотя бы одно число может содерджать в десятичной записи более одно разряда, задача неразрешима.
ВОПРОС! как считать с SD число разложив его опять на переменные А=1; B=2; С=3; D=4; E=5 ?
А не пробовали писать числа в файл "в столбик" через println() - каждое на свою строку файла?
Тогда может и читать станет проще: читаем строку (типа fgets() не знаю как оно там в вашей библиотеке) и потом преобразуем её в число через что-то типа atoi() или scanf() и присваиваем в нужную переменную согласно номеру строки или порядку чтения .. не пробовали?
ВОПРОС! как считать с SD число разложив его опять на переменные А=1; B=2; С=3; D=4; E=5 ?
А не пробовали писать числа в файл "в столбик" через println() - каждое на свою строку файла?
Тогда может и читать станет проще: читаем строку (типа fgets() не знаю как оно там в вашей библиотеке) и потом преобразуем её в число через что-то типа atoi() или scanf() и присваиваем в нужную переменную согласно номеру строки или порядку чтения .. не пробовали?
подскажтте на примере, пожалуста...