Программа внутри millis()
- Войдите на сайт для отправки комментариев
Чт, 11/07/2013 - 15:22
Ситуация следующая, внутри цикла millis не выполняются функции (кроме передачи данных в консоль Processing).
Что не так?
int currentMillis = millis(); if (currentMillis - previousMillis > interval){ if (t != null) {DHT22T=float(t);} //Преобразование if (h != null) {DHT22H=float(h);} //чисел из строчного массива if (t0 != null) {DS18B20T1=float(t0);} //в переменную if (t1 != null) {DS18B20T2=float(t1);} //с плавающей запятой if (temperature_up != null) {Tmax=float(temperature_up);} if (temperature_down != null) {Tmin=float(temperature_down);} if (humdity != null) {Hmax=float(humdity);} row_data=hr+":"+min+"_"+day+"_"+month+" "+"T1: "+DHT22T+" T2: "+DS18B20T1+" T3: "+DS18B20T2+" H: "+DHT22H; save.println(row_data); println (row_data); xk=xn+432*1000/interval; yk=yn-240.0*DHT22T/(10*(Tmax-Tmin)); stroke(255, 0, 0); // цвет будущей линии красный line (xn, yn, xk, yk); // рисуем линию xn=xk; yn=yk; previousMillis = currentMillis; }
Интересный момент: при интервале меньше 1000 millis (1 секунда), по крайней мере лог файл видется, но мне такая частота не нужна, желаемый интервал раз в 30-60 минут.
Я бы попробовал определить соответствующие переменные не как int, а как long.
Вдруг да поможет...
Я бы попробовал определить соответствующие переменные не как int, а как long.
Вдруг да поможет...
домой приду попробую, спасибо за совет.
long не помог...
Прошу помощи. Хотя бы направление укажите.
Во первых, читаем внимательно докуменатацию на millis() | Аппаратная платформа Arduino и видим, что она возвращает тип unsigned long, а не int или long. Вообщем тут не гадать нужно о типе, а в доки смотреть :)
Следовательно, для хранения и оперирования значениями которые она возвращает, все переменные должны быть того же типа. Так что убедитесь, что вы не толко у currentMillis сменили тип, но и у previousMillis, interval и т.п. все в которые может "попасть время".
Во вторых, попробуйте сузить область поиска бага. Выяснить что именно у вас глючит "таймерная логика" или "код внутри нее".
Выкинте все внутри этого if-а, и сделайте там какой-то баланльный Serial.println(currentMillis). Если в сериал логе будете видить что он вызывается нормально и вовремя - почастям возвращайте все что выкинули и смотрите когда опять появятся глюки.
Проверте что у вас правильно объявлен previuseMillis (либо как статическая, либо как глобальная переменная), что его значение не теряется между вызовами loop() (вообщем бага может быть спрятана в коде который вы не показали).
Для более удобного тестирования, что-бы не ждать по пол-часа, можно провернуть такую хитрость:
Делаем объявление:
Везде в коде, вызовы millis() заменяем на GET_TIME (без скобочек).
В результате мы получим "ускоренное время". Для кода будет казатся что время пошло в 100 раз быстрей и ждать нам нужно будет не пол-часа, а 18-ть секунд (если слишком быстро, меняем коэфициент 100 на что-то поменьше).
Когда все заработает, достаточно будет закоментить этот дефайн и вместо него написать
Что-бы вернуть "обычный маштаб времени". Без необходимости "менять везде по коду на millis()". Чем снизим вероятность внести ошибку в уже отлаженный код :)
ну может тогда unsigned long
Во первых, читаем внимательно докуменатацию на millis() | Аппаратная платформа Arduino и видим, что она возвращает тип unsigned long, а не int или long. Вообщем тут не гадать нужно о типе, а в доки смотреть :)
Следовательно, для хранения и оперирования значениями которые она возвращает, все переменные должны быть того же типа. Так что убедитесь, что вы не толко у currentMillis сменили тип, но и у previousMillis, interval и т.п. все в которые может "попасть время".
Во вторых, попробуйте сузить область поиска бага. Выяснить что именно у вас глючит "таймерная логика" или "код внутри нее".
Выкинте все внутри этого if-а, и сделайте там какой-то баланльный Serial.println(currentMillis). Если в сериал логе будете видить что он вызывается нормально и вовремя - почастям возвращайте все что выкинули и смотрите когда опять появятся глюки.
Проверте что у вас правильно объявлен previuseMillis (либо как статическая, либо как глобальная переменная), что его значение не теряется между вызовами loop() (вообщем бага может быть спрятана в коде который вы не показали).
Для более удобного тестирования, что-бы не ждать по пол-часа, можно провернуть такую хитрость:
Делаем объявление:
Везде в коде, вызовы millis() заменяем на GET_TIME (без скобочек).
В результате мы получим "ускоренное время". Для кода будет казатся что время пошло в 100 раз быстрей и ждать нам нужно будет не пол-часа, а 18-ть секунд (если слишком быстро, меняем коэфициент 100 на что-то поменьше).
Когда все заработает, достаточно будет закоментить этот дефайн и вместо него написать
Что-бы вернуть "обычный маштаб времени". Без необходимости "менять везде по коду на millis()". Чем снизим вероятность внести ошибку в уже отлаженный код :)
Спасибо!
Начал проверять, и понял, что вы маленько не до поняли. Это скетч Processinga, а в нем millis, цитируюЦитата:
Name
Examples
Description
Returns the number of milliseconds (thousandths of a second) since starting the program. This information is often used for timing events and animation sequences.
Syntax
Returns
int
millis()
в процессинге возвращает значение int. но я по пробовал и long. ничего не поменялось. Убрал все ifы, сделал печать current в консоль процессинга и значение одной переменной. В консоль печатает, а в файл так и не пишет.
Приведу весь код скетча PROCESSINGA для Вашего анализа. Сам справиться не могу, нуждаюсь в подсказках.
> В консоль печатает, а в файл так и не пишет.
Значит у вас проблема не с millis(), а с записью в файл.
Поэтому выкидываем все (чтение Serial и т.п.) и вначале добиваемся что в файл писалось... ну хоте бя текущие значение millis() :)
Я, честно говоря, именно с процессингом работал очень мало (чуть меньше года назад, пару дней :) , для какой-то ветки пример делал), но общие соображения будут такие (про что документацию почитать нужно):
1. Держать, особенно на таких временных интревалах, файл все время открытм для записи - очень плохая идея :( Лучше, когда пришло время, отрыть файл, записать туда что нужно, и закрыть его. Открывать его - нужно в режиме Append, естественно, что-бы не перетерать существующие содержимое.
2. Проблема может быть так же в том что нужно еще делать flush файлу (сбрасывать кешь-буфер). Если будете файл закрывать, то возможно это не потребуется. По идее при закрытии должен сам сбрасывать буфер на диск, но.... в официальном туториале, они делают, все-таки это руками Learning Processing: Tutorials: External Data into Processing I
3. На всякий случай, убедитесь что тот Viewer которым вы смотрите файл не блокирует его на запись. Такое тоже бывает - открыл файл "посмотреть" и никто не может в него ничего записать :( (из-за криворукости автора viewer-а, или вы смотрите каким-то редактором).
> В консоль печатает, а в файл так и не пишет.
Значит у вас проблема не с millis(), а с записью в файл.
Поэтому выкидываем все (чтение Serial и т.п.) и вначале добиваемся что в файл писалось... ну хоте бя текущие значение millis() :)
Я, честно говоря, именно с процессингом работал очень мало (чуть меньше года назад, пару дней :) , для какой-то ветки пример делал), но общие соображения будут такие (про что документацию почитать нужно):
1. Держать, особенно на таких временных интревалах, файл все время открытм для записи - очень плохая идея :( Лучше, когда пришло время, отрыть файл, записать туда что нужно, и закрыть его. Открывать его - нужно в режиме Append, естественно, что-бы не перетерать существующие содержимое.
2. Проблема может быть так же в том что нужно еще делать flush файлу (сбрасывать кешь-буфер). Если будете файл закрывать, то возможно это не потребуется. По идее при закрытии должен сам сбрасывать буфер на диск, но.... в официальном туториале, они делают, все-таки это руками Learning Processing: Tutorials: External Data into Processing I
3. На всякий случай, убедитесь что тот Viewer которым вы смотрите файл не блокирует его на запись. Такое тоже бывает - открыл файл "посмотреть" и никто не может в него ничего записать :( (из-за криворукости автора viewer-а, или вы смотрите каким-то редактором).
Пунктом №1 навели на мысль. Стал очищать буфер save.flush (); // записывает данные, оставшиеся в файл
Спасибо за помощь!
Пунктом №1 навели на мысль. Стал очищать буфер save.flush (); // записывает данные, оставшиеся в файл
Мне тоже казалось что это самое вероятное. Только это был пункт 2 :) А к пункту 1 - тоже НАСТОЯТЕЛЬНО рекомендую присмотрется. Даже если "все работает".
Держать долго открытым файл - не стоит.
Если что-то случится (комп ребутнулся, програ вылетела по ошибке, преравали ее и т.п.) - вы можете потерять все данные. Даже если делали flash. не закрытый файл - это зло. Вообщем лучше открывать его на время записи и закрывать после.
Обычно файл держат открытым - когда нужно писать много и часто. Для того что-бы не тратить время на открытие/закрытие. Но, так как вы пишите раз в пол часа - тут однозначно нужно закрывать (даже "раз в секунду" - уже будет "редко пишем, поэтому можно и закрыть").
Хм, команду на закрытие знаю close, а на открытие какая? open?
Хм, команду на закрытие знаю close, а на открытие какая? open?
Думаю гугл на что-нибудь типа "processing append text file" сможет подсказать. Например:
Processing 1.0 - Processing Discourse - Append to a text file
или Processing 1.0 - Processing Discourse - appending to a text file
ну и доках порытся.
"1. Держать, особенно на таких временных интревалах, файл все время открытм для записи - очень плохая идея :("
лог файл неделями висит открытым, в него регулярно пишется всякая фигня по событиям. За пол года работы был зафиксирован всего один обрыв работы лога, да и то вероятнее всего из-за чьих то шаловливых ручек. При этом этот же лог время от времени открывается для просмотра (обычно браузером, проще увидеть новые записи простым обновлением страницы).