печать на это

igrec
Offline
Зарегистрирован: 02.03.2012

Помогите  пожалуйста с задачкой.

Есть крутилка, кнопка и семисгемнтый диплей.

Если покрутить крутилку, то на дисплее показывает цифры от 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';}

 

 

leshak
Offline
Зарегистрирован: 29.09.2011

 В студию код целиком (если большой, но при вставке "свернуть"), даташиты на то что вы используете, схему подключения.

Из того что видно уже сейчас (хотя многое может быть "за кадром" что на него влияет):

  1. Использование переменной count То как int (строчки 10,12,14,16), то вдруг char начали ей присваивать (строчки 18,20,22)
  2. Куча "лишних проверок". Многократое "переприсваивание переменой count, когда предыдущие значение теряется. Но опять-таки сказать "если ли это проблемй" - трудно. Как минимум это выглядить как "грядный код".
  3. Не видно "а где-же вы читаете-то" кнопку?  Если в строке три, но немного не понятно что вы там делаете. Обычно кнопки читают с помощью digitalRead.

Ну и вообще непонятно что это за переменная count, какие значения у THREE, FOUR, FIVE и т.п.

igrec
Offline
Зарегистрирован: 02.03.2012

дико извинияюсь, перекопировал несахраненный док :(

 

хотел сначала выводить как чар, когда не вышло изменил на инт, все равно застрял. Но все же хотель бы в чар.

вот, что есть на данном этапе

 

#include "inc.h"

int count =0;
void setup()
{
  Serial.begin(9600);
  pinMode(POT1, INPUT);
  pinMode(LATCH, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(DATA, OUTPUT);
}


int number()
{
 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;}

if (digitalRead(BUTTON2) == LOW)
 {
   Serial.println(count);
    delay(10000);
 }
  

 }

инклюд

//numbers

#define ZERO B11000000
#define ONE B11111001
#define TWO B10100100
#define THREE B10110000
#define FOUR B10011001
#define FIVE B10010010
#define SIX B00000010
#define SEVEN B11111000
#define EIGHT B10000000
#define NINE B00010000

//standart given

#define POT1 0
#define POT2 1
#define POT3 2
#define BUTTON1 10
#define BUTTON2 11
#define BUTTON3 12
#define LED1 5
#define LED2 6
#define BUZZER 3
#define LATCH 7
#define CLOCK 8
#define DATA 4

 

maksim
Offline
Зарегистрирован: 12.02.2012

Это кусок кода? Или весь? Что такое POT3 2, BUTTON3, LED2??? Поконкретнее можно?

igrec
Offline
Зарегистрирован: 02.03.2012

обшее примочки подключенные.

играют:

POT1 - резистор переменного сопротивления на 1023 // крутилка  0 -подключен к нулевой ножке

BUTTON2 - кнопка // там еше пара кнопок 1 и 3 соответственно   11 -подключен к 11-ой ножке

LATCH, CLOCK, DATA -семисегментный дисплей (ну он как бы 8-ми сегментный, но точку не считаем, я ее включаю только для 6 и 9)  // ножки 7, 8, 4

остальное пока не задействованно

LED1/2 - собтвенно пара светодиодных индикаторов

BUZZER -пишалка Piezo

это весь код, за исключением, вызова из лупа, которорый я пока просто вызываю, отсюда и здержка delay(10000); ибо печатает очень быстро без нее. И печатает на эхо почему-то цифру 9.

вот для наглядности

 

maksim
Offline
Зарегистрирован: 12.02.2012

Тогда вот так:
 

#include "inc.h"

const byte ssd[7] = { 
  THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE };
int count = 0;

void setup(){
  Serial.begin(9600);
  pinMode(LATCH, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(DATA, OUTPUT);
}

void loop() {
  number();
  BUTTON ();
}


void number(){
  count = analogRead(POT1)/147;
  digitalWrite(LATCH,LOW);
  shiftOut(DATA,CLOCK,MSBFIRST,ssd[count]);
  digitalWrite(LATCH,HIGH);
}

void BUTTON (){
  if(digitalRead(BUTTON2) == 0){
      Serial.println(count+3, DEC);
      delay(500);
  }
}

 

 

maksim
Offline
Зарегистрирован: 12.02.2012

Работает? 

igrec
Offline
Зарегистрирован: 02.03.2012

спасибо, не прокоментируете пожалуйста последнюю функции и в частности почему заглавными  ?  :)

maksim
Offline
Зарегистрирован: 12.02.2012

Функции можно называть как угодно хоть  вот так: 

void bOlSHaIaZhoPa (){
}

главное, кода ее вызываешь писать так же с учетом регистра:

bOlSHaIaZhoPa ();

 

 

leshak
Offline
Зарегистрирован: 29.09.2011

 Попробую я прокомментировать, хоть и не я писал.
Большие буквы - ничего не значат. Просто "так набралось".

Строка 28 - проверяем нажата-ли кнопка. Предполагается что при замыкании она коротит пин на землю. При "разомкнутой кнопке", на пине 1, так как он подтянут встроенным резистором к питанию. Включили подтяжку в строчке .... а кстати не включили. Вообще забыли вообще пины на input сконфигурить. Прошлая версия (с аттачем), была с конфигурацей и включением подтяжки.

 

igrec
Offline
Зарегистрирован: 02.03.2012

а ясно, просто подумалось, что какая-то фича существует с заглавными. Про подключения понятно допишу

leshak
Offline
Зарегистрирован: 29.09.2011

 Строка 29: выводим в serial прочитанное в строке 21, значение count. Так как нумерация у возможных значение у нас начинается с 3-х (строка 4-ре), значит добавляем к нему 3, что-бы в serial и на экране совпадало значение.

Строка 30: небольшая задержка. Что-бы при нажатии кнопки, данные не сыпались в Serial слишком быстро. 

maksim
Offline
Зарегистрирован: 12.02.2012

Можно было сделать так:

#include "inc.h"

const byte ssd[7] = { 
  THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE };
int count = 0;

void setup(){
  Serial.begin(9600);
  pinMode(LATCH, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(DATA, OUTPUT);
}

void loop() {
  count = analogRead(POT1)/147;
  digitalWrite(LATCH,LOW);
  shiftOut(DATA,CLOCK,MSBFIRST,ssd[count]);
  digitalWrite(LATCH,HIGH);
  if(digitalRead(BUTTON2) == 0){
      Serial.println(count+3, DEC);
      delay(500);
  }
}





 

leshak
Offline
Зарегистрирован: 29.09.2011

 В Setup еще нужно добавить

pinMode(BUTTON2,INPUT);
digitalWrite(BUTTON2,HIGH);// влючили поддтяжку

pinMode(PO1,INPUT);

 

 

maksim
Offline
Зарегистрирован: 12.02.2012

У него на плате есть подтягивающий резистор и если я не ошибаюсь на 11 выводе подтяжка не работает.

И все порты по-умолчанию работают на вход. 

pinMode(PO1,INPUT); а эта строчка настроет цифровой вывод вместо аналогого...

так что все это лишнее

igrec
Offline
Зарегистрирован: 02.03.2012

Спасибо за объяснение, лучше отдельными функциями. Мне  надо еше много чего дописать. Что бы было гибкость, в дальнейшем посмотрю  на оптимизацию. Выучить бы уж поскорей .

 

А зачем тут 7 ку писать  ssd[7] ?  (еше один глупый вопрос), я же и так указал, что там семь компонентов

leshak
Offline
Зарегистрирован: 29.09.2011

maksim пишет:

У него на плате есть подтягивающий резистор и если я не ошибаюсь на 11 выводе подтяжка не работает.

Если есть внешняя - конечно не нужно включать. Но я в доке, по крайней мере http://arduino.cc/en/Tutorial/DigitalPins не увидел что "не на всех пинах" есть внутреняя.

 

maksim пишет:

И все порты по-умолчанию работают на вход. 

Подвела привычка задавать конфигурацю явно. Что-бы по коду сразу было видно чего ждем. Но вы правы, можно не задавать, дело вкуса. Я промахнулся со своей категоричностью.

maksim пишет:

pinMode(PO1,INPUT); а эта строчка настроет цифровой вывод вместо аналогого...

И опять правы. Вдвойне. В основном работал с цифровыми пинами, вот и на analog попытался включить. Конечно не нужно.

Вообщем прошу прощения за то что внес сумятицу.  Немного "перебдел". :)

leshak
Offline
Зарегистрирован: 29.09.2011

igrec пишет:

А зачем тут 7 ку писать  ssd[7] ?  (еше один глупый вопрос), я же и так указал, что там семь компонентов

Да. вы правы. Можно не писать (в данном конкретном случае). Но опять-таки "дело вкуса" (сразу виден размер массива, легче читать), плюс компилятор ругнется если вы промахнетесь и вбоярите туда, например 8 компонентов. Чуть меньше шанс ошибки/опечатки (на 6 компонентов, к сожалению, промолчит).

igrec
Offline
Зарегистрирован: 02.03.2012

maksim
Offline
Зарегистрирован: 12.02.2012

"...не увидел что "не на всех пинах" есть внутреняя..."
leshak, да у всех есть, я ошибся, просто как-то давно по какой-то причине на одних работали на других нет вот и отложилось, что не на всех...

igrec
Offline
Зарегистрирован: 02.03.2012

Не подскажете, где бы про DEC  из строки   

Serial.println(count+3, DEC);   прочитать. или что это такое?

копаюсь в референсах на офсайте-нету ничего.

 

maksim
Offline
Зарегистрирован: 12.02.2012

Этот параметр определяет в каком виде (системы счисления) будет выводится  значение в сириал-мониторе

DEC - десятичная, HEX - шеснадцатиричная, BIN - двоичная. 

igrec
Offline
Зарегистрирован: 02.03.2012

Совсем запутался, а откуда скетч берет цифры на печать? 10110000 это 176 , а не 3   :/

step962
Offline
Зарегистрирован: 23.05.2011

igrec пишет:

Не подскажете, где бы про 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:

примеры в цитате не привожу - их есть там много и на любой вкус. 

maksim
Offline
Зарегистрирован: 12.02.2012

У тебя на индикаторе восемь сегментов (7 сегментов для цифры и точка) то есть восемь светодиодов(хотя незнаю может точка неиспользуется), в файле inc.h описаны какие сегменты должны загораться, что бы на индикаторе получилась цифра, а не ихнее (цифр) представление в двоичном виде.

У тебя индикатор работает так: 0 - это означет, что светодиод горит, 1 - означает, что выключен.

То есть 00000000 - горят все сегменты, получается "8."(цифра восемь с точкой), а не 0, а если 11111111 то ничего не горит.

И почитай про сдвиговый регистр 74HC595.

 

igrec
Offline
Зарегистрирован: 02.03.2012

пощел разбиратся спасибо еще раз