Не поленился найти видео это, что б сказать !!!СПАСИБО!!! за подсказку с объявлением строк внутри функций. 90% глобально объявленных переменных переделал в локальные. пропали глюки) а ведь видео начал смотреть исключительно изза работы в SD картой...)
Автору огромное спасибо за проделанную работу, но есть маааленькое замечание - как по мне лучше музыку сделать несколько тише, чтобы она не отвлекала от голоса автора, а так все замечательно - правильный формат и подача материала!
Огромная благодарность автору за такие полезные и содержательные видеоуроки! Всё очень чётко и доступно, ничего лишнего. Собираюсь заказать на Экспрессе Ардуинку и приблуды к ней, тогда буду реализовывать описанные здесь и в других видео схемы и с благодарностью вспоминать автора. Желаю и дальше снимать ещё больше познавательного материала!
Не думаю, что открою Америку, но поделюсь "лайфхаком" :) Здорово экономить динамическую память(правда за счет памяти устройства) помогает следующая конструкция: Serial.print(F("Can't open file")); Этот прием не везде можно использовать, но все-равно заметно облегчает жизнь А вообще спасибо, почерпнул новое)
Сори за РИП-пост, но меня эта фишка сильно выручила в своё время. Вот вам ещё один из способ освободить динамическую память за счёт флеш-памяти! Всякие предупреждения нужно просто писать вот так: Serial.print(F("Текст ошибки")); В таком случае, текст сообщения не висит в памяти, а хранится на флеше. Это немного замедляет скетч, но очень незначительно. Если же скорость крайне важна, а памяти уже катастрофически не хватает, то все сообщения нужно загнать в один массив типа char errors[] = {“error1”, “error2”, “error3”}; и в Serial.print уже скармливать нужное значение из массива, например Serial.print(errors[2]); Более быстрый вариант менее удобен, освобождает меньше памяти, но немного быстрее.
спасибо, подскажите пожалуйста что можно сделать если данные поступают каждые 20мс и нужно их сразу же записывать в файл? как записывать их не блокируя процесс?
И ещё момент, что бы график был более красивый, значение температуры нужно оставить во float, а не раундить его в int тогда будут десятые и сотые доли градуса, и график будет без "полочек". Но будет немного "дёрганым" за счёт погрешности датчика на десятых и сотых.
Если названию файла указать расширение "*.csv" (тут следует отметить что выводимый формат, разделители точка с запятой, соответствует формату CSV) по умолчанию excel подхватит его без заморочек.
А почему, используя в схеме RTC, минуту отсчитывать задержкой, а не считывать текущее время и каждую минуту неспеша считывать температуру и записывать ее на SD карту
Доброго времени суток, Александр. А можете «ковырнуть» библиотеку iarduino_RTC.h для часов DS1302, DS1307, DS3231 ? Мне кажется что она более удобна, правда в ней нет функции получения температуры, ибо датчик находится на кристалле и отображает не температуру окружающей среды, а температуру кристалла находящегося в корпусе микросхемы DS3231.
А если я напишу в Воид Луп не FILE_WRITEN ,а захочу что-бы он мне ГОВОРИЛ прослушанную информацию? Мне нужно будет записать FILE_TELL или что-то другое?
Здравствуйте , а подскажите пожалуйста. При попытке загрузить Ваш скетч, выдает ошибку: C:\Documents and Settings\Admin\РњРѕРё документы\Arduino\logirovanie_dannih\logirovanie_dannih.ino:5:230: fatal error: OneWire.h: No such file or directory compilation terminated. exit status 1 Ошибка компиляции для платы Arduino/Genuino Uno. С чем это связано? Зарание спасибо!!!!
Здравствуйте. Я использую для добавления 0 "sprintf (string, "%02i day %02i:%02i:%02i ", d, h, m, s );" string объявлен так "char string[16]; ". К примеру "%02i" можно прочитать так. %- указываем что будет 0-начинающееся с 0 2-двухзначное число I-имеющее тип int. (просто число, можно и byte использовать и т.п.) Если мой метод плох, подскажите чем. Я новичок просто, пользуюсь тем что нашел в сети.
sprintf достаточно прожорливая функция в плане потребления ресурсов микроконтроллера (объем памяти, время обработки). Но если у Вас все работает и проблем с ресурсами не возникает, то использование данной функции ничем не плохо. =)
Не могли бы помочь оптимизировать скетч? если возможно... За основу брал ваш скетч. хочу сделать универсальный логер на pro mini, что бы можно было подключить его к разрабатываемому устройству (не удобно держать устройство всегда подключенное к компу). Сейчас кончились про мини 328, остались только про мини 168. а на даже не инициализируется карта( #include #include File myFile; String val =""; void setup() { Serial.begin(9600); SD.begin(10); } void loop() { if (Serial.available()) { //обработка Serial данных while (Serial.available()) { //сохраняем строку в переменную val char ch = Serial.read(); val += char(ch); delay(10); } File dataFile = SD.open("log.txt", FILE_WRITE); // Открываем файл для записи логов if (dataFile) { // Если удалось открыть файл dataFile.println(logString()); // Записываем строку логов в файл dataFile.close(); // Закрываем файл } } } String logString() { // Функция для генерации логов DS3231 rtc(A0, A1); rtc.begin(); String dataString = String(rtc.getDateStr()) + F(" ") + String(rtc.getTimeStr()) + F("|") + F("|") + val; val=""; return(dataString); }
Здравствуйте! Скажите, пожалуйста, как называется переходник от внешней батареи (маркировка или серийный номер, по которому можно найти в интернете для заказа) для подключения ее в качестве источника питания для Arduino?
Если на aliexpress, то по ссылке goo.gl/QZnSj9 - штучно и goo.gl/kl6khT - кучей. Если по русски, то переходник Крона (6F22) на Power jack 5,5/2,1мм (внешний контакт - минус, внутренний - плюс)
переменная String dataString - локальная для функции logString, её нельзя возвращать по return. то, что она чудом работает - это значит, что по чистой случайности её никто не затёр, так как она лежит в стеке, доступном для использования другими функциями после возврата из logString. не надо так.
Если честно я не понял о чем Вы... Да, переменная dataString локальная. Функция возвращает не переменную, а ее значение. Вне функции переменная dataString нигде не используется.
Да, видимо это я перепутал с массивом символов. Тут действительно возвращается из функции копия объекта dataString (он где-то на 10 байт длиннее строки символов, которую содержит), которая потом снова копируется при передаче в dataFile.println(). Это для меня пока что дико, я с Arduino работаю недавно. В обычной жизни никто объекты по значению в функции не передаёт и обратно не возвращает, тем более в микроконтроллерах. Но в Arduino всякое бывает... Возможно, компилятор это всё оптимизирует, и особой беды не будет. Но учитывая, что функция предназначена для вызова не один раз, а часто, я бы так не стал делать.
А разве хорошо кажый раз открывать и закрывать файл, от этого больше шансов файл запороть. Не правильнее будет в setup() открыть файл, цикл пустить чтоб отработал нужное число раз и закрыть. И delay() как то не красиво
Не поленился найти видео это, что б сказать !!!СПАСИБО!!! за подсказку с объявлением строк внутри функций. 90% глобально объявленных переменных переделал в локальные. пропали глюки) а ведь видео начал смотреть исключительно изза работы в SD картой...)
Автору огромное спасибо за проделанную работу, но есть маааленькое замечание - как по мне лучше музыку сделать несколько тише, чтобы она не отвлекала от голоса автора, а так все замечательно - правильный формат и подача материала!
Спасибо. Ok!
музончик реально отвлекает.. лучше вообще без музыки..
Вы в курсе, что ваше видео помогает мне делать диплом?)🔥🌟
Ура!!! Человеческое описание скетча! Спасибо Вам за ваш труд!
Лучше Ваших уроков просто не существует! Спасибо Вам огромное! С нетерпением жду новых видео) Единственная просьба - это делать музыку тише)
Огромная благодарность автору за такие полезные и содержательные видеоуроки! Всё очень чётко и доступно, ничего лишнего. Собираюсь заказать на Экспрессе Ардуинку и приблуды к ней, тогда буду реализовывать описанные здесь и в других видео схемы и с благодарностью вспоминать автора. Желаю и дальше снимать ещё больше познавательного материала!
Спасибо.
автор красавчик смотрю все видео без перемотки, жду не дождусь когда будет подробный обзор по esp8266 и wifi-iot
В ближайших выпусках размеренно приступим к этой теме. ;)
Не думаю, что открою Америку, но поделюсь "лайфхаком" :)
Здорово экономить динамическую память(правда за счет памяти устройства) помогает следующая конструкция:
Serial.print(F("Can't open file"));
Этот прием не везде можно использовать, но все-равно заметно облегчает жизнь
А вообще спасибо, почерпнул новое)
Супер. Спасибо, Александр. Все по существу и подробно. Успехов Вам!
Сори за РИП-пост, но меня эта фишка сильно выручила в своё время. Вот вам ещё один из способ освободить динамическую память за счёт флеш-памяти! Всякие предупреждения нужно просто писать вот так: Serial.print(F("Текст ошибки")); В таком случае, текст сообщения не висит в памяти, а хранится на флеше. Это немного замедляет скетч, но очень незначительно. Если же скорость крайне важна, а памяти уже катастрофически не хватает, то все сообщения нужно загнать в один массив типа char errors[] = {“error1”, “error2”, “error3”}; и в Serial.print уже скармливать нужное значение из массива, например Serial.print(errors[2]); Более быстрый вариант менее удобен, освобождает меньше памяти, но немного быстрее.
Добрый день. Очень полезный урок. Возник вопрос. Нужно снимать информацию с нескольких датчиков. Какие изменения надо сделать в скетче?
Привет! А можно ли как-то считывать этот лог дистанционно? С андроид-телефона, например?
...ну или по проводам, не вынимая SD-карту?
спасибо, подскажите пожалуйста что можно сделать если данные поступают каждые 20мс и нужно их сразу же записывать в файл? как записывать их не блокируя процесс?
И ещё момент, что бы график был более красивый, значение температуры нужно оставить во float, а не раундить его в int тогда будут десятые и сотые доли градуса, и график будет без "полочек". Но будет немного "дёрганым" за счёт погрешности датчика на десятых и сотых.
Если названию файла указать расширение "*.csv" (тут следует отметить что выводимый формат, разделители точка с запятой, соответствует формату CSV) по умолчанию excel подхватит его без заморочек.
У меня не получилось так. Но спасибо!
А почему, используя в схеме RTC, минуту отсчитывать задержкой, а не считывать текущее время и каждую минуту неспеша считывать температуру и записывать ее на SD карту
молодец, спасибо за подробный разбор строчек программы
Доброго времени суток, Александр.
А можете «ковырнуть» библиотеку iarduino_RTC.h для часов DS1302, DS1307, DS3231 ?
Мне кажется что она более удобна, правда в ней нет функции получения температуры, ибо датчик находится на кристалле и отображает не температуру окружающей среды, а температуру кристалла находящегося в корпусе микросхемы DS3231.
Сейчас пока в ящике все незадействованные RTC-модули валяются. Если какой-то проект будет с ними, то посмотрю эту библиотеку. Спасибо за наводку!
у вас delay(59500) О какой оптимизации может идти речь?
А если я напишу в Воид Луп не FILE_WRITEN ,а захочу что-бы он мне ГОВОРИЛ прослушанную информацию?
Мне нужно будет записать FILE_TELL или что-то другое?
Здравствуйте , а подскажите пожалуйста. При попытке загрузить Ваш скетч, выдает ошибку:
C:\Documents and Settings\Admin\Мои документы\Arduino\logirovanie_dannih\logirovanie_dannih.ino:5:230: fatal error: OneWire.h: No such file or directory
compilation terminated.
exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.
С чем это связано? Зарание спасибо!!!!
автор красавчик все видио понятные и доступные Вопрос а возможно както добавить память самому ардуину
только заменить чип на плате на другой..с большим объемом оперативки..
Здравствуйте. Я использую для добавления 0 "sprintf (string, "%02i day %02i:%02i:%02i ", d, h, m, s );" string объявлен так "char string[16]; ". К примеру "%02i" можно прочитать так.
%- указываем что будет
0-начинающееся с 0
2-двухзначное число
I-имеющее тип int. (просто число, можно и byte использовать и т.п.)
Если мой метод плох, подскажите чем. Я новичок просто, пользуюсь тем что нашел в сети.
sprintf достаточно прожорливая функция в плане потребления ресурсов микроконтроллера (объем памяти, время обработки). Но если у Вас все работает и проблем с ресурсами не возникает, то использование данной функции ничем не плохо. =)
Не могли бы помочь оптимизировать скетч? если возможно... За основу брал ваш скетч.
хочу сделать универсальный логер на pro mini, что бы можно было подключить его к разрабатываемому устройству (не удобно держать устройство всегда подключенное к компу).
Сейчас кончились про мини 328, остались только про мини 168. а на даже не инициализируется карта(
#include
#include
File myFile;
String val ="";
void setup() {
Serial.begin(9600);
SD.begin(10);
}
void loop() {
if (Serial.available()) { //обработка Serial данных
while (Serial.available())
{ //сохраняем строку в переменную val
char ch = Serial.read();
val += char(ch);
delay(10);
}
File dataFile = SD.open("log.txt", FILE_WRITE); // Открываем файл для записи логов
if (dataFile) { // Если удалось открыть файл
dataFile.println(logString()); // Записываем строку логов в файл
dataFile.close(); // Закрываем файл
}
}
}
String logString() { // Функция для генерации логов
DS3231 rtc(A0, A1);
rtc.begin();
String dataString = String(rtc.getDateStr()) + F(" ") + String(rtc.getTimeStr()) + F("|") + F("|") + val;
val="";
return(dataString);
}
1Kb ОЗУ на ATmega168 слишком мало. Думаю, что вариант - поискать другую библиотеку для часов. Эта очень прожорливая.
Здравствуйте! Скажите, пожалуйста, как называется переходник от внешней батареи (маркировка или серийный номер, по которому можно найти в интернете для заказа) для подключения ее в качестве источника питания для Arduino?
Если на aliexpress, то по ссылке goo.gl/QZnSj9 - штучно и goo.gl/kl6khT - кучей.
Если по русски, то переходник Крона (6F22) на Power jack 5,5/2,1мм (внешний контакт - минус, внутренний - плюс)
Работа шикарная.. Но музон мешает..
Спасибо! Учту в будущих обзорах.
переменная String dataString - локальная для функции logString, её нельзя возвращать по return. то, что она чудом работает - это значит, что по чистой случайности её никто не затёр, так как она лежит в стеке, доступном для использования другими функциями после возврата из logString. не надо так.
Если честно я не понял о чем Вы... Да, переменная dataString локальная. Функция возвращает не переменную, а ее значение. Вне функции переменная dataString нигде не используется.
Да, видимо это я перепутал с массивом символов. Тут действительно возвращается из функции копия объекта dataString (он где-то на 10 байт длиннее строки символов, которую содержит), которая потом снова копируется при передаче в dataFile.println(). Это для меня пока что дико, я с Arduino работаю недавно. В обычной жизни никто объекты по значению в функции не передаёт и обратно не возвращает, тем более в микроконтроллерах. Но в Arduino всякое бывает... Возможно, компилятор это всё оптимизирует, и особой беды не будет. Но учитывая, что функция предназначена для вызова не один раз, а часто, я бы так не стал делать.
сенсей... так где храняться объекты. это не виндус.
А разве хорошо кажый раз открывать и закрывать файл, от этого больше шансов файл запороть. Не правильнее будет в setup() открыть файл, цикл пустить чтоб отработал нужное число раз и закрыть. И delay() как то не красиво
Я бы дослушал до конца, но музон совсем забил речь лектора! Жаль!
Отлично! Музыку убери!