Как сохранять промежуточные данные
Растолкуйте для совсем начинающих... ;)
Есть код:
Код:
int test;
int test2;
int prev2;
unsigned long time;
unsigned long ptime;
unsigned long taho; // количество импульсов
unsigned int freq; // частота импульсов
unsigned long stamp; // период измерения
void setup()
{
Serial.begin(115200); // настроить скорость com порта
pinMode(7, INPUT); // 7ой порт переключаем на ввод данных
ptime = millis(); // запустить таймер
test = 0;
test2 = 0;
prev2 = 0;
taho = 0;
freq = 0;
stamp = 0;
}
void loop()
{
test = analogRead(0); //прочитать с аналогового пина(0)
test2 = digitalRead(7); // читаем уровень цифрового порта(7)
if(test2 != prev2) {
prev2 = test2;
if(test2 = HIGH) {
freq++;
taho++;
}
}
stamp = millis(); // прочитать натиканое время таймера
if(stamp > ptime + 500 || stamp < ptime) {
ptime = stamp;
Serial.print("TimeStamp: ");
Serial.print(ptime, DEC); //отправить время в пути
Serial.print(", Gasoile: ");
Serial.print(test/4, DEC); // отправить колличество топлива
Serial.print(", Tahometer: ");
Serial.print(taho, DEC); // отправить значение тахометра
Serial.print(", Speed freq: ");
Serial.println(freq, DEC); // отправить значение спидометра
freq = 0;
}
}
Один раз грузим в carduino. Потом много раз подключаемся терминалом на COM9 (carduino у меня в системе на 9ом порту)...
И каждый раз получаем рестарт микропрограммы carduino - каждый раз millis() и taho начинают считаться с нуля. Т.е. carduino работает только когда есть связь с программой на ПК.
Как carduino заставить работать в автономе?
Re: Arduino учебный курс для начинающих
А что должен делать девайс без компа? На ЖКИ выводить или светодиодом мигать?
Он без проблем автономно работатет, распиши ТЗ
Re: Arduino учебный курс для начинающих
Да, работает. Только при подключении к ПК засыпает на полторы-две секунды, а потом рестартует микропрограмму (нашёл тут).
Как выход - либо шить девайс не через usb, а через доп.программатор (тогда бутлоадер не будет ждать 2 секунды после подключения компа), либо плюнуть на потерю данных в течение 2х секунд при подключении ПК, а все необходимые переменные постоянно сохранять в EEPROM.
Re: Arduino учебный курс для начинающих
Как пример решения через сохранение значения taho в EEPROM - при отключении и подключении ПК значение taho не обнуляется, а продолжает увеличиваться дальше.
Код:
#include <EEPROM.h>
int test;
int test2;
int prev2;
unsigned long time;
unsigned long ptime;
unsigned long taho; // количество импульсов
unsigned int freq; // частота импульсов
unsigned long stamp; // период измерения
unsigned long byte1;
byte byte2;
int onoff = 0;
void setup()
{
Serial.begin(115200); // настроить скорость com порта
pinMode(7, INPUT); // 7ой порт переключаем на ввод данных
ptime = millis();
test = 0;
test2 = 0;
prev2 = 0;
taho = 0;
freq = 0;
stamp = 0;
// читаем из EEPROM
byte2 = EEPROM.read(3);
byte1 = byte2;
byte1 = byte1 << 8;
byte2 = EEPROM.read(2);
byte1 = byte1 + byte2;
byte1 = byte1 << 8;
byte2 = EEPROM.read(1);
byte1 = byte1 + byte2;
byte1 = byte1 << 8;
byte2 = EEPROM.read(0);
taho = byte1 + byte2;
}
void loop()
{
test = analogRead(0); //прочитать с аналогового пина(0)
test2 = digitalRead(7); // читаем уровень цифрового порта(7)
if(test2 != prev2) {
prev2 = test2;
if(test2 = HIGH) {
freq++;
taho++;
// сразу записываем в EEPROM
byte1 = taho;
byte2 = lowByte(byte1);
EEPROM.write(0, byte2);
byte1 = byte1 >> 8;
byte2 = lowByte(byte1);
EEPROM.write(1, byte2);
byte1 = byte1 >> 8;
byte2 = lowByte(byte1);
EEPROM.write(2, byte2);
byte1 = byte1 >> 8;
byte2 = lowByte(byte1);
EEPROM.write(3, byte2);
}
}
stamp = millis();
if(stamp > ptime + 500 || stamp < ptime) {
ptime = stamp;
Serial.print("TimeStamp: ");
Serial.print(ptime, DEC);
Serial.print(", Gasoile: ");
Serial.print(test/4, DEC); // отправить значение компьютеру
Serial.print(", Tahometer: ");
Serial.print(taho, DEC);
Serial.print(", Speed freq: ");
Serial.println(freq, DEC);
freq = 0;
// Помигаем светодиодом в подтверждение работы микропрограммы
if(onoff != 1) {
digitalWrite(13, HIGH);
onoff = 1;
} else {
digitalWrite(13, LOW);
onoff = 0;
}
}
}
Re: Arduino учебный курс для начинающих
Цитата:
Сообщение от
ashu
Как пример решения через сохранение значения taho в EEPROM - при отключении и подключении ПК значение taho не обнуляется, а продолжает увеличиваться дальше.
Код:
#include <EEPROM.h>
int test;
int test2;
int prev2;
unsigned long time;
unsigned long ptime;
unsigned long taho; // количество импульсов
unsigned int freq; // частота импульсов
unsigned long stamp; // период измерения
unsigned long byte1;
byte byte2;
int onoff = 0;
void setup()
{
Serial.begin(115200); // настроить скорость com порта
pinMode(7, INPUT); // 7ой порт переключаем на ввод данных
ptime = millis();
test = 0;
test2 = 0;
prev2 = 0;
taho = 0;
freq = 0;
stamp = 0;
// читаем из EEPROM
byte2 = EEPROM.read(3);
byte1 = byte2;
byte1 = byte1 << 8;
byte2 = EEPROM.read(2);
byte1 = byte1 + byte2;
byte1 = byte1 << 8;
byte2 = EEPROM.read(1);
byte1 = byte1 + byte2;
byte1 = byte1 << 8;
byte2 = EEPROM.read(0);
taho = byte1 + byte2;
}
void loop()
{
test = analogRead(0); //прочитать с аналогового пина(0)
test2 = digitalRead(7); // читаем уровень цифрового порта(7)
if(test2 != prev2) {
prev2 = test2;
if(test2 = HIGH) {
freq++;
taho++;
// сразу записываем в EEPROM
byte1 = taho;
byte2 = lowByte(byte1);
EEPROM.write(0, byte2);
byte1 = byte1 >> 8;
byte2 = lowByte(byte1);
EEPROM.write(1, byte2);
byte1 = byte1 >> 8;
byte2 = lowByte(byte1);
EEPROM.write(2, byte2);
byte1 = byte1 >> 8;
byte2 = lowByte(byte1);
EEPROM.write(3, byte2);
}
}
stamp = millis();
if(stamp > ptime + 500 || stamp < ptime) {
ptime = stamp;
Serial.print("TimeStamp: ");
Serial.print(ptime, DEC);
Serial.print(", Gasoile: ");
Serial.print(test/4, DEC); // отправить значение компьютеру
Serial.print(", Tahometer: ");
Serial.print(taho, DEC);
Serial.print(", Speed freq: ");
Serial.println(freq, DEC);
freq = 0;
// Помигаем светодиодом в подтверждение работы микропрограммы
if(onoff != 1) {
digitalWrite(13, HIGH);
onoff = 1;
} else {
digitalWrite(13, LOW);
onoff = 0;
}
}
}
у EEPROM ограниченое число циклов записи, так что не забывай об этом , ты пишешь в него в цикле , он долго так не проживет. Может быть как нибудь с массивом попробовать а в EPROM писать 1 раз в минуту или после определеного расстояния.
Может отдельную тему создать по данному проекту ?
Думаю что многим пригодится.
Re: Arduino учебный курс для начинающих
Хмм... А где почитать про ограниченное количество циклов записи в EEPROM?
Да, наверное, можно отдельной темой :)
Re: Arduino учебный курс для начинающих
Производитель контроллеров даёт гарантию на 100 000 циклов стирание/запись.
Информацию ищи в даташите на контроллер Atmega168
В массиве сохраняй
Re: Arduino учебный курс для начинающих
А если запись производить по прерыванию, например по выключению зажигания или контролю наличия какого-нибудь сигнала?
Re: Arduino учебный курс для начинающих
+1
Например по пропаданию АСС записывать в EEPROM.
Прерывание для этого жалко использовать, можно и без него обойтись , программно проверять цифровой вход с подключенному к нему АСС
Re: Arduino учебный курс для начинающих
Цитата:
Сообщение от
ashu
Как выход - либо шить девайс не через usb, а через доп.программатор (тогда бутлоадер не будет ждать 2 секунды после подключения компа)
Этим способом можно только исключить 1.5..2 сек ожидания при открытии порта, но данные всё равно не сохранить, поскольку такова аппаратная реализация - при открытии порта сигнал управления потоком DTR посылает reset на чип:
Цитата:
Rather then requiring a physical press of the reset button before an upload, the Arduino Nano is designed in a way that allows it to be reset by software running on a connected computer. One of the hardware flow control lines (DTR) of the FT232RL is connected to the reset line of the ATmega168 or ATmega328 via a 100 nanofarad capacitor. When this line is asserted (taken low), the reset line drops long enough to reset the chip. The Arduino software uses this capability to allow you to upload code by simply pressing the upload button in the Arduino environment. This means that the bootloader can have a shorter timeout, as the lowering of DTR can be well-coordinated with the start of the upload.
Re: Arduino учебный курс для начинающих
Цитата:
Сообщение от
Chip
+1
Например по пропаданию АСС записывать в EEPROM.
Прерывание для этого жалко использовать, можно и без него обойтись , программно проверять цифровой вход с подключенному к нему АСС
Не годится.
Задача-то какая? Записывать количество и частоту импульсов из автомобиля в то время, когда комп еще не загружен (но АСС, конечно, уже есть).
Сейчас (без использования постоянной записи в EEPROM) получается как - carduino считает импульсы, потом загружается комп, запускается прога, открывающая порт carduino и усё - все накопленные до этого момента данные безвозвратно теряются.
Re: Arduino учебный курс для начинающих
Цитата:
Сообщение от
Chip
В массиве сохраняй
Это как?
Re: Как сохранять промежуточные данные
PHP код:
... программный сброс, выполняемый по команде от компьютера.
Для этого, один из сигналов (DTR) подключен к входу сброса
микроконтроллера через конденсатор 0,1 мкф. В тот момент, когда
уровень сигнал на этой линии меняется с высокого на низкий, на входе
сброса микроконтроллера появляется короткий отрицательный импульс,
длительности которого достаточно для его сброса.
А если этот конденсатор убрать, тогда при подключении сброс будет происходить?
Re: Как сохранять промежуточные данные
Цитата:
Сообщение от
murano
А если этот конденсатор убрать, тогда при подключении сброс будет происходить?
Вот как раз об этом и думаю... Но тогда отключится возможность менять микропрограмму через usb...
Re: Как сохранять промежуточные данные
Попробовал. Помогло - программа при открытии порта не рестартуется, 2 секунды слипа нет, данные не сбрасываются :)
Правда, процедура программирования через usb слегка изменилась - в Arduino0017 нажимаем Upload. Как только появилась строка Binary sketch size.... сразу жамкаем reset на carduino - великолепно шьётся. :)
Чтобы убрать это шаманство думаю поставить переключатель.
В принципе, могу рекомендовать это решение как проверенное ;)
Re: Как сохранять промежуточные данные
Выключатель придется ставить
Re: Как сохранять промежуточные данные
На freeduino 2009 для этих целей уже джампер запаян. Достаточно его убрать и не будет автоматической перезагрузки при подключении ПК.
Вложений: 1
Re: Как сохранять промежуточные данные
Можно все гораздо проще решить .
Вешаем резистор 100 ом с +5в на Reset и никаких выпаиваний делать не нужно .
Вложение 5699
Еще один метод