Нужен регистратор потока данных от Ардуино к компьютеру через USB

Скопинцев
Offline
Зарегистрирован: 22.04.2015

Я – начинающий.

Моя проблема.
Сделал на ардуино электронный термометр с регистрацией по USB на Terminal19b. Запрограммировал циклический опрос с интервалом полсекунды. В среде ардуино отладил, загрузил – поток от термометра идет нормально. И на монитор Ардуино, и на Terminal.

Вышел из ардуино, переткнул термометр, подсоединил Terminal… Скорость термометра уменьшилась на порядок.

Что я не знаю?

Заранее спасибо

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

То есть у вас время исполнения скетча замедлилось?

Медленно приходят данные по серийному порту, я так понял?

А куда переткнули?

Какая разница во времени

Araris
Offline
Зарегистрирован: 09.11.2012

Скопинцев, Вам в предыдущей теме уже намекнули, что без описания конструкции и без выкладки скетча (http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii) что-либо советовать затруднительно.

Скопинцев
Offline
Зарегистрирован: 22.04.2015
 
//intoutPin = 8;

#define  INTERVAL  500UL           // интервал между измерениями (миллисекунды)
int pin = 9;               // вход АЦП    
int inin;                  // температура
int persta = 0;           //контроль времени переключения нагрева (количества измерений)
int insta = 0;            // инф о состоянии нагрева   

void setup() {
 pinMode(8, OUTPUT);      // установка порта на выход переключения нагрева
 pinMode(10, OUTPUT);      // установка порта на ШИМ-выход 
 
 Serial.begin(9600); 
}
 
void loop()
  {
   //   Serial.println(persta);  
      analogWrite(10, 125);
     inin =  analogRead(pin);
    // Serial.println(inin, DEC);
        static unsigned long previousMillis = 0;        // храним время последнего переключения светодиода
      //проверяем не прошел ли нужный интервал, если прошел то
     //  Serial.println(persta);
    //  Serial.println(millis());
    //  Serial.println(previousMillis);
      
  if(millis() - previousMillis > INTERVAL) // сохраняем время последнего переключения
  {    
     persta = persta + 1; 
 //  Serial.println(persta);
    previousMillis = millis(); 
     Serial.println(inin, DEC);
   //   Serial.println(insta);
    
  }
    
        while (persta>100)
        {
               digitalWrite(8, !digitalRead(8));//меняем значение порта на противоположное
               insta = digitalRead(8);
            
               Serial.println(insta);
            persta = 0;
      //    Serial.println(88888);
          }
        
}    

 

Скетч работает так: измеряет по циклу температуру, потом через интервал persta переключает режим нагрева. И далее по циклу. 

1. Время исполнения скетча замедлилось
2. Очень вероятно, что медленно приходят данные по серийному порту...
3. Переткнул: вынул из USB и снова воткнул.
4. Точно не измерял. Где-то в 6-10 раз...  

 

Скопинцев
Offline
Зарегистрирован: 22.04.2015

Я понимаю, что такими вопросами мало кто задается. И вряд ли могут объяснить. 
Может быть посоветуете, какой-то другой регистратор такого простого циклического потока? 

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

А может быть проблема в while? Скрипт по идее виснет когда значение больше 100 и цикл будет дооооолго работать пока не cтанет меньше ста. Может стоит изменить на IF? Тогда будет работать весь скрипт и не повиснет на цикле. Ага он сразу после обнаружения persta > 100 ставиться на ноль. А смысл тогда цикла, if самое то.

Еще static unsigned long previousMillis = 0; объявлен в loop. Насколько помниться в примере да и я так делал он объявляется еще до void setup()

В начале кода он что сбрасывется на ноль? Или ошибаюсь. Если так то тогда это неправильно чтоли.

Переделал на свой лад могу ошибаться

#define  INTERVAL  500UL       
int pin = 9;     
int inin;                
int persta = 0;
boolean state=0;  //состояние выхода тип boolean имеет либо 0 либо 1 занимает мало памяти
unsigned long previousMillis = 0;  //объявляем переменную до программы

void setup() {
 pinMode(8, OUTPUT);    
 pinMode(10, OUTPUT);   
 Serial.begin(9600); 
}
 
void loop(){
      analogWrite(10, 125);
     inin =  analogRead(pin);

  if(millis() - previousMillis > INTERVAL){
     persta ++;  // имяпеременной++; это тоже самое что и  +1 
     previousMillis = millis(); 
     Serial.println(inin, DEC);
  }
        if (persta>100){  // изменили на if 
               digitalWrite(8, !state); //меняем на противоположное текущему значению. (вот только не пробовал, поменяет ли оно состояние или просто запишет в выход !state - увы пока не знаю
               Serial.println(state); //пишем в порт состояние(имеем ввиду что описано строкой выше)
            persta = 0;
          }
}    

 

Скопинцев
Offline
Зарегистрирован: 22.04.2015

ПОставил. Проверил Эффект тот же.
Как-то не верится, что для задачки "просто записать данные в текстовый файл" нет простого решения... (((((

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015
Есть мысль. Я так делал когда мерял скорость исполнения кода на определенных участках (что-то тормозило программу после изменения кода).
 
Millis уже есть, остаеться делать штамп времени между потенциально сложными командами. и дополнительно писать в порт время исполнения и место метки на пример:
 
unsigned long pTime=0; //прошлое время
unsigned long timeStamp;  //таймштамп

void setup(){};

void loop(){
unsigned long cTime = millis;   //регаем время 
---...CODE...---    //наш код например чтение данных или запись чего-то кудато, или считалка или преобразование
timeStamp = cTime - pTime;   //считаем время от прошлого обновления предыдущего времени замера (на первый раз равно нулю)
Serial.print("Code_Section---------------1-----TIME");    //пишем инфу где сейчас скрипт
Serial.println(timeStamp);   //пишем время от исполнения от и до.
pTime = cTime;      //обновлеям время когда мы последний раз проверяли чтобы знать сколько прошло времени от функции к функции
---...CODE...---
timeStamp = cTime - pTime;
Serial.print("Code_Section---------------2-----TIME");
Serial.println(timeStamp);
pTime = cTime;
}

 

Я замерял примерно так, находил что-то неладно и менял метод. Может в коде я ошибся но делал примерно так.
 
Так что попробуйте узнать где именно виснет.
 
Скопинцев
Offline
Зарегистрирован: 22.04.2015

Задал INTERVAL  50UL После всех описанных манипуляций получил нужные значения периода опроса.????
Среда ардуина гадит? Или что-то зашито в ардуино рro micri?

Скопинцев
Offline
Зарегистрирован: 22.04.2015

С версией delay вместо millis() - такое же замедление.
Поискать, боюсь, что позже. Время подпирает. Учебный год начинается, а это - лабораторная работа ((( 

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

Я бы интервал указал не через define

а int INTERVAL=500; как переменную.

Что равняется 500 миллисекунд. Почему вы через define делали я не знаю. Я таким не пользовался может и так можно.

А еще в коде где я делал на свой лад стоило написать так

...
state = !state; //мы так конвертируем обратное значение и 1 на 0 и обратно
digitalWrite(8, state);
Serial.println(state);
...
А во втором коде забыл инициализацию серийного порта, думаю можно догадаться.

 

Скопинцев
Offline
Зарегистрирован: 22.04.2015

Спасибо!  Закончил эксперименты, результат хороший, хоть и не понимаю, почему так.
Будет время - разберусь...)))

arduinec
Offline
Зарегистрирован: 01.09.2015

UserDead пишет:

Почему вы через define делали я не знаю. Я таким не пользовался может и так можно.

При компиляции INTERVAL (определенный define) просто заменяется на 500L, поэтому так можно, а иногда и нужно.

Скопинцев
Offline
Зарегистрирован: 22.04.2015

Да, спасибо!
Дело в том, что задача научиться программировать передо мной не стояла. Я - разработчик классических электронных устройств. Так сложилось, что аналоговую технику я понимаю и разрабатываю лучше значительно многих.
А для Ардуино внезапно применился мой опыт прикладной работы с FORTRANом и Паскалем (Бейсиком). Я и не углублялся в оптимизацию программ. Работает - и ладушки. Если не будет хватать памяти в микроконтроллере - разберусь с минимизацией.)))
Еще раз спасибо за обсуждение  

 

Скопинцев
Offline
Зарегистрирован: 22.04.2015

Я тихо съехиваю...
15 минут назад, примерно в 7-30 по Москве я написал #13. И вижу время публикации 05:58.
Мы где сейчас находимся, а? В какой параллельной реальности?
Сейчас на моих часах - 07:57

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Скопинцев пишет:

Я тихо съехиваю...
15 минут назад, примерно в 7-30 по Москве я написал #13. И вижу время публикации 05:58.
Мы где сейчас находимся, а? В какой параллельной реальности?
Сейчас на моих часах - 07:57

Сургут, ёпта - родина-мать русских слонов.