Нужен регистратор потока данных от Ардуино к компьютеру через USB
- Войдите на сайт для отправки комментариев
Пт, 26/08/2016 - 13:05
Я – начинающий.
Моя проблема.
Сделал на ардуино электронный термометр с регистрацией по USB на Terminal19b. Запрограммировал циклический опрос с интервалом полсекунды. В среде ардуино отладил, загрузил – поток от термометра идет нормально. И на монитор Ардуино, и на Terminal.
Вышел из ардуино, переткнул термометр, подсоединил Terminal… Скорость термометра уменьшилась на порядок.
Что я не знаю?
Заранее спасибо
То есть у вас время исполнения скетча замедлилось?
Медленно приходят данные по серийному порту, я так понял?
А куда переткнули?
Какая разница во времени
Скопинцев, Вам в предыдущей теме уже намекнули, что без описания конструкции и без выкладки скетча (http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii) что-либо советовать затруднительно.
//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 раз...
Я понимаю, что такими вопросами мало кто задается. И вряд ли могут объяснить.
Может быть посоветуете, какой-то другой регистратор такого простого циклического потока?
А может быть проблема в while? Скрипт по идее виснет когда значение больше 100 и цикл будет дооооолго работать пока не cтанет меньше ста. Может стоит изменить на IF? Тогда будет работать весь скрипт и не повиснет на цикле. Ага он сразу после обнаружения persta > 100 ставиться на ноль. А смысл тогда цикла, if самое то.
Еще
staticunsignedlongpreviousMillis = 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; } }ПОставил. Проверил Эффект тот же.
Как-то не верится, что для задачки "просто записать данные в текстовый файл" нет простого решения... (((((
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; }Задал INTERVAL 50UL После всех описанных манипуляций получил нужные значения периода опроса.????
Среда ардуина гадит? Или что-то зашито в ардуино рro micri?
С версией delay вместо millis() - такое же замедление.
Поискать, боюсь, что позже. Время подпирает. Учебный год начинается, а это - лабораторная работа (((
Я бы интервал указал не через define
а int INTERVAL=500; как переменную.
Что равняется 500 миллисекунд. Почему вы через define делали я не знаю. Я таким не пользовался может и так можно.
А еще в коде где я делал на свой лад стоило написать так
Спасибо! Закончил эксперименты, результат хороший, хоть и не понимаю, почему так.
Будет время - разберусь...)))
Почему вы через define делали я не знаю. Я таким не пользовался может и так можно.
При компиляции INTERVAL (определенный define) просто заменяется на 500L, поэтому так можно, а иногда и нужно.
Да, спасибо!
Дело в том, что задача научиться программировать передо мной не стояла. Я - разработчик классических электронных устройств. Так сложилось, что аналоговую технику я понимаю и разрабатываю лучше значительно многих.
А для Ардуино внезапно применился мой опыт прикладной работы с FORTRANом и Паскалем (Бейсиком). Я и не углублялся в оптимизацию программ. Работает - и ладушки. Если не будет хватать памяти в микроконтроллере - разберусь с минимизацией.)))
Еще раз спасибо за обсуждение
Я тихо съехиваю...
15 минут назад, примерно в 7-30 по Москве я написал #13. И вижу время публикации 05:58.
Мы где сейчас находимся, а? В какой параллельной реальности?
Сейчас на моих часах - 07:57
Я тихо съехиваю...
15 минут назад, примерно в 7-30 по Москве я написал #13. И вижу время публикации 05:58.
Мы где сейчас находимся, а? В какой параллельной реальности?
Сейчас на моих часах - 07:57
Сургут, ёпта - родина-мать русских слонов.