Добрый день тов-щи. С ардуино работаю всего неделю, да и вообще в принципе в подобной сфере не так давно. В конспекте хаккера, есть пример - метеостанции. Информация о температуре выводится в терминал. Как реализовать вывод в файл? и как сделать чтобы выводилось время замера температуры? Я реализовал вывод в файл, только через Terminal 1.9b (автологирование) http://wiki.amperka.ru/конспект-arduino:метеостанция
Вывод в файл, находящийся где? На компьютере или на отдельной флэшке (SD, USB) ? Время нужно относительно начала измерегния или с постоянной привязкой календарю ?
Извиняюсь не уточнил. Вывод в файл находящийся на компьютере. Ну и время привязанное к календарю. Относительно начальной точки - рассказано как делается в примере.
Чтобы писать в файл непосредственно на компьютере, необходимо для этого самого компьютера написать программу, которая по факту заменит терминал, но будет выполнять не отображение необработанных принятых данных в текстовом окошке, а какие-то другие действия: отображение в красивом окошке, запись в файл, другие действия, которые придут в голову. Время при этом можно фиксировать по часам на самом компьютере.
Задам здесь свои глупые вопросы. И можно-ли подключить библиотеки iostream.h и организовать ввод данных с клавиатуры через терминал? Точнее если я задам программе условие. 1. Если я ввел 1, то должен загореться светодиод зеленый. 2. Если я ввел 1, то должен загореться светодиод красный
Я так понимаю ардуино будет воспринимать значение исключительно в байтах? И чтобы преобразовать байты в слово, мне придется допиливать кодом всё?
Код (Text): #include <math.h> int minute = 1; // Параметр конкретного типа термистора (из datasheet): #define TERMIST_B 4300 #define VIN 5.0 void setup() { Serial.begin(9600); Serial.println("Hour\t Temperature"); pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); delay(100); digitalWrite(13, LOW); delay(900); float voltage = analogRead(A0) * VIN / 1024.0; float r1 = voltage / (VIN - voltage); float temperature = 1. / ( 1. / (TERMIST_B) * log(r1) + 1. / (25. + 273.) ) - 273; Serial.print(hour); Serial.print("\t"); Serial.print(temperature); Serial.println("\t"); delay(3600000); // засыпаем на час ++minute; // увеличиваем значение час на 1 } Интересует как подправить код, чтобы у меня светодиод мигал, не в тот момент, когда показывается температура. а постоянно?
Код (Text): #include <math.h> int minute = 1; // Параметр конкретного типа термистора (из datasheet): #define TERMIST_B 4300 #define VIN 5.0 unsigned long int time; void setup() { Serial.begin(9600); Serial.println("Hour\t Temperature"); pinMode(13, OUTPUT); time=millis(); } void loop() { digitalWrite(13, HIGH); delay(100); digitalWrite(13, LOW); delay(900); if (millis()-time>3600000) { float voltage = analogRead(A0) * VIN / 1024.0; float r1 = voltage / (VIN - voltage); float temperature = 1. / ( 1. / (TERMIST_B) * log(r1) + 1. / (25. + 273.) ) - 273; Serial.print(hour); Serial.print("\t"); Serial.print(temperature); Serial.println("\t"); ++minute; // увеличиваем значение час на 1 time=millis(); } //delay(3600000); // засыпаем на час }
Некоторые моменты из кода не могу понять. if (millis()-time>3600000) - что это значит? В самом конце кода: //delay(3600000); - почему delay как комментарий? Саму суть оператора millis() -не могу понять =(
Тут довольно просто, тут небольшое описание: http://arduino.ua/ru/prog/Millis Суть, что millis подсчитывает кол-во времени (в мс) с начала старта Arduino (или скетча), с помощью unsigned long мы можем оперировать этими значениями, в данном случае мы можем задать условие Код (Text): if (millis()-time>3600000) которое говорит нам: если время после старта arduino будет больше "3600000" (один час), то выполнится все то, что в {} , другими словами, пока не пройдет час, никаких действий выполнятся не будет Код (Text): float voltage = analogRead(A0) * VIN / 1024.0; float r1 = voltage / (VIN - voltage); float temperature = 1. / ( 1. / (TERMIST_B) * log(r1) + 1. / (25. + 273.) ) - 273; Serial.print(hour); Serial.print("\t"); Serial.print(temperature); Serial.println("\t"); ++minute; // увеличиваем значение час на 1 time=millis(); Для того, чтобы цикл повторялся каждый час, нам счетчик нужно обновить: Тут delay нам больше не нужен, т.к. практически мы его заменили оператором millis. Час прошел - выполнилось действие; возвращаемся к началу цикла, "счетчик" сбросился, снова пошло отсчитывание часа, он прошел, выполняем действие и так по кругу. Ну я так понял механизм работы, профи могут меня исправить/дополнить. Вещь классная, сам с ней познакомился не давно. Мы как бы делаем ту же задержку, что и delay только в виде условия.
Использование условия на таймер имеет смысл, если программа выполняет несколько задач и они пересекаются во времени. Если задача всего одна - можно спокойно пользоваться delay(). В коде Druids91 задача всего одна и разницы в способе ожидания нет. Суть функций millis() и delay() крайне проста: одна просто возвращает текущее значение счетчика времени Код (Text): unsigned long millis() { unsigned long m; uint8_t oldSREG = SREG; // disable interrupts while we read timer0_millis or we might get an // inconsistent value (e.g. in the middle of a write to timer0_millis) cli(); m = timer0_millis; SREG = oldSREG; return m; } а другая гоняет его в цикле Код (Text): void delay(unsigned long ms) { uint16_t start = (uint16_t)micros(); while (ms > 0) { if (((uint16_t)micros() - start) >= 1000) { ms--; start += 1000; } } }
Коллеги! Сам постоянно использую для этого утилиту Gobetwino. Записывает в файл txt, можно с ";", а далее легко импортирую в Эксель
Может быть я ошибаюсь, но задач 2: 1. Чтобы диод моргал постоянно 2. Чтобы считывание происходило раз в час. Огромное спасибо за объяснение. Отлично вас понял.
В принципе, да, две задачи. Но у вас период моргания светодиода целиком укладывается в большой интервал ожидания и в этом случае, если пренебречь субсекундной точностью, можно использовать комбинированное решение, как у вас и записано.
И мне бы очень хотелось ей воспользоваться. Но толи ссылка битая, толи сайт умер. В любом случае скачать не удается. Браузеры отвечают что не могут получить DNS ответ сайта. Не поделитесь програмулькой.
нафига вам именно эта? Других мало? В конце концов, даже любой терминал с автологгированием, типа того, чьто выше в теме - это практически то же самое.
Может плохо искал такие терминалы Но автологирования в тех что пробовал не обнаружил. Получилось только под Линукс Вы бы подсказали куда копать. Ну а прогу все таки нашел тут: https://github.com/pikle6/Arduino/tree/master/Support/Software/gobetwino ПС. Красиво все ж про нее написано. Может запускать скрипты под Windows, например.