(upravil mechanik 1. 8. 2017 10:08)

Téma: 8 bit binarka a pripojenie displeja

Logické obvody som nikdy príliš nepotreboval až na tie najprimitívnejšie a v programovaní HW som tiež silne amater. Mám 8 binarne odstupnovaných LED, vlastne relé, každé 0,5db. Dá sa k tomu propojiť nejaky logický obvod a na ten následne displej, tak že by som mal každý jeden stupeň zobrazený? Logicky predpokladám že to pôjde len na 7 segmentový LED displej. Idealne by to bolo s krokom 0.5 do 127.5 alebo aspoň po celých číslach od 1 po 255. Rady typu naprogramuj si to nechcem. Keby som si to vedel naprogramovať nehladal by som na to logický obvod... big_smile Ale keby sa našiel niekto ochotný poradiť aký vybrať displej a ako upraviť program v arduine na zobrazenie stupnice tak by to bolo super smile Ďakujem.

Re: 8 bit binarka a pripojenie displeja

A tohle jsi zkoušel ?

https://www.google.nl/search?q=8+bit+to … wQKP8rDACw

Re: 8 bit binarka a pripojenie displeja

čau no pokud bys to chtěl řešit softwarově tak klidně napiš tohle bude nejspíš dost jednoduché

(upravil mechanik 1. 8. 2017 15:40)

Re: 8 bit binarka a pripojenie displeja

Uvažoval som nad tým a asi to radšej urobím poriadne s LCD...   https://www.arduino.cc/en/Tutorial/HelloWorld   len zatial neviem ako to implementovať do programu big_smile Kedže ten nemá rozpísaných celých 255 možností a ja by som potreboval priradiť hodnotu na LCD ku každej jednej...

ythren, dík, už ti píšem...

Re: 8 bit binarka a pripojenie displeja

a jako proč? stačí přece něco úplně hloupýho, jako třeba:
int zobraz=0;
if DigitalRead(1) then zobraz=zobraz+1; if DigitalRead(2) then zobraz=zobraz+2;  if DigitalRead(2) then zobraz=zobraz+4; .....
lcd.print (zobraz)

je to to první co mě napadlo, jistě to jde i elegantněj. Pokud každé té hodnotě odpovídá nějakej údaj v dB a není to lineárně, tak by tam ještě musel být převod přes proměnnou typ pole
tab=(-64,-63,-62,-60,.......)
zobrazdb= tab(zobraz);
lcd.print(zobrazdb);
lcd.print(" dB")

kde se potom zobrazí hodnota z odpovídající pozice pole, pozor, index je od 0 (rozepnutý všechny kontakty)
ale když to má být pěkný, tak LCD určitě ne, spíš OLED nebo VFD. Ale na pokusy to lcd stačí. Je to dnes nejlevnější zobrazovač, Arduino nano + lcd +I2C převodník k displeji vyjde na cca 100Kč...
doporučuju na displej I2C, ušetříš si tím hodně vývodů na procesoru.
Ostatně, neměl by ten procesor zrovna ovládat ten R-2R atenuátor? a co DO, ovládání přes bluetooth, wifi? To by chtělo udělat zrovna na úrovni, když to chceš kvalitně.
Tady je ukázka jenom web rozhraní k ovládání soláru k bazénu: tady je ukázka - stačí kliknout na střed vrtulky a pak nastavit nucenou dobu chodu čerpadla, nebo je vypnout. Tohle všechno je naprogramovaný v ESP8266 (2USD) přes arduino IDE. P.S. v roce 2014 jsem se tomu taky bránil, ale dnes to jinak nejde.
Nejzajímavější je, že na tom ovládání bazénu je nejdražší krabička IP66 s průhledným deklem, teplotní čidla  a zásuvka IP44, to několikrát převyšuje cenu použité elektroniky. Byla to jenom evoluce rozdíl. termostatu s arduinem uno.

(upravil mechanik 1. 8. 2017 20:09)

Re: 8 bit binarka a pripojenie displeja

Dík za odpoveď. Je to pre mna všetko nové... V jednoduchej slučke sa zorientujem s prehladom. Pozeral som aj na "remote control" a rôzne veci a ked vidím už napísaný program, celkom tomu rozumiem big_smile

Ten vrchný kód s tymi "if". Tam by som mohol dať aj +0,5? Jeden krok pri mne odpovedá útlmu 0,5db. Odstupňované to bude linearne po 0,5db. Nepotrebujem to pri vysokých hodnotách útlmu viac na hrubo a potom jemnejšie.

Ano, je to na R-2R a nejaky rozumný displej s I2C by sa fakt velmi hodil a dialkové by som tiež chcel. Ono HW si navrhnúť viem. Schému a DPS som už začal kresliť. V HiFi si viem navrhnúť zhruba všetko len to ovládanie a komfort ma hrozne brzdia. Bez programovania to nejde. Ked postavím akokolvek kvalitný DAC a R-2R tak bez displeja, bez DO a iných vecí to proste nie je komfortné ani kompletné. Ovládanie cez blue tooth a Wifi je sice zaujímavé ale vystačím si bez toho, minimálne zatial.

Re: 8 bit binarka a pripojenie displeja

desku nekresli, napřed to musí fungovat na bastldesce, potom se řeší HW, to je úplně naopak. Protože třeba místo displeje I2C dáš SPI a jsi v pasti. Místo potenciometru rotační enkodér a zase je všechno k ničemu... vstup DO zapojíš omylem na pin, na kterým nelzae použít přerušení...

Jeden krok 0.5dB, ale je tam celkem 256 hodnot, nebo ne?
takže rozsah regulace je 128dB? ale nejnižší číslo není 0 ale -128, je tak? potom je potřeba trochu matematiky: float zobrazdb=-128+float (zobraz)/2


a nestačilo by to na konci vydělit dvěma? - pozor, desetinný číslo potom musí být deklarovaný jako float, ne int, a můžou nastat problémy se zobrazením na displeji, ale to je potřeba si s tím pohrát, teoreticky to ani neumím přesně popsat.  Ta druhá deklarace float je přetypování, to mě stálo asi tři noci, než mě jakási blbost začla chodit správně.
Prostě kup si arduino za pár korun, displej, a nějaký periferie a máš na půl roku po nocích co dělat...

Re: 8 bit binarka a pripojenie displeja

a nebylo by rychlejší použít program z lcduina a překopat program na nkodér místo potenciometru ? 
http://www.amb.org/audio/lcduino1/

(upravil mechanik 1. 8. 2017 22:11)

Re: 8 bit binarka a pripojenie displeja

Arduino Uno tu mám už nejake roky. Sám som si programoval soft start a také drobnosti. Pre srandu posielam big_smile


// constants won't change. They're used here to
// set pin numbers:
const int buttonPin = 13;     // the number of the pushbutton pin
const int Rele1 =  11;      // the number of the LED pin
const int Rele2 =  10;      // the number of the LED pin
const int ledPin =  12;      // the number of the LED pin

// variables will change:
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin
int stateFlipFlop = 0;        // stav preklapacieho obvodu T
int _step = 0;

// the following variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long lastDebounceTime = 0;  // the last time the output pin was toggled
long debounceDelay = 50;    // the debounce time; increase if the output flickers

void setup() {
  // initialize the LED pin as an output:
  pinMode(Rele1, OUTPUT); 
  pinMode(Rele2, OUTPUT); 
  pinMode(ledPin, OUTPUT);   
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);     
 
 
  int buttonState_1 = HIGH;
  int buttonState_2 = LOW;
 
}

void loop(){

  int reading = digitalRead(buttonPin);

// If the switch changed, due to noise or pressing:
  if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }
 
  if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer
    // than the debounce delay, so take it as the actual current state:
    buttonState = reading;
  }
 
  // set the LED using the state of the button:
  // zmen stav PO T
  switch(stateFlipFlop){
    case 0:
      if (buttonState == HIGH){
        stateFlipFlop = 1;
       
        digitalWrite(ledPin, HIGH);
        delay(500);
        digitalWrite(ledPin, LOW);
        delay(500);     
        digitalWrite(ledPin, HIGH);
        delay(500);
        digitalWrite(ledPin, LOW);
        delay(500);
        digitalWrite(ledPin, HIGH);
        delay(500);
        digitalWrite(ledPin, LOW);
        delay(500);     
        digitalWrite(ledPin, HIGH);
        delay(500);
        digitalWrite(ledPin, LOW);
        delay(500);
        digitalWrite(ledPin, HIGH);
        delay(500);
        digitalWrite(ledPin, LOW);
        delay(500);
       
        digitalWrite(Rele1, HIGH);
        digitalWrite(ledPin, HIGH);
        delay(500);
        digitalWrite(ledPin, LOW);
        delay(500);
        digitalWrite(ledPin, HIGH);
        delay(500);
        digitalWrite(ledPin, LOW);
        delay(500);
        digitalWrite(ledPin, HIGH);
       
        digitalWrite(Rele2, HIGH);
      }
    break;
    case 1:
      if(buttonState == LOW){
        stateFlipFlop = 2;
        delay(25);
        digitalWrite(Rele1, HIGH);
        digitalWrite(Rele2, HIGH);
       
        digitalWrite(ledPin, HIGH);
       
      }
    break;
    case 2:
      if(buttonState == HIGH){
        stateFlipFlop = 3;
        delay(25);
        digitalWrite(Rele1, LOW);
        digitalWrite(Rele2, LOW);
        digitalWrite(ledPin, LOW);
       
      }
    break;
    case 3:
      if(buttonState == LOW){
        stateFlipFlop = 0;
        digitalWrite(Rele1, LOW);
        digitalWrite(Rele2, LOW);
        digitalWrite(ledPin, LOW);
       
      }
    break;
  }
 

  // save the reading.  Next time through the loop,
  // it'll be the lastButtonState:
  lastButtonState = reading;
 

}


Tuším že to blikanie ledky by išlo urobiť elegantnejšie cez nejaky jeden "špecialny" riadok big_smile Okrem toho, občas ten soft start nejde vypnúť big_smile To som zistil po pár mesiacoch používania big_smile Ale dosť možné že je problém v predzosilňovači, v jeho programe. Ten robí "spúšť" cez LED v optočlene.

Iba že dosku si viem nakresliť a bolo to len na hrubo... To riešiť nechem, proste som sa nudil, tak som si vytvoril púzdro, pomenoval piny, dal tam stabilizátory, rozmiestnil tlačítka a tak... big_smile Pochopitelne detaily ako piny som nepripájal dalej.

Začínať by to malo na -127,5db a končiť na 0db a nemalo by to prechádzať z -127,5 na 0 do okola big_smile

Uff, pol rok po nociach. To je dosť sad Ja už 8 rokov robím po nociach komplet vlastné HiFi big_smile Rád by som to do konca života stihol aj s tým D class a spínaným zdrojom big_smile Reprobedne som aj striekal a frézoval...

pslava: ja by som to na encoder prepísať asi nevedel a tiež ktovie čo všetko iné by to ešte chcelo prepísať.

(upravil kaed 1. 8. 2017 22:51)

Re: 8 bit binarka a pripojenie displeja

jo, stačí si prohlídnout třeba příklad blink without delay, a třeba taky něco o cyklech, třeba for nebo while...
ještě by mě zajímalo, co říká překladač na tohle: "int lastButtonState = LOW;" číslo integer je číslo, tady by asi měl být typ boolean...

a je to problém s tím -127.5, potom, co jsem napsal?  float zobrazdb=-127.5+float (zobraz)/2

a to hifiduino je tohle celý hotový, včetně dálkáče a ovládání toho r-2r, netřeba vymějšlet vymyšlený.

Re: 8 bit binarka a pripojenie displeja

Mohol by si poslať odkaz na to hifiduino? Pozrel by som sa či je to pre mna použitelné.

(upravil kaed 2. 8. 2017 0:24)

Re: 8 bit binarka a pripojenie displeja

stačí použít google:
atenuátor
http://www.eijndhoven.net/jos/attenuato … index.html
http://www.instructables.com/id/Arduino … ator-and-/
http://www.amb.org/audio/lcduino1/

když vidím, jak je ten atenuátor jednoduchej, tak to možná ještě změním ve svým předzesu místo alpsu s motorem. Akorát to chce do eeprom mít možnost uložit nějakou default hlasitost, aby se dala uživatelsky měnit.

(upravil mechanik 2. 8. 2017 0:51)

Re: 8 bit binarka a pripojenie displeja

Nechápem komu môže stačiť útlm 63db. Ja potrebujem ked regulujem cez foobar2000 okolo 90db, na uplné ticho viac... Tak google som samozrejme skúšal. Ten prvý projekt má len 6 relé po 1db a vôbec nemá displej. Takže by sa to muselo dosť preprobiť. To od AMB vyzerá lepšie ale ked dobre vidím nemá to encoder ale potenciometer s motorom. celkom šlialená kombinácia. Takže je otázka či nie je lepšie urobiť to od základu.

Asi to skúsim zobrať postupne. Do môjho programu čo už mám doplním tie riadky pre LCD a nechám tam pre začiatok celé čísla a 255 krokov. Displej by som volil SPI, je perfektné že to má len 2 vodiče. Displej by som teda skúsil rovno OLED a LCD preskočil. Po tom čo skončím s pokusmi si ho aj tak nechám pre "final". Myslím že tento by mohol byť dobrý   http://www.tme.eu/sk/details/eaw162-x3l … 162-x3lw/#   .Netvrdím že sa nič lacnejšie nenájde ale nemám chuť kvôli tomu riešiť ebay, paypal, účty a čakať na free shipping. Z TME to mám hned doma za poštovné 2,9e a tiež je vysoká prevdepodobnosť že za rok si tam môžem kúpiť ten istý.

Takto vyzerá môj program čo sme robili s kamarátom SW programátorom. Ako ythren potvrdil, nie je napísaný najštastnejšie. Ale funguje big_smile


// constants won't change. They're used here to
// set pin numbers:
const int buttonPinUp = 13;     // tlacitko up
const int buttonPinDown = 11;     // tlacitko down
const int ledPin1 =  9;      // the number of the LED pin
const int ledPin2 =  10;      // the number of the LED pin
const int ledPin3 =  12;
const int ledPin4 =  8;
const int ledPin5 =  7;
const int ledPin6 =  6;
const int ledPin7 =  5;
const int ledPin8 =  4;

const int ochrana = 100;

// variables will change:
int buttonStateUp;             // the current reading from the input pin
int buttonStateDown;             // the current reading from the input pin
int lastButtonStateUp = LOW;   // the previous reading from the input pin
int lastButtonStateDown = LOW;   // the previous reading from the input pin
int stateLed = 1;        // stav - kolko lediek bude svietit
int maxLed = 255;        // stav - kolko lediek bude svietit
int _step = 0;


// the following variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long lastDebounceTimeUp = 0;  // the last time the output pin was toggled
long lastDebounceTimeDown = 0;  // the last time the output pin was toggled
long lastOchrana = 0;  // the last time the output pin was toggled
long debounceDelay = 50;    // the debounce time; increase if the output flickers

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin1, OUTPUT); 
  pinMode(ledPin2, OUTPUT); 
  pinMode(ledPin3, OUTPUT);   
  pinMode(ledPin4, OUTPUT);   
  pinMode(ledPin5, OUTPUT);   
  pinMode(ledPin6, OUTPUT);   
  pinMode(ledPin7, OUTPUT);   
  pinMode(ledPin8, OUTPUT);   

  // initialize the pushbutton pin as an input:
  pinMode(buttonPinUp, INPUT);
  pinMode(buttonPinDown, INPUT);     
 
 
  int buttonState_1 = HIGH;
  int buttonState_2 = LOW;
 
}

void loop(){

  int readingUp = digitalRead(buttonPinUp);
  int readingDown = digitalRead(buttonPinDown);

// If the switch changed, due to noise or pressing:
  if (readingUp != lastButtonStateUp) {
    // reset the debouncing timer
    lastDebounceTimeUp = millis();
  }


  if (readingDown != lastButtonStateDown) {
    lastDebounceTimeDown = millis();
  }
 
 
 
  if ((millis() - lastDebounceTimeUp) > debounceDelay) {
    if(lastOchrana+ochrana < millis() && readingUp == HIGH && stateLed < maxLed){
      stateLed++;
      lastOchrana = millis();
    }
  }

  if ((millis() - lastDebounceTimeDown) > debounceDelay) {
    if(lastOchrana+ochrana < millis() && readingDown == HIGH && stateLed > 0){
      stateLed--;
      lastOchrana = millis();
    }
  }
 
  //Ledka 1:
  if(stateLed % 2 == 1){
    digitalWrite(ledPin1, HIGH);
  }else{
    digitalWrite(ledPin1, LOW);
  }

  //Ledka 2:
  if((stateLed / 2) % 2 == 1){
    digitalWrite(ledPin2, HIGH);
  }else{
    digitalWrite(ledPin2, LOW);
  }

  //Ledka 3:
  if(((stateLed / 2) / 2) % 2 == 1){
    digitalWrite(ledPin3, HIGH);
  }else{
    digitalWrite(ledPin3, LOW);
  }

  //Ledka 4:
  if((((stateLed / 2) / 2) / 2) % 2 == 1){
    digitalWrite(ledPin4, HIGH);
  }else{
    digitalWrite(ledPin4, LOW);
  }

  //Ledka 5:
  if(((((stateLed / 2) / 2) / 2) / 2) % 2 == 1){
    digitalWrite(ledPin5, HIGH);
  }else{
    digitalWrite(ledPin5, LOW);
  }

  //Ledka 6:
  if((((((stateLed / 2) / 2) / 2) / 2) / 2) % 2 == 1){
    digitalWrite(ledPin6, HIGH);
  }else{
    digitalWrite(ledPin6, LOW);
  }

  //Ledka 7:
  if(((((((stateLed / 2) / 2) / 2) / 2) / 2) / 2) % 2 == 1){
    digitalWrite(ledPin7, HIGH);
  }else{
    digitalWrite(ledPin7, LOW);
  }

  //Ledka 8:
  if((((((((stateLed / 2) / 2) / 2) / 2) / 2) / 2) / 2) % 2 == 1){
    digitalWrite(ledPin8, HIGH);
  }else{
    digitalWrite(ledPin8, LOW);
  }



  // save the reading.  Next time through the loop,
  // it'll be the lastButtonState:
  lastButtonStateUp = readingUp;
  lastButtonStateDown = readingDown;
 

}

Zatial som to skúšal len s LEDkami, takže nevadilo že "hrá" na plno big_smile

Re: 8 bit binarka a pripojenie displeja

Jestli jsem četl správně, tak si chtěl SPI displej (Citace : Displej by som volil SPI, je perfektné že to má len 2 vodiče...)
Ten uvedený je  "klasika" INTEGRATED CONTROLLER (HD44780-LIKE): INPUT 4- OR 8-BIT DATA-BUS, 3 CONTROL-WIRES(R/W, E, RS)

Asi si chtěl I2C... např.: https://arduino-shop.cz/arduino/1480-ii … gIp8fD_BwE

Re: 8 bit binarka a pripojenie displeja

Správne I2C, písal som to pred druhou ráno...

Re: 8 bit binarka a pripojenie displeja

najdi si jak na rotační encodér, a dej to místo tlačítek, tlačítka byly v mě v 80-tých letech.
ten inzerovanej I2C OLED od zuki je grafickej, to je trochu vyšší dívčí, a při takovým způsobu programování jako máš ty, se nevlezeš do paměti ani u arduina mega...
Přidat dva stupně na atenuátoru, to nevidím jako velkej problém. Ale jak kdo chce.
AME tam samozřejmě má i ovládání atenuátoru, aby ušetřili piny, co zaplácali displejem, tak mají na relátka posuvnej registr, taky celkem dobrý řešení,  ale jinak o šílenosti konstrukce žádná...
K displeji z TME pro připojení na i2c potřebuješ ještě tohle: http://www.ebay.com/itm/IIC-I2C-Interfa … SwLsBZPgRh a jenom ten 4x20znaků má piny co přímo pasují na tohle, což je jeden ze dvou standartních konektorů LCD.
tady to máš komplet io s lcd 16x2 znaky: http://www.ebay.com/itm/IIC-I2C-SPI-TWI … 0005.m1851

Re: 8 bit binarka a pripojenie displeja

kaed napsal:

aby ušetřili piny, co zaplácali displejem, tak mají na relátka posuvnej registr, taky celkem dobrý řešení,  ale jinak o šílenosti konstrukce žádná...

tahle šílenost se používá (la) ve spotřebce běžně, Panasonic dával do hifi systémů BU2090 serial/paralel pro 12 bit výstup přímo určený pro takové aplikace.

(upravil mechanik 2. 8. 2017 14:30)

Re: 8 bit binarka a pripojenie displeja

Tiež už by som tam žiadne logické obvody nedával ale radšej väčší MCU. Potreboval by som kompletný OLED s I2C vývodmi dostupný v tme, sos, mouser a podobne.

Divné, ku všetkým väčším OLED je vždy datasheet kde tomu pomenovaniu pinov presne nerozumiem. K tým lacným, malým LCD, čo nechcem je potom pekný datasheet, je to vrátane I2C a je tam znázornené ako to zapojiť   http://www.tme.eu/sk/Document/ff9668f47 … 104B-A.pdf   nádhera smile

Ideálny by bol encoder cez panel a keby som išiel cez DO tak tlačítka. No zatial sa uspokojím aj s tlačítkami celkovo.

Re: 8 bit binarka a pripojenie displeja

čemu nerozumíš? prostě tu výše uvedenou destičku s pcf8574 připájíš na displej na piny 1-14 (15-16 je led podsvětlení a na vývody destičky připojíš i2c, do arduina dáš tu správnou knihovnu, co umožňuje nastavení pinů převodníku a pak už to jenom funguje. Pokud bys nevěděl jak ji připájet, koupíš si na pokusy LCD s destičkou už připájenou, viz výše.

// Nastav pro LCD piny PCF8574T a I2C addresu 0x27(PCF8574AT 0x3f)
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE );

a je jedno, jestli je k tomu připojený LCD nebo OLED, prostě standart.

Re: 8 bit binarka a pripojenie displeja

No radšej by som použil displej čo už má I2C v sebe a tiež sa vyhol nákupu z ebay a kúpil niečo tu. Píšem to v druhej vete.