• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Problem z kodem zegarka Arduino

Object Storage Arubacloud
0 głosów
393 wizyt
pytanie zadane 13 lutego 2020 w Mikrokontrolery przez Marak123 Stary wyjadacz (11,190 p.)
zamknięte 14 lutego 2020 przez Marak123

Robię zegarek binarny na układzie przesuwnym 74HC595 który ma 7 diod  które działają w takim stylu

1 dioda -----  1

2 dioda ----- 2

3 dioda ----- 4

4 dioda ----- 8

5 dioda ----- 10

6 dioda ----- 20

7 dioda ----- 30

W takim stylu. Zrobiłem program który liczy od 0 do 60 i te pierwsze 4 diody dobrze pokazują a 3 kolejne wskazujące dziesiątki i mrugają tylko i się wyłączają nie wiem jak zrobić to żeby się cały czas świeciły gdy liczy na tych 4 pierwszych diodach. Ma ktoś pomysł jak coś takiego zrobić?? 

 

Oto kod;;;;;;

int clo = 5;
int lat = 6;
int dat = 7;
int resz = 0;
int a = 0;
int b = 0;
int c = 0;
int hex;
void setup()
{
Serial.begin(9600);
pinMode(lat, OUTPUT);
pinMode(dat, OUTPUT);
pinMode(clo, OUTPUT);
}
void loop() {
  for (int aa=0; aa<60; aa++)
  {
   delay(999);
  


hex = aa;
  //Moduł
 if(hex>=11 and hex<=19){
  resz = hex - 10;
  a = 2;
 }
 if(hex>=21 and hex<=29){
  resz = hex - 20;
  b = 2;
 }
 if(hex>=31 and hex<=39){
  resz = hex - 30;
  c = 2;
 }
 if(hex>=41 and hex<=49){
  resz = hex - 40;
  a = 2;
  c = 2;
  
 }
 if(hex>=51 and hex<=59){
  resz = hex - 50;
  b = 2;
  c = 2;
 }
 if(a==2){
  shiftOut(dat, clo, LSBFIRST, 16);
  digitalWrite(lat, HIGH);
 }
 else{
  digitalWrite(lat, LOW);
 }
 if(b==2){
  shiftOut(dat, clo, LSBFIRST, 32);
  digitalWrite(lat, HIGH);
 }
 else{
  digitalWrite(lat, LOW);
 }
 if(c==2){
  shiftOut(dat, clo, LSBFIRST, 64);
  digitalWrite(lat, HIGH);
 }
 else{
  digitalWrite(lat, LOW);
 }
 if(resz>0){
  digitalWrite(lat, LOW);
  shiftOut(dat, clo, LSBFIRST, resz);
  digitalWrite(lat, HIGH);
 }
  }
}

                                                 

komentarz zamknięcia: problem rowiązany
komentarz 13 lutego 2020 przez DragonCoder Nałogowiec (36,500 p.)

zegarek binarny na układzie

A 2 do 5 to 10, czy 32? Zeby zrobic pelna godzine potrzebujesz 6 diod. Kazdy z nich przedstawia jeden bit, czyli 0000 00 ( 32, 16, 8, 4 ,2, 1). A jezeli chcesz zeby ciagle swiecily, no to sprawdzaj ich stan, dodaj zmienma bool i ustawiaj ja odpowiednio. Bo high i low to nic innego jak 0 i 1. 

komentarz 13 lutego 2020 przez Marak123 Stary wyjadacz (11,190 p.)
Chcę zrobić ze nie bedzie tak jak napisałeś (1,2,4,8,16,32,64) tylko do 8 czyli(1,2,4,8) i dalej te kolejne 3 diody nie będą tak jak by binarnymi tylko 5 dioda to jest 10, 6 dioda 20, 7 dioda 30, A jeżeli chodzi o tą zmienną bool i sprawdzanie ich stanu to właśnie nie mam pomysłu jak to zrobić
komentarz 13 lutego 2020 przez DragonCoder Nałogowiec (36,500 p.)
Tworzysz zmiemma bool typu: 5 dioda swieci i robisz sb ifa i zmieniasz jej stan, w zaleznosci od warunku.

Nie zeby cos, ale zegarek nie jest wtedy binarny z powodu, ktory sam napisales, czyli diody od 5 bity przyjmuja wartosci nie standardowe.
komentarz 13 lutego 2020 przez Marak123 Stary wyjadacz (11,190 p.)
I tak nie wiem jak to zrobić patrzyłem jak działa ta zmienna ale nie wiem jak bym mógł ją wykorzystać
komentarz 13 lutego 2020 przez Marak123 Stary wyjadacz (11,190 p.)
Nie wiem czy wiesz o co mi chodzi bo zmienna bool daje tylko 1 i 0 a ja to robię na układzie przesuwnym 74HC595 który działa na liczbach binarnych i  żeby zaświecić diodę A trzeba wpisać 128, żeby zaświecić diodę B trzeba wpisać 64, żeby zaświecić diodę C trzeba wpisać 32 itd. Więc zmienna bool nie zadziała a jak próbuje to robić na ifach to dioda mryga a nie świeci się na stale w tedy kiedy liczba jest od jakiegoś przedziału do jakiegoś np. gdy będzie liczba od 10 do 19 to ma się świecić 5 dioda czyli w poleceniu binarnym sposobem trzeba będzie wpisać 16 i gdy będą się wyświetlać liczby pojedyncze np. od 1 do 9 to ma sie cały czas świecić dioda sygnalizująca ze jest to liczba od 10 do 11

 

Prawdopodobnie nie zrozumiesz tego co napisałem bo sam nie pamiętam co napisałem po już 2 linijka ale mam nadzieje ze sie domyślisz
1
komentarz 13 lutego 2020 przez DragonCoder Nałogowiec (36,500 p.)
if (hex >= 30) {
    dioda5Bool = true;
} else {
    dioda5Bool = flase;
}

i wtedy uzywasz tej zmiennej. Teraz pomysl, jak mozesz to zrobic

komentarz 13 lutego 2020 przez Marak123 Stary wyjadacz (11,190 p.)
ok pomyśle
komentarz 14 lutego 2020 przez Marak123 Stary wyjadacz (11,190 p.)

Trochę łatwiej to zrobiłem bez ustawiania stanu i jego zmiany 

//uklad
int clo = 5;
int lat = 6;
int dat = 7;
//alg
int resz = 0;
int resz2 = 0;
int hex;
void setup()
{
Serial.begin(9600);
pinMode(lat, OUTPUT);
pinMode(dat, OUTPUT);
pinMode(clo, OUTPUT);
}
void loop() {
  //////////////////////////////////////////////
  //odlicznie
  for (hex=0; hex<60; hex++){
    delay(999);
 ////////////////////////////////////////////////
    //Moduł
   if(hex>=1 and hex<=9){
     resz = hex;
   }
   if(hex>=10 and hex<=19) {
       resz2 = hex - 10;
       resz = resz2 + 16;
   }
   if(hex>=20 and hex<=29) {
      resz2 = hex - 20;
      resz = resz2 + 32;
   }
   if(hex>=30 and hex<=39) {
      resz2 = hex - 30;
      resz = resz2 + 64;
    }
   if (hex>=40 and hex<=49) {
      resz2 = hex - 40;
      resz = resz2 + 80;
    } 
   if (hex>=50 and hex<=59) {
      resz2 = hex - 50;
      resz = resz2 + 96;
    } 
   if(resz>0){
     digitalWrite(lat, LOW);
     shiftOut(dat, clo, LSBFIRST, resz);
     digitalWrite(lat, HIGH);
    }
  }
}

 

Łatwy i krótki kod ale dzięki za pomoc  

1 odpowiedź

0 głosów
odpowiedź 13 lutego 2020 przez DawidK Nałogowiec (37,910 p.)
Ciekaw jestem jak namierzasz przedstawiac np 30

a) diody: 7

b) diody 5 i 6

c) diody 6, 4 i 2

?
komentarz 13 lutego 2020 przez Marak123 Stary wyjadacz (11,190 p.)
dioda 7
komentarz 13 lutego 2020 przez DawidK Nałogowiec (37,910 p.)

Jeżeli chodzi o tą część z zegarem binarnym to tak jak napisał wcześniej DragonCoder do 60 bedziesz potrzebował 6 diod 2^6.

Możesz zrobić licznik zwiekszać o go 1 w każdej iteracji i odczytywać w pętli wartość każdego bitu od 0 do 5 dla wartości licznika. Jeżeli bit jest jedynką to zapalać odpowiednią diodę, jeżeli zerem to gasić.

W kodzie i+2 wzieło sie z tego, że diody podłączone są do pinów 2-7 a sprawdzanie bitów leci od 0 do 5.

byte counter = 0;

void setup() {
  for(int pin=2; pin<8; pin++){
    pinMode(pin,OUTPUT);
  }
}

void loop() {
  for(int i=0;i<6;i++){
    if (bitRead(counter,i) == 1){
      digitalWrite(i+2, HIGH);
    } else {
      digitalWrite(i+2, LOW);
    }
  }
  delay(1000);
  counter++;
  if (counter == 60){
    counter = 0;
  }
}

Lekie jaja zaczną się gdy pomieszasz binarnie / decymalnie. Wtedy liczenie będzie pewnie wyglądało +/- tak (po 7 wnioskuje, że chcesz zpalać największą możliwą liczbę).

0-9 binarnie,

10 decymalnie,

10 decymalnie + do 19 binarnie

20 decymalnie

20 decymalnie + do 29 binarnie

30 decymalnie

30 decymalnie + do 60 binarnie

3 razy trzebaby zerować licznik binarny przy 9 i zapalać 10, znowu przy 9 i zapalać 20, znowu przy 9 i zapalać 30 i dalej lecieć już do końca

komentarz 13 lutego 2020 przez Marak123 Stary wyjadacz (11,190 p.)
wspominałem ze robię to na układzie przesuwnym 74HC595 czyli do arduino są podłączone tylko 3 piny i jednym pinem teruje się 8 diod

https://www.tranzystor.pl/artykuly-i-schematy/arduino/arduino-rejestr-przesuwny-74hc595.html

Podobne pytania

0 głosów
1 odpowiedź 139 wizyt
pytanie zadane 4 lipca 2018 w Mikrokontrolery przez mikoh81 Obywatel (1,260 p.)
0 głosów
1 odpowiedź 197 wizyt
pytanie zadane 24 września 2020 w Mikrokontrolery przez ChiriChiri Obywatel (1,260 p.)
0 głosów
1 odpowiedź 261 wizyt
pytanie zadane 1 maja 2020 w Mikrokontrolery przez Mavimix Dyskutant (8,390 p.)

92,579 zapytań

141,432 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...