Вывод в файл

Тема в разделе "Arduino & Shields", создана пользователем Druids91, 21 окт 2014.

  1. Druids91

    Druids91 Нерд

    Добрый день тов-щи. С ардуино работаю всего неделю, да и вообще в принципе в подобной сфере не так давно.
    В конспекте хаккера, есть пример - метеостанции. Информация о температуре выводится в терминал. Как реализовать вывод в файл? и как сделать чтобы выводилось время замера температуры?
    Я реализовал вывод в файл, только через Terminal 1.9b (автологирование)

    http://wiki.amperka.ru/конспект-arduino:метеостанция
     
  2. Unixon

    Unixon Оракул Модератор

    Вывод в файл, находящийся где? На компьютере или на отдельной флэшке (SD, USB) ?
    Время нужно относительно начала измерегния или с постоянной привязкой календарю ?
     
  3. Druids91

    Druids91 Нерд

    Извиняюсь не уточнил. Вывод в файл находящийся на компьютере. Ну и время привязанное к календарю. Относительно начальной точки - рассказано как делается в примере.
     
  4. geher

    geher Гуру

    Чтобы писать в файл непосредственно на компьютере, необходимо для этого самого компьютера написать программу, которая по факту заменит терминал, но будет выполнять не отображение необработанных принятых данных в текстовом окошке, а какие-то другие действия: отображение в красивом окошке, запись в файл, другие действия, которые придут в голову. Время при этом можно фиксировать по часам на самом компьютере.
     
  5. Druids91

    Druids91 Нерд

    Задам здесь свои глупые вопросы.

    И можно-ли подключить библиотеки iostream.h и организовать ввод данных с клавиатуры через терминал? Точнее если я задам программе условие.
    1. Если я ввел 1, то должен загореться светодиод зеленый.
    2. Если я ввел 1, то должен загореться светодиод красный
     
    Последнее редактирование: 22 окт 2014
  6. Ars

    Ars Нуб

    http://arduino.cc/en/Serial/Read
     
  7. Druids91

    Druids91 Нерд

    Я так понимаю ардуино будет воспринимать значение исключительно в байтах? И чтобы преобразовать байты в слово, мне придется допиливать кодом всё?
     
  8. Unixon

    Unixon Оракул Модератор

    Да, в битах и байтах. Используйте Serial.readBytes() или Serial.readBytesUntil().
     
  9. Druids91

    Druids91 Нерд

    Код (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

    }
    Интересует как подправить код, чтобы у меня светодиод мигал, не в тот момент, когда показывается температура. а постоянно?
     
  10. geher

    geher Гуру

    Код (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); // засыпаем на час

    }
     
    Последнее редактирование: 28 окт 2014
    Druids91 нравится это.
  11. Druids91

    Druids91 Нерд

    Некоторые моменты из кода не могу понять.
    if (millis()-time>3600000) - что это значит?

    В самом конце кода: //delay(3600000); - почему delay как комментарий?

    Саму суть оператора millis() -не могу понять =(
     
  12. Salk

    Salk Гик

    Тут довольно просто, тут небольшое описание:
    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 только в виде условия. :)
     
    Последнее редактирование: 29 окт 2014
  13. Unixon

    Unixon Оракул Модератор

    Использование условия на таймер имеет смысл, если программа выполняет несколько задач и они пересекаются во времени. Если задача всего одна - можно спокойно пользоваться 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;
                    }
            }
    }
     
  14. Robocafe

    Robocafe Нуб

    Коллеги!

    Сам постоянно использую для этого утилиту Gobetwino. Записывает в файл txt, можно с ";", а далее легко импортирую в Эксель
     
  15. Druids91

    Druids91 Нерд

    Может быть я ошибаюсь, но задач 2:
    1. Чтобы диод моргал постоянно
    2. Чтобы считывание происходило раз в час.

    Огромное спасибо за объяснение. Отлично вас понял.
     
  16. Unixon

    Unixon Оракул Модератор

    В принципе, да, две задачи. Но у вас период моргания светодиода целиком укладывается в большой интервал ожидания и в этом случае, если пренебречь субсекундной точностью, можно использовать комбинированное решение, как у вас и записано.
     
    Druids91 нравится это.
  17. sd55

    sd55 Нерд

    И мне бы очень хотелось ей воспользоваться. Но толи ссылка битая, толи сайт умер.
    В любом случае скачать не удается. Браузеры отвечают что не могут получить DNS ответ сайта.
    Не поделитесь програмулькой.
     
  18. parovoZZ

    parovoZZ Гуру

    Кому пишешь?
     
  19. b707

    b707 Гуру

    нафига вам именно эта? Других мало? В конце концов, даже любой терминал с автологгированием, типа того, чьто выше в теме - это практически то же самое.
     
  20. sd55

    sd55 Нерд

    Может плохо искал такие терминалы :( Но автологирования в тех что пробовал не обнаружил. Получилось только под Линукс
    Вы бы подсказали куда копать.


    Ну а прогу все таки нашел тут:
    https://github.com/pikle6/Arduino/tree/master/Support/Software/gobetwino

    ПС. Красиво все ж про нее написано. Может запускать скрипты под Windows, например.