печать на это
- Войдите на сайт для отправки комментариев
Сб, 03/03/2012 - 14:54
Помогите пожалуйста с задачкой.
Есть крутилка, кнопка и семисгемнтый диплей.
Если покрутить крутилку, то на дисплее показывает цифры от 3-9. Нужно что-бы при нажатии кнопки, выводилась цифра на эхо-экран ардуино. Все оборудование определеннов доп. файле и подключается через инклюд. Написал вот и застрял.
byte ssd[] = { THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE }; int i; i = analogRead(POT1)/146; digitalWrite(LATCH,LOW); shiftOut(DATA,CLOCK,MSBFIRST,ssd[i]); digitalWrite(LATCH,HIGH); if (ssd[FOUR]) {count = 4;} if (ssd[FIVE]) {count = 5;} if (ssd[SIX]) {count = 6 ;} if (ssd[SEVEN]) {count = 7 ;} if (ssd[EIGHT]) {count ='8';} if (ssd[NINE]) {count ='9';} else {count ='3';}
В студию код целиком (если большой, но при вставке "свернуть"), даташиты на то что вы используете, схему подключения.
Из того что видно уже сейчас (хотя многое может быть "за кадром" что на него влияет):
Ну и вообще непонятно что это за переменная count, какие значения у THREE, FOUR, FIVE и т.п.
дико извинияюсь, перекопировал несахраненный док :(
хотел сначала выводить как чар, когда не вышло изменил на инт, все равно застрял. Но все же хотель бы в чар.
вот, что есть на данном этапе
инклюд
Это кусок кода? Или весь? Что такое POT3 2, BUTTON3, LED2??? Поконкретнее можно?
обшее примочки подключенные.
играют:
POT1 - резистор переменного сопротивления на 1023 // крутилка 0 -подключен к нулевой ножке
BUTTON2 - кнопка // там еше пара кнопок 1 и 3 соответственно 11 -подключен к 11-ой ножке
LATCH, CLOCK, DATA -семисегментный дисплей (ну он как бы 8-ми сегментный, но точку не считаем, я ее включаю только для 6 и 9) // ножки 7, 8, 4
остальное пока не задействованно
LED1/2 - собтвенно пара светодиодных индикаторов
BUZZER -пишалка Piezo
это весь код, за исключением, вызова из лупа, которорый я пока просто вызываю, отсюда и здержка delay(10000); ибо печатает очень быстро без нее. И печатает на эхо почему-то цифру 9.
вот для наглядности
Тогда вот так:
Работает?
спасибо, не прокоментируете пожалуйста последнюю функции и в частности почему заглавными ? :)
Функции можно называть как угодно хоть вот так:
главное, кода ее вызываешь писать так же с учетом регистра:
Попробую я прокомментировать, хоть и не я писал.
Большие буквы - ничего не значат. Просто "так набралось".
Строка 28 - проверяем нажата-ли кнопка. Предполагается что при замыкании она коротит пин на землю. При "разомкнутой кнопке", на пине 1, так как он подтянут встроенным резистором к питанию. Включили подтяжку в строчке .... а кстати не включили. Вообще забыли вообще пины на input сконфигурить. Прошлая версия (с аттачем), была с конфигурацей и включением подтяжки.
а ясно, просто подумалось, что какая-то фича существует с заглавными. Про подключения понятно допишу
Строка 29: выводим в serial прочитанное в строке 21, значение count. Так как нумерация у возможных значение у нас начинается с 3-х (строка 4-ре), значит добавляем к нему 3, что-бы в serial и на экране совпадало значение.
Строка 30: небольшая задержка. Что-бы при нажатии кнопки, данные не сыпались в Serial слишком быстро.
Можно было сделать так:
В Setup еще нужно добавить
У него на плате есть подтягивающий резистор и если я не ошибаюсь на 11 выводе подтяжка не работает.
И все порты по-умолчанию работают на вход.
pinMode(PO1,INPUT); а эта строчка настроет цифровой вывод вместо аналогого...
так что все это лишнее
Спасибо за объяснение, лучше отдельными функциями. Мне надо еше много чего дописать. Что бы было гибкость, в дальнейшем посмотрю на оптимизацию. Выучить бы уж поскорей .
А зачем тут 7 ку писать ssd[7] ? (еше один глупый вопрос), я же и так указал, что там семь компонентов
У него на плате есть подтягивающий резистор и если я не ошибаюсь на 11 выводе подтяжка не работает.
Если есть внешняя - конечно не нужно включать. Но я в доке, по крайней мере http://arduino.cc/en/Tutorial/DigitalPins не увидел что "не на всех пинах" есть внутреняя.
И все порты по-умолчанию работают на вход.
Подвела привычка задавать конфигурацю явно. Что-бы по коду сразу было видно чего ждем. Но вы правы, можно не задавать, дело вкуса. Я промахнулся со своей категоричностью.
pinMode(PO1,INPUT); а эта строчка настроет цифровой вывод вместо аналогого...
И опять правы. Вдвойне. В основном работал с цифровыми пинами, вот и на analog попытался включить. Конечно не нужно.
Вообщем прошу прощения за то что внес сумятицу. Немного "перебдел". :)
А зачем тут 7 ку писать ssd[7] ? (еше один глупый вопрос), я же и так указал, что там семь компонентов
Да. вы правы. Можно не писать (в данном конкретном случае). Но опять-таки "дело вкуса" (сразу виден размер массива, легче читать), плюс компилятор ругнется если вы промахнетесь и вбоярите туда, например 8 компонентов. Чуть меньше шанс ошибки/опечатки (на 6 компонентов, к сожалению, промолчит).
"...не увидел что "не на всех пинах" есть внутреняя..."
leshak, да у всех есть, я ошибся, просто как-то давно по какой-то причине на одних работали на других нет вот и отложилось, что не на всех...
Не подскажете, где бы про DEC из строки
Serial.println(count+3, DEC); прочитать. или что это такое?
копаюсь в референсах на офсайте-нету ничего.
Этот параметр определяет в каком виде (системы счисления) будет выводится значение в сириал-мониторе
DEC - десятичная, HEX - шеснадцатиричная, BIN - двоичная.
Совсем запутался, а откуда скетч берет цифры на печать? 10110000 это 176 , а не 3 :/
Не подскажете, где бы про DEC из строки
Serial.println(count+3, DEC); прочитать. или что это такое?
копаюсь в референсах на офсайте-нету ничего.
А что вы подраумеваете под офсайтом? Разве не arduino.cc? Там - есть:
An optional second parameter specifies the base (format) to use; permitted values are BIN (binary, or base 2), OCT (octal, or base 8), DEC (decimal, or base 10), HEX (hexadecimal, or base 16). For floating point numbers, this parameter specifies the number of decimal places to use. For example:
У тебя на индикаторе восемь сегментов (7 сегментов для цифры и точка) то есть восемь светодиодов(хотя незнаю может точка неиспользуется), в файле inc.h описаны какие сегменты должны загораться, что бы на индикаторе получилась цифра, а не ихнее (цифр) представление в двоичном виде.
У тебя индикатор работает так: 0 - это означет, что светодиод горит, 1 - означает, что выключен.
То есть 00000000 - горят все сегменты, получается "8."(цифра восемь с точкой), а не 0, а если 11111111 то ничего не горит.
И почитай про сдвиговый регистр 74HC595.
пощел разбиратся спасибо еще раз