Как считать нечто осмысленное по SerialRead?
- Войдите на сайт для отправки комментариев
Сб, 12/10/2013 - 21:44
Помогите считать нечто осмысленное через Монитор порта Arduino IDE.
Например, я хочу написать в Мониторе порта "15", нажать интер, и arduino выполнит "a=15;". Не могу понять, как сделать это, пробывал, как я прочёл в интернете, аналог Convert, но это не сработало.
Тут ( http://arduino.ru/Reference/Serial/Print ) написано:
Для вещественных (дробных) чисел второй параметр задает количество знаков после запятой. Пример:
- Serial.println(1.23456, 2) выводит "1.23"
- Serial.println(1.23456, 4) выводит "1.2346
Но вот у меня второй параметр определяет разрядность выводимых данных, т.е при параметре 2 мне выводит 1010101011001(пример), при 3 выводит 12010021(пример). Что я делаю не так?
Подскажите, пожалуйста!
Для начала надо было воспользоваться поиском по сайту (в правом верхнем углу), так как данная тема обсуждалась раз таки десять.
http://arduino.ru/forum/programmirovanie/upravlenie-servoprivodom-po-serial#comment-19676
http://arduino.ru/forum/programmirovanie/problema-polucheniya-dannykh-s-seriinogo-porta-arduino#comment-39147
Я знаю для чего принт. Я пытаюсь вывести из ардуино значение, но обрезать до двух знаков после запятой - не получается.
То, что тема уже обсуждалась - знаю. Искал сегодня весь день, перечитал не только этот сайт. У меня проблема в том, что не смотря на то, что я даю переменной тип char - ничего не происходит. Он чар, но там те же самые кикоды сидят. Толку их склеивать) Почему-то часто пишут про задачу типа данных как char* (со звездой) но моя Arduino IDE не знает этого и пишет ошибку компилинга.
Подскажите лучше, почему не вводится кол-во знаков после запятой?
UPD: Перевёл объявление переменной в самое начало программы, до сетапа - заработало!
Осталось понять, почему не обрезает знаки.
Забыл спросить в самом начале:
Сколько раз можно прошивать ATMEGA328P-PU ? Как проявится предел? Полный отказ прошиваться или криво прошьётся?
Покажите код.
Шейте на здоровье, достаточно много....
Вас невозможно понять, выкладывайте код и попробуйте по-человечески обьяснить что хотите сделать.
Вставка программного кода в тему/комментарий
Сейчас закидаете..... Это тахометр, который считывает данные с ИК оптопары.
char L=1; // кол-во лопастей либо щелей unsigned long tPH, tPL, T=0; double RPM; void setup() { Serial.begin(9600); digitalWrite(14, HIGH); // этим я подавал питание через резистор на фотодиод } void loop() { if (Serial.available() > 0) { L = (Serial.read()-'0'); // Пытаюсь присваивать кол-во лопастей из Монитора порта } for (int i=1; i<=L; i++) { // Эта часть вроде работает, tPL = pulseIn(14, LOW); // но лично мне кажется, что tPH = pulseIn(14, HIGH); // RPM в итоге завышается в 2 раза T=T+(tPL+tPH); } RPM=60000000/T; Serial.println(RPM); T=0; delay(300); }#1 - перечитывайте до тех пор пока не поймете что нужно делать.
int L = 1; // кол-во лопастей либо щелей unsigned long tPH, tPL, T = 0; float RPM; void setup() { Serial.begin(9600); digitalWrite(14, HIGH); // этим я подавал питание через резистор на фотодиод Serial.setTimeout(100); } void loop() { if (Serial.available()) L = Serial.parseInt(); // Пытаюсь присваивать кол-во лопастей из Монитора порта for (int i = 1; i <= L; i++) { // Эта часть вроде работает, tPL = pulseIn(14, LOW); // но лично мне кажется, что tPH = pulseIn(14, HIGH); // RPM в итоге завышается в 2 раза T += tPL + tPH; } RPM = 60000000 / T; Serial.println(RPM); T = 0; delay(300); }Не уверен что оптимально использовать pulseIn.
Если импульсов не будет, скетч ваш повиснет....
Более красивое решение использовать прерывания.
Однако, всё очень красиво складывается само собой: При ожидании импульса более 1 секунды в консоль вываливается строка ovf, потом ещё одна, если и ещё одного нет и т.д. Когда импульсы снова появляются программа отрабатывает их как надо.