Что нужно Чайнику?

msng
Offline
Зарегистрирован: 07.06.2012

RX TX на сидят на D0 D1, сегменты лучше подключить далее к D2-D9

ну а лучше через 74hc595, три ноги всего займет

sasa999
Offline
Зарегистрирован: 21.03.2014

помогите написать скетч, дисплей светит число 06, два старших разряда не светят. сегменты D2-D9, катоды A0-A3. запутался я.

sasa999
Offline
Зарегистрирован: 21.03.2014

никто не может что ли? спасибо.

sasa999
Offline
Зарегистрирован: 21.03.2014

Всем привет. Вот, изваял приборчик, измеряет Вашу реакцию. Вспыхнула надпись "----", как увидел, жми Кнопку.
Покажет время от вспышки до нажатия. Нужен Arduino Nano, LED-Дисплей 4 разрядный цифровой 7 сегментов+точка,
резистор 10кОм, Кнопка. Работает! Легко повторить, азартная вещь, народ соревнуется кто быстрей. Стандартные результаты типа 0,198-0,220, рекорды 0,165 ! Левая рука медленней правой. А в сост.алкоголь.опь. вообще
зашкаливает за пол-секунды. Выводы делаем сами. За точность прибора не ручаюсь, но стабильность работы гарантирую.

//  Arduino Nano.  ТАЙМЕР для измерения Вашей реакции. Как только высвечиваются тире "----", 
//сразу жмем Кнопку, тире гаснут, на дисплее время между вспышкой тире и нажатием кнопки 
//в Сек и их долях. Так можно численно до миллисекунд оценить Вашу реакцию.
//Полный интервал 10с, точность 1мс, сам гаснет и измеряет снова циклически.
//Азартная игрушка. Кто быстрей..
//  СХЕМА:  Дисплей-LED красный, 4 разр, 8сегментов(вкл.ДесятТочку dp), ОбщАнод, управление 
//сегментами по-минусу. 
//Сегменты abcdefg -> D2-D8, dp-> D9, катоды Разрядов RZ1-RZ4 -> D10-D13. (RZ1 младший, справа)
// Кнопка от A6 к GND, резюк 10кОм от A6 к +5V. 
int GASH(int x){PORTB = B11111111;}// функция гашения всех разрядов дисплея
//образы Цифр 0-9 тире, дес.точка. Общий Анод, сегменты и разряды управл.минусом 
int CIF0(int x){PORTB = B11111111; PORTD = B00000000; digitalWrite(8, HIGH); return x;}// cif 0
int CIF1(int x){PORTB = B11111111; PORTD = B11100100; digitalWrite(8, HIGH); return x;}// cif 1
int CIF2(int x){PORTB = B11111111; PORTD = B10010000; digitalWrite(8, LOW); return x;}// cif 2
int CIF3(int x){PORTB = B11111111; PORTD = B11000000; digitalWrite(8, LOW); return x;}// cif 3
int CIF4(int x){PORTB = B11111111; PORTD = B01100100; digitalWrite(8, LOW); return x;}// cif 4
int CIF5(int x){PORTB = B11111111; PORTD = B01001000; digitalWrite(8, LOW); return x;}// cif 5
int CIF6(int x){PORTB = B11111111; PORTD = B00001000; digitalWrite(8, LOW); return x;}// cif 6
int CIF7(int x){PORTB = B11111111; PORTD = B11100000; digitalWrite(8, HIGH); return x;}// cif 7
int CIF8(int x){PORTB = B11111111; PORTD = B00000000; digitalWrite(8, LOW); return x;}// cif 8
int CIF9(int x){PORTB = B11111111; PORTD = B01000000; digitalWrite(8, LOW); return x;}// cif 9
int CIFtire(int x){PORTB = B11111111; PORTD = B11111100; digitalWrite(8, LOW); return x;}// cif tire - тире "-"
int CIFdp(int x){PORTB = B11111111; PORTD = B11111100; digitalWrite(9, LOW); return x;}// cif DP - точка десят. 
  int tim=2;
  int x; int y; int a; int b;//пустые переменные для вызова Подпрограмм-Функций 
  int kn; //kn - Кнопка подключ на порт А6, резист 10кОм 5В, нажал - масса на А6
  int R; int i; int j;
  int RZ4=13; int RZ3=12; int RZ2=11; int RZ1=10;// - разряды дисплея. R13-старший, слева.
int R4;int R3;int R2;int R1;// хран времени счета в сек, сек/10, сек/100, сек/1000.
//
int SIMB(int a){   //сопоставляет числу R его образ CIF.. и светит на Дисплее
if (R==0){y=CIF0(x); digitalWrite(RZ4-i, LOW); delay (tim);}
if (R==1){y=CIF1(x); digitalWrite(RZ4-i, LOW); delay (tim);}
if (R==2){y=CIF2(x); digitalWrite(RZ4-i, LOW); delay (tim);}
if (R==3){y=CIF3(x); digitalWrite(RZ4-i, LOW); delay (tim);}
if (R==4){y=CIF4(x); digitalWrite(RZ4-i, LOW); delay (tim);}
if (R==5){y=CIF5(x); digitalWrite(RZ4-i, LOW); delay (tim);}
if (R==6){y=CIF6(x); digitalWrite(RZ4-i, LOW); delay (tim);}
if (R==7){y=CIF7(x); digitalWrite(RZ4-i, LOW); delay (tim);}
if (R==8){y=CIF8(x); digitalWrite(RZ4-i, LOW); delay (tim);}
if (R==9){y=CIF9(x); digitalWrite(RZ4-i, LOW); delay (tim);}; return a;
}

void setup() {
 //port D: 7  6  5  4  3  2  1  0 - номера порта D
//PORTB=B  f  e  d  c  b  a  Rx Tx - сегменты a-f
//PORTD=B  1  1  R4 R3 R2 R1  . g  - сегменты d,дес тчк "."
 //port D:      13 12 11 10  9  8 - номера порта D
  //настройка портов D, B
DDRD=DDRD | B11111100;// D7-D2 выходы, Rx,Tx не трогаем
DDRB=DDRB | B00111111;// B7,B6 не трогаем, B5-B0 выходы
// Serial.begin(9600);   // Serial.println(...); -рудимент для контроля в процессе..
}
void loop() {
start: y=GASH(x);  delay(500);                    
y=CIFtire(x); digitalWrite(RZ4, LOW); digitalWrite(RZ3, LOW); digitalWrite(RZ2, LOW); 
                      digitalWrite(RZ1, LOW); // "----" - старт, начало отсчета времени в мс
MR4: R4=0;
MR3: R3=0;
MR2: R2=0;
MR1: R1=0;
MKN: kn=analogRead(A6); if(kn<500){goto MEND;}//Кноп Нажата, выходим из счета
     delayMicroseconds(885);// Кноп Не Нажата, отсчет идет. 885мкс - экспериментально
     R1=R1+1;  if(R1>9){goto RR2;}    
     goto MKN;
RR2: R2=R2+1;  if(R2>9){goto RR3;}
     goto MR1;
RR3: R3=R3+1;  if(R3>9){goto RR4;}
     goto MR2;
RR4: R4=R4+1;  if(R4>9){goto start;}  
     goto MR3;
MEND: y=GASH(x);//гасим "----"
RASTR:  j=250;//регулир.длительность свечения Результата  - около 2с
RA2:    i=0; 
        y=CIFdp(x); digitalWrite(RZ4, LOW); delay(3);// десят.точка в левом разряде
        R=R4; b=SIMB(a); i=i+1;//
        R=R3; b=SIMB(a); i=i+1;
        R=R2; b=SIMB(a); i=i+1;
        R=R1; b=SIMB(a); i=i+1;
        j=j-1; if (j>0){goto RA2;}
    y=GASH(x); //  гасим паразитные остатки сегментов 
     delay(1500);//время возврата к СТАРТу
}

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Да уж, учиться, учиться и учиться.. :)

Да всё нормально, для первого раза пойдет, но еще пахать и пахать просторы знаний.
Из самых больших минусов - это привязка к тактовой частоте МК. Можно было проще, вывести на экран минусы, считать millis1, потом, при нажатии кнопки, снова считать millis2, вычесть millis1 из millis2 и получить реальное время в мс, которое и вывести на ЛЕДы.

Но не ленив - это точно. :)

Удачи! И новых открытий!

 

com
Offline
Зарегистрирован: 06.09.2013

имхо самый большой минус - использование goto

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

com пишет:

имхо самый большой минус - использование goto

Что такое goto по сравнению с привязкой к частоте работы МК, да ерунда.

Думаю будет уместно на эту тему оставить здесь ссылку http://pic24.ru/doku.php/osa/articles/encoding_without_errors#

Рекомендую почитать всем. Про goto там тоже есть. Со статьёй согласен на 99.9%

 

sasa999
Offline
Зарегистрирован: 21.03.2014

к частоте привязал, goto  расставлял, каюсь, я не профи. лепил из того что было. работает, однако, не сбоит, уверен что и не сбойнет.  спасибо за критику. вопросы есть.

int CIF3(int x){PORTB = B11111111; PORTD = B11000000; digitalWrite(8, LOW); return x;}// cif 3 - так я создаю образ цифры 3, например, остальные аналогично. нельзя ли как то попроще покомпактней? два порта сразу раздражают. в PIC было по-байтно по-портно, там RX TX не было. побитно писать тоже лень, много операторов набегает типа digitalWrite(8, LOW) 

-
int SIMB(int a){   //сопоставляет числу R его образ CIF.. и светит на Дисплее
32 if (R==0){y=CIF0(x); digitalWrite(RZ4-i, LOW); delay (tim);}
3

if (R==1){y=CIF1(x); digitalWrite(RZ4-i, LOW); delay (tim);}... и т.д. по другому не смого придумать, тяжеловат и долог алгоритм выведения образа на дисплей. попроще можно, чтоб образ один раз изъялся из CIF0-CIF9 и крутился в коротком цикле без обращения к SIMB(int a) со многими if-ми? на PIC я быстро разобрался ассемблером по-байтно, а здесь что-то не задалося..

- если время мерить millis2-millis1 то огромное двоичное число получается типа B000111010...  , как его потом в десятичное переделать, да еще в образы в 4 разряда запихать? готовые подпрограммы перевода одного в другое надо? не потянул..

но я же выкрутился из положения. я такой алгоритм еще на PIC делал

как я понимаю millis по-сути встроенный таймер, да, типа WDT что-то? сильная вещь, надо брать.

sasa999
Offline
Зарегистрирован: 21.03.2014

Всем привет. Есть дисплей ЖК Nokia3310 на контроллере PCD8544. Скетч первый работает, пишет " Time, sec "секунды считает .

#include <PCD8544.h>

static PCD8544 lcd;
void setup() {  lcd.begin(84, 48);
}

void loop() {
  static int cnt = 0;
  lcd.setCursor(0, 0);  lcd.print("   Time, sec");
  lcd.setCursor(1, 2);  lcd.print(millis()/1000);
  cnt++;
  }

В втором скетче ниже подключаю граф.библ. U8glib, а таймер удаляю за ненадобностью, хочу нарисовать графич.примитивы.

#include <PCD8544.h>
#include <U8glib.h>
U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8);    // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8

void setup() {
}

void loop() {
  u8g.drawPixel(20, 30);
  u8g.drawHLine(5, 10, 20);
  u8g.drawBox(5, 10, 20, 10);
  }

 - ничего не рисует, дисплей пустой. Компиляция проходит норм, не ругается. Как нарисовать Пиксель, Линию, Прямоуголь., Круг и пр.? Исправьте, пожалуйста, второй скетч.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

sasa999 пишет:
С++ лажу гонит?

да и русский язык часто переходит в мат :)

sasa999
Offline
Зарегистрирован: 21.03.2014

я про рисовалку, а не про мат

sasa999
Offline
Зарегистрирован: 21.03.2014

чего не хватает в скетче, почему не рисует? Библ.вроде подключилась, контроллер 8544 тоже, компиляция выполнена. Рисунков нет. Пожалуйста, доработайте.

sasa999
Offline
Зарегистрирован: 21.03.2014

Спасибо всем кто ел. А готовить любойможет. ще вопрос. Гружу любой скетч, даже самый простой в Ардуину. Начинается вроде загрузка, даже пишет "Загрузка выполнена".  а потом вылетает надпись Оранж.цвета внизу окна компиляции:

avrdude: stk500_getsync(): not in sync: resp=0x00  , в результате ничего никуда не грузнулось, Ардуинка не работает по новозалитому скетчу, а быстро моргает 13-диодом, вот и все. ЧТо это? Поломалсь Ардуинка? Заменить на новую?

 

vladk
Offline
Зарегистрирован: 24.04.2014
sasa999
Offline
Зарегистрирован: 21.03.2014

Подскажите, как быстро и просто вывести набор 1 и 0 в порты D2-D12 (десять PINов)
одной командой в одну строку. Побитно выводить слишком громоздко ,типа digitalWrite(12, 0),
digjtalWrite(11, 1), ... неудобно.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

sasa999 ,

http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry

называйте пины пинами , а группу пинов - портом

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Одной командой разве можно? Минимум 2. У меня получилось 3. Если взять входы с 3-го по 12й (что-б 10 было) то можно так:

n=1023;// некое число от 0 до 1023 (10 бит), если "0" -на всех выводах "0", если "1023" -то на всех "1"
PORTD= n&B11111000; //биты 0..3 не занимать
n=n>>5;//что-б записать старший байт нужно подвинуть младший
PORTB=n&B00011111; //биты 5..7 не занимать
n=0; //на всякий случай сбросить, ибо там уже не n

 

sasa999
Offline
Зарегистрирован: 21.03.2014

вроде разобрался. точнее говоря получилось. Спасибо!

gueromamma
Offline
Зарегистрирован: 24.04.2015

Всем привет, учусь работать с Ардуино. Начал с уроков Блюма. Сделал воторой урок, вот только светодиод не меняет яркость, а горит постоянно с одинаковой яркостью. Программа вроде правильная, так как после нажатия кнопки 5 раз, светодиод отключается. Кто-нибудь может объяснить в чем проблема?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

создайте новую тему - отображающую вопрос, загрузите код.....

http://arduino.ru/forum/obshchii/sozdanie-temy
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

:)

.....потом только - вопросы

Rom327
Offline
Зарегистрирован: 25.04.2015

Здравствуйте!

Есть желание и необходимость в освоении платформы Arduino. Как минимум научиться и поиграться, как максимум построить установщик SMD компонентов. Со вторым примерно ясно: нужен комплект для 3D принтера, но на Али просят 15К за полный комплект на Mega2560 R3 . К тому же, скорее всего в лоб все собрать не получится. Поэтому вопрос: какой набор взять, чтобы научиться и в случае успеха докупить комплектующие и достич конечной цели?

sasa999
Offline
Зарегистрирован: 21.03.2014

что такое "установщик SMD компонентов"?

Rom327
Offline
Зарегистрирован: 25.04.2015

Это станок, который по программе устанавливает на печатную плату компоненты для поверхностного монтажа, именуемые SMD. Для примера и подражания - простой станок, китаец, TM220A. 2 присоcки, довольно шустрый. Шасси не сложное, похоже на фрезерный станок CNC или 3D принтер. В сети полно видео про него....(Как тут ссылку вставить? Все виснет!).