Aprendendo Arduino — Parte 2 — visualizando bits

meiobit

Por muito tempo a eletrônica como um todo foi essencialmente analógica. O mundo é analógico. Existem infinitas variações entre o 1 e o 11 no volume do seu aparelho de som, se for dos antigos e usar potenciômetros. Você não salta do volume 1 para o 2, pode variar de acordo com a sua coordenação motora final. 

Já no mundo digital, binário, as coisas são ou não são. Uma porta por exemplo: ela pode estar aberta ou fechada, isso é um conceito binário. No mundo real ela pode estar entreaberta, ou se fechando, ou se abrindo.

O mundo analógico é muito mais rico, mas muito mais difícil de quantificar. Por isso os computadores chamados “analógicos” eram raros complicados e se dedicavam a tarefas específicas. Um bom exemplo de computador analógico é o Mecanismo de Antikythera, construído em 150 AC, na Grécia. Era composto de 37 engrenagens, calculava posições de corpos celestes e previa eclipses. Não, não rodava Crysis.

antikythera_mechanism_remains

Ironicamente a eletrônica analógica não tornou mais fácil a construção de computadores analógicos, computadores só se tornaram realmente úteis e versáteis com o advento da eletrônica digital, mas eu vou contar um segredo: a Eletrônica Digital não existe.

Este é um sinal analógico:

analog-signal

Ele representa uma variação de amplitude, na vertical, versus o tempo, na horizontal. Pode ser volume sonoro, voltagem tensão, intensidade de luz, não importa. há infinitas variações entre a intensidade e o tempo entre os picos e vales do sinal.

Este é um sinal digital:

51c495ebce395f1b5a000000

Presença de voltagem tensão representa um, ausência representa zero, é assim que computadores falam.

Só que não. Você nunca terá zero volts exatos, nunca terá cinco volts exatos e precisa de mecanismos para garantir o intervalo entre os pulsos, que também não sobem de zero a 5 instantaneamente. Este é um sinal digital real:

imagen_4

É definido um valor de voltagem tensão positiva representando bits 1 e o mesmo valor, mas de tensão negativa representando bits 0. Note que os valores não são absolutamente estáveis, mas não importa, não existe meio bit (ok existe e chegaremos lá). Dependendo do nível de proteção a ruído que seu circuito tenha, esse valor pode ser arbitrariamente baixo e ainda assim considerado um um, mas em essência ele é uma onda analógica ainda.

Internamente todos os componentes digitais são compostos de componentes analógicos. Capacitores, resistores, transístores, todos eles só funcionam com sinais analógicos, o próprio conceito de digital é uma abstração. Não existe um componente digital mágico, e isso vai até a mais minúscula parte de um chip. Uma célula de memória SRAM para guardar um bit utiliza quatro transístores e dois resistores. Ou seja: a imagem de abertura deste artigo é… meio bit.

Aqui um circuito básico usando dois transístores e quatro resistores para guardar um bit:


Carlos Cardoso — Um bit

Circuitos assim são a base dos componentes digitais, pois permitem que a gente utilize matemática binária, consolidada na chamada Lógica Booleana, criada em 1847 por George Boole, autor de A Análise Matemática da Lógica, e que obviamente tinha aquário em casa.

Os números binários são os números de sempre, mas representados em outra base matemática. Se você não for um famoso ex-presidente, provavelmente 10 dez dedos na mão, então não é difícil deduzir por quê quase toda cultura usa base dez.

Computadores não têm dedos, e têm excelente memória, então para eles não faz diferença que 187.958.933 em binário seja 01011001101000000011010010101. Na verdade é até mais fácil, pois suas células de memória individuais só precisam de dois estados, zero ou um.

O Arduino é um processador de oito bits, o que significa que ele manipula um byte por vez. Um byte por ter valores de 00000000 a 11111111, ou zero a 255 em decimal. E não se assuste, não há mistério em trabalhar com números binários. Primeiro, pode usar calculadora. Segundo, é conta primária.

Para converter de Binário para Decimal:

Digamos que você tem o número 11011101 e quer saber quando é em decimal. Atribua, da direita para a esquerda, o valor de 2 elevado à potência da posição do número, assim:

2726252423222120

Em decimal:

128,64,32,16,8,4,2,1

Agora é só somar os valores, se o bit em questão for 1.

11011101

1 → 128

1 → 64

0 → não soma

1 → 16

1 → 8

1 → 4

0 → não soma

1 → 1

128 + 64 + 16 + 8 + 4 + 1 = 221

E para converter de binário pra decimal? Mais fácil ainda.

Pegue o valor inicial, digamos, 221. Divida por dois, trabalhando com inteiros.

221/2 = 110, resta 1

Agora repita:

110/2, dá 55, resta 0

55/2, dá 27, resta 1

27/2  dá 13, resta 1

13/2 dá 6, resta 1

6/2 dá 3, resta 0

3/2 dá 1, resta 1

1/1 dá 1, resta 1

No um você pára. Agora pegue os restos, de baixo pra cima:

11011101 o nosso 221, em binário.

Agora imagine se em vez de você fazendo essas contas, fosse o processador. Se você entregar os valores mastigados em binário, ele tem muito menos com que se preocupar, por isso a programação de baixo nível trabalha direto com binário.

Quando se trabalha com Arduino mesmo que você não perceba, está trabalhando com código binário, bem próximo do “metal”, como costumamos falar. Vejamos o exemplo clássico do LED piscante, Hello World do Arduino. O circuito é o mais simples possível, qualquer idiota consigo montar:

blink

São dois fios um LED e um resistor de 1 kΩ, senão os 5 V vão transformar seu LED em um episódio do ElectroBOOM.

O negativo você espeta no terra, ou GND do Arduino. O positivo você espeta no pino 13 do Arduino, e a outra ponta no resistor, que por sua vez está conectado ao LED. Na IDE do Arduino você busca por exemplos / basic / blink, carrega o programa, manda executar. O LED onboard do Arduino irá piscar, e se tudo der certo você verá o LED em sua protoboard piscando também. Se não piscar, você é um idiota como eu e colocou o LED invertido. Desinverta-o.

O programa é simplíssimo:

void setup() {
 // initialize digital pin LED_BUILTIN as an output.
 pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
 digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
 delay(1000); // wait for a second
 digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
 delay(1000); // wait for a second
}

O programa-padrão no Arduino envolve duas seções príncipais: uma de setup, onde você prepara o ambiente, e uma de loop, que se repete infinitamente. No nosso exemplo acima a seção de setup tem apenas um comando:

 pinMode(LED_BUILTIN, OUTPUT);

Ele define que o pino de entrada e saída LED_BUILTIN será de saída, OUTPUT. No caso LED_BUILTIN é apenas um mnemônico, um valor pré-definido que internamente é reconhecido como o número 13. Se você escrever:

 pinMode(13, OUTPUT);

O resultado será o mesmo.

Na próxima linha significativa, dentro do loop, temos:

 digitalWrite(LED_BUILTIN, HIGH);

Esse comando indica ao Arduino para aplicar ao pino LED_BUILTIN o valor digital 1, ou HIGH.

Embora seja tecnicamente um sinal digital, nem o mais esperto dos LEDs entende isso, ou se importa. Ele vê corrente na portinha, e se acende. É uma interação entre os mundos digitais e analógicos, a mais simples de todas.

Em seguida temos o comando:

delay(1000);

É uma pausa, manda o processador esperar 1.000 milissegundos.

O comando:

digitalWrite(LED_BUILTIN, LOW);

Faz o oposto, aplica ao pino selecionado o valor digital LOW, que pode ser zero ou negativo mas meu multímetro está sem bateria e estou com preguiça de pesquisar como o Arduino protocoliza isso.

Outra pausa de um segundo, e o loop se reinicia.

Beleza, vamos complicar. E se eu quisesse usar 3 LEDs ao mesmo tempo, assim:

Vamos ligar os leds nos pinos 8, 9 e 10 do Arduino, e definir no nosso programa esses pinos como saída:

void setup() {
 // initialize digital pin LED_BUILTIN as an output.
 pinMode(8, OUTPUT);
 pinMode(9, OUTPUT);
 pinMode(10, OUTPUT);

}

Beleza, vamos fazer os três piscarem. usando o código lá de cima, o loop ficaria assim:

void loop() {
 digitalWrite(8, HIGH); 
 digitalWrite(9, HIGH);
 digitalWrite(10, HIGH);
 delay(1000); 
 digitalWrite(8, LOW);
 digitalWrite(9, LOW);
 digitalWrite(10, LOW);
 delay(1000); 

}

Não me parece muito eficiente, e olha que sou um programador porco. Deve ter um meio de acessar esses pinos ao mesmo tempo. E tem!

Lembre-se: estamos trabalhando muito próximos do metal, o ATmega328 sente o bafo na nuca. Não há complexidade desnecessária, e os vários conjuntos de pinos do Arduino estão mapeados diretamente com registradores da CPU.

Um registrador nada mais é que uma posição especial de memória, acessada diretamente pelo hardware e por isso mesmo muito, muito eficiente.

O Arduino possui registradores associados com os bancos de pinos. No caso nos interessa o registrador chamado PORTB.

Ele possui um registrado auxiliar chamado DDRB, cada um de seus 8 bits define se o pino correspondente será INPUT ou OUTPUT.

Lembra da sequência de comandos:

 pinMode(8, OUTPUT);
 pinMode(9, OUTPUT);
 pinMode(10, OUTPUT);

Em vez dela podemos usar:

DDRB = B00000111;

0 é INPUT, 1 é OUTPUT.

(você deve ter notado que não existem pinos 14 e 15. Eles são conectados ao cristal oscilador e não são usáveis por nós)

Agora a sequência:

digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);

Como isso ficaria usando um registrador? Fácil:

PORTB=B00000111;

E apagar os LEDs seria…

PORTB=B00000000;

O programa inteiro agora é…

void setup() {

DDRB = B00000111;

}

void loop() {

PORTB=B00000111;
delay(1000);
PORTB=B00000000;
delay(1000);
}


Carlos Cardoso — Teste de LEDS

Vamos ser MAIS ambiciosos? Temos 3 bits em sequência associados a 3 LEDs. Vamos construir então um contador binário, indo de 000 a 111, ou 7 para macacos pelados que inventaram matemática com base em seus dedos. Você não, presidente.

Primeiro, ANTES do setup definimos uma variável global. Precisamos de um inteiro. No começo do programa, criamos:

int jorge;

Agora no setup determinamos que os pinos 8, 9 e 10 serão OUTPUT:

void setup() {

 DDRB = B00000111;

}

No loop vamos usar uma extrutura de FOR/NEXT, que executa um loop um determinado número de vezes:

void loop() {
 
 for (jorge = B000; jorge <= B111; jorge++) {
  PORTB = jorge;
  delay(500); 
 }
}

A linha diz para executar o loop começando com a variável jorge com o valor binário de 000, executar enquanto ela for menor ou igual a 111, e a cada iteração, adicionar 1 ao valor de jorge. Em linguagem C o operador ++ significa incremento unitário.

O próximo comando atribui ao registrador PORTB o valor de jorge.

byte

O programa usou 11 bytes de RAM e 644 bytes de FLASH para criar um contador binário, acessar portas de saída e gerar um display. Vai, faz isso em Java…


Carlos Cardoso — Contador binário usando 11 bytes de RAM


Leia também:

Relacionados: , , , , , , ,

Autor: Carlos Cardoso

Entusiasta de tecnologia, tiete de Sagan e Clarke, micreiro, hobbysta de eletrônica pré-pic, analista de sistemas e contínuo high-tech. Cardoso escreve sobre informática desde antes da Internet, tendo publicado mais de 10 livros cobrindo de PDAs e Flash até Linux. Divide seu tempo entre escrever para o MeioBIt e promover seus últimos best-sellers O Buraco da Beatriz, Calcinhas no Espaço e Do Tempo Em Que A Pipa do Vovô Subia.

Compartilhar
  • Se eu cortar o LED na metade, terei um Meio Bit?

    • Meio foton.

      • Depende, se cortar na horizontal fica com meio bottom (DSCLP)

    • Bem LED é um Diodo… Se cortar no meio vira um Monodo, portando um LEM, Light Emitting Monode.

      Ciência cara, ela funciona.

      • Paulo Bernardi

        +1 só pelo “Monodo”!

        Faltando complementar que ele é um componente de um pino só!

      • Mas um diodo deixa apenas a corrente elétrica trafegar numa direção. O monodo faz o que? Corta os elétrons no meio?

        • Ora mas não é evidente? Ele faz 3x menos que um triodo.
          Ainda assim é mais útil que um anodo.

        • Nilton Pedrett Neto

          Fissão nuclear à frio.

  • Erick Lucena

    “qualquer idiota consigo montar” XD

  • Gabriel Gomes

    A série está ficando excelente!

  • Luiz Rodrigo Martins Barbosa

    Isso tá ficando muito bacana!! Parabéns!

  • Fabrizio Leal Freitas

    Excelente artigo, espero que seja o segundo de uma série longa. Só faltou a piadinha clássica: “existem 10 tipos de pessoas, as que entendem binário e as que não entendem”.

    • Alexsandre Avila

      Toma meu like !!

  • Lucas Timm

    Amo todos esses conceitos.

    • Tiago S

      Eu também, apesar de não entender nenhum.

  • O mais legal de tudo foi ter mostrado como deixar eficiente.
    Trocar

    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);
    digitalWrite(10, HIGH);

    por

    PORTB=B00000111;

    Não só economiza memória como também faz o processador executar a mesma coisa com menos instruções.
    Pode não parecer importante numa era de PCs com 16 GB de RAM e processadores de 8 núcleos, mas é.
    Principalmente quando eu vejo joguinho de Celular com 500 MB, sendo que uns 15 anos atrás nesse espaço meu PC tinha o Windows e uma caralha de jogos instalados.

    • Deni Carson de Souza

      Estou aqui te aplaudindo de pé.
      A programação hoje está muito porca, mal acostumada com o excesso de processamento disponível.
      Eu gostaria de ver todos os programadores, independente da linguagem que usam terem um pouco de raciocínio lógico e conhecimento profundo para achar alternativas mais eficientes aos seus códigos.

      • Cardoso é da velha guarda. Espremer bit em TK, TRS-80, Pocket, etc era o ‘nosso’ padrão.

        • Deni Carson de Souza

          Eu não posso dizer que sou programador, mas no curso de eletrônica fizemos uma controlador de acesso com o atmel 8252 em assembly. Tínhamos de levar tudo em consideração, memória, registradores, era fudid©. Sempre me fez ter uma visão em prol da otimização do código.

          • felipe henrique

            Exato, na época do senai tínhamos programação de microntroladores, trabalhamos com PIC escovando os bits em assembly iniciamente, cara como era foda trabalhar com todos aqueles registradores e detalhe o datasheet tinha que ficar aberto direto, quando o professor mudou pra C a gente ja estavamos ninja.
            na faculdade hj em dia e C direto na mesma aula. kkkk

    • ochateador

      Nunca perco a chance de falar para uns programadores que conheço que “o que importa é ser simples e eficiente e funcionar direito, quando mais frescuras coloca mais dor de cabeça você vai ter”.

    • Tom

      Triste é descobrir isso depois de um ano com o arduino, não que eu tenha procurado, especificamente por isso, mas também nunca tinha visto em nenhum código

    • Hoje em dia a maioria dos programadores não sabem como se calcula BigO, daí você vê a quantidade de algoritmo não otimizado por aí.

  • Rijanio

    Perdi a primeira parte, indo procurar. Muito bom o mini-curso

    • Errrr. Tem um link ali no leia também…

  • Poncherello

    “e que obviamente tinha aquário em casa”
    E logicamente não era gay.

  • Eu sempre rio fininho quando esses textos do Cardoso que tem “voltagem tensão,” pq sempre fica a dúvida (pra mim) se é de propósito, ou se foi o Laguna que passou ~corrigindo~ =P

    “a imagem de abertura deste artigo é… meio bit.” https://uploads.disquscdn.com/images/29666e6c57cf678f95118af7d3fd4a537303bb098940c22f9fc900c2c1ec052a.gif

  • Washington Martins

    Dúvida cruel: qual a capacidade de otimização do compilador da Arduino IDE? O quanto ele é bom?

  • Kaio Gonçalves

    Muito didático. Excelente!

  • Gerson Felipe Schwinn

    Muito bom o post, parabéns!

  • Xultz

    Vou dar uma sugestão prá enxugar o código um pouco mais:

    void loop()
    {
    PORTB = jorge;
    jorge++;
    jorge = jorge & 0x07;
    delay(500);
    }

    A instrução PORTB = jorge é atômica, ou seja, é executada em um ciclo de clock porque tem uma instrução prá isso (ou talvez duas, não conheço direito o assembly do AVR, talvez ele tenha que puxar jorge para um registrador primeiro).
    A instrução jorge++ também é atômica, mas talvez tenha que fazer o mesmo lance do registrador.
    A instrução jorge = jorge & 0x07 faz um mascaramento, isso garante que quando jorge incrementar de 111 para 1000, ele volte a 0, porque aquele bit 1 vai pro saco. Outra instrução atômica.
    E o delay, só Deus sabe como é implementado, talvez utilize timer, talvez um loop gastador de tempo, então não se quanto ele custa depois de compilado.

    • The xD

      Isso vai otimizar o código com certeza, mas só teve um pequeno erro aí, na verdade a única máscara que vai funcionar é a 0x7 (0000 0111 em binário). 0xF8 é (1111 1000) isso com 0000 0001 vai dar zero, ou seja, o jorge nunca vai chegar nem a 1. Se fizer com 0x80 então, a máscara é (1000 0000), essa também não vai funcionar.

      • Xultz

        Damn it, escrevi 4 linhas de código e consegui colocar um bug ali! Muito perspicaz da tua parte, você está absolutamente certo! Vou até corrigir o post prá não gerar confusão! Aquele 0x80 na verdade era prá ser 0x08, mas também está errado e… ah, deixa prá lá 🙂

        • Eu e minha sublime ignorância: leio palavras, as entendo, mas não fazem sentido para minha cabeça.
          =)

          • Xultz

            Cada macaco no seu galho. Como eu trabalho com isso há mais de 20 anos (estou velho…) tudo isso soa muito simples. Porém, quando vejo código de programação de mais alto nível, tudo parece ruído pros meus ouvidos. Objetos, heranças, lambdas, injeção de dependências (quando ouço isso sempre penso numa seringa, nunca num código), tudo isso é extremamente obscuro. Sempre penso “cacete, onde estão os byte, os bit, que complicação do além!”. Você é desenvolvedor web, então estas abstrações devem ser comuns prá você. Eu tentei aprender JavaScript há um tempo atrás (que prá você deve ser super simples), as coisas básicas como os for, os while, tudo indo beleza, até começar a aparecer as bibliotecas e todas as confusões de declarar funções anônimas, mas eu parei (por enquanto) quanto tentei aprender Angular 1. Aquilo não simplesmente o menor sentido prá mim, eu cheguei à conclusão que desenvolvedor frontend web ou é gênio, ou é masoquista…

          • Então cara, compartilho do seu pensamento.
            Na verdade meio que parei no tempo, assim digamos. Ultimamente tenho tentado acompanhar esses frameworks atuais e também acho meio confuso… Já fiz alguma coisa com backbone e agora comecei um projeto em Vue.JS, mas cada vez que leio sobre o assunto eu já começo a achar que é muita coisa pra aprender sendo que no final das contas só queria exibir um Hello World na tela rsrsrs.
            Mas a realidade atual é que toda hora surge uma novidade (diria até moda) nesse meio web e ai a gente fica maluco tentando acompanhar… admiro quem consegue.

    • PORTB++ não rola?


      void setup()
      {
      PORTB = 0;
      }

      void loop()
      {
      PORTB++;
      PORTB = PORTB & 0x7;
      delay(500);
      }

  • Xultz

    “Note que os valores não são absolutamente estáveis, mas não importa, não existe meio bit ”

    Eu fiquei especialmente com medo deste trecho, o cara publica no Meio Bit que o meio bit não existe. Universos inteiros foram destruídos por paradoxos menores que este. Ainda bem que se redimiu depois, ufa!

  • Christian Oliveira

    Escovei muito bit num DGP-80, era a plataforma do colégio, um dos trabalhos do semestre era transformar o kit num painel Led para repetir uma mensagem simples, e trocar a mensagem sempre que necessário.

    um dos primeiros programas em sala foi programar o painel para ser um relógio binário, o painel era matricial acho que 20 x 100, não lembro muito bem agora, a programação era em assembler.

    depois disso fui trabalhando com outros equipamentos e outras línguas, a maioria delas proprietárias.

  • Palmas … Palmas … Palmas … Cardoso!
    Foi a fundo na mais pura programação!
    Detalhe … O “faz isso em java” deixa os programadores “nutellas” a loucura! 🙂

    • Gustavo Rotondo

      Acha java ruim que não sabe usar

      pas

      • Java não é ruim! Não disse isso. Só é totalmente improdutiva! O que ele quis dizer no texto é que o que você faz em poucas linha usando uma linguagem qualquer, em Java faz-se o mesmo usando muito mais linhas. Em C# por exemplo dá pra fazer um CRUD em 10 minutos. Já em Java o mesmo CRUD (isso sem usar framework nenhum) leva-se quase que 1 dia para fazer!

        E, se você é um programador java, te desejo toda a sorte do mundo, pois vai precisar mesmo!

  • Esse passo a passo foi dificil pra mim. Mas a culpa é minha. Foi como um ensinar a fazer uma salada de fruta para quem não sabe o que é uma banana ou maçã. Não sei como funciona esse board branco, nem o que é o pino 13, ou porque escolheu ele.
    Pelo menos sei binário e programação. Vou tomar vergonha na cara e pesquisar mais sobre. Ainda mais com o simulador recomendado na parte 01. Não tenho nem desculpa que não tenho o Arduino.

    • André K

      O board branco se chama “Proto-Board” e é uma matriz de prototipagem. Faz uns 30 anos que não uso isso (abandonei a área) mas pelo que me lembro, há ligação elétrica na “horizontal” entre os buracos e na “vertical”, não há ligação, daí você monta os circuitos usando o esquema elétrico e essa informação da matriz. É de prototipagem pois é para fazer experimentos – os componentes são encaixados provisoriamente nos buracos e podem ser “mexidos” conforme a necessidade – e não circuitos definitivos.
      Pino 13 é um dos pinos do Arduino propriamente dito. Tem uma convenção para numerar os pinos, o “chip” tem alguma marca de identificação em uma das pontas e você começa a contar dessa ponta em sentido horário ou anti-horário – eu não me lembro mais – ou, consulte o data sheet do componente.

  • Master Chief

    Nossa, incrível, o Cardoso já até demonstrou lógica na criação desse programa. Não entendo de programação, mas acho que o contador já poderia ser feito sem reduzir o comando, deixando -> verde, delay, amarelo, delay, verde, delay, verde-amarelo, etc.
    Deixando o contador com base no pino 8 (responsável pela primeira casa de um número binário, o 2^0), você faz, literalmente, os números trabalharem para você.

  • Null

    1/1 dá 1, resta 1 ?????????? Eita! Isso nem a matemática com 9 dedos explica!

    • Null

      Alguém já descobriu como funciona esta aberração matemática?

  • Christian Vincenzi Nunes

    Em assembly de PIC acho que usaria dois bytes da RAM pra fazer esse contador. Me pergunto se é possível deixar o C otimizado como o Assembly

    loop
    incf PORTB
    loop2
    Call Delay
    movlw b’00000111′
    xorwf PORTB, w
    btfsc status, Z
    GOTO loop
    clear PORTB
    GOTO loop2

    Delay
    movlw 0xff
    movwf 0x20 ;Um byte da Ram
    movlw 0xff
    movwf 0x21 ;Outro byte da Ram

    Delay_1
    decfsz 0x20
    goto Delay_1
    movlw 0xff
    movwf 0x20
    decfsz 0x21
    goto Delay_1
    return

    • Christian Vincenzi Nunes

      loop, loop2, Delay, e Delay_1 são sub-rotinas

  • Pingback: Aprendendo Arduino — Parte 2 — visualizando bits | Notícias Legais()

  • Código otimizado usando delay. Tá bom. Todo tutorial Arduino peca sempre nas mesmas coisas :/
    Depois temos que gastar um tempo precioso treinando a moçada a programar com eficiência, limpando a sujeirada que Arduino deixa.

    Mas pra quem não vai seguir engenharia, essa atitude é louvável. Parabéns 🙂

  • André K

    “É uma interação entre os mundos digitais e analógicos, a mais simples de todas.” Foi o que pensou Kevin Flynn…

  • E para converter de binário pra decimal? Mais fácil ainda.

    De Decimal para Binário, não? 😀

  • 1/1 dá 1, resta 1

    Aqui você vai perder o pessoal, até porque a conta está errada 😀

  • Você poderia conectar o LED diretamente no pino 13 da placa (e a outra ponta no GND), sem resistor. Funciona e não queima o LED.

  • Jônatas

    Quando o artigo ficou empolgante…. acabou :-/

  • Rafael de Moura

    PARABENS! achei q iria mostrar mais do mesmo, o mesmo hello world chocho que todo mundo explica.
    Fui surpreendido novamente haha

  • Júlio

    Excelente… gostei da forma com está abordando o assunto e com uma pitada de humor. Parabéns!

  • Luis Carlos Laurenti

    Muito bom! Mas ainda da p/ diminuir de 11 p/ 9 bytes se ao invés de declarar uma variável global, declarar local dentro do
    for(int jorge = B000; jorge <= B111; jorge++)

    Gostei muito deste artigo! Fico aguardando o próximo…

  • Badbass55

    Carlos
    mais uma vez obrigado pelo artigo leve e descontraído, muito didático ahhaaahah
    Por gentileza, acho que é necessário um ajuste na frase: “Se você não for um famoso ex-presidente, provavelmente 10 dez dedos na mão,” [creio que faltou um tem por aqui não??]

    as pérolas do artigo são as meslhores sempre: ahahah
    “não não rodava Crysis” ahahahhaaah
    “voltagem” [meu professor da Etec teria uma sincope lendo essa]
    “e que logicamente tinha aquário em casa”
    “Segundo, é conta primária.” [que a escola primária não ensina apenas]
    “Vai fazer isso em Java” [rapaz isso pode dar um problema

Aproveite nossos cupons de desconto:

Cupom de desconto Locaweb, Cupom de desconto HP, Cupom de desconto Descomplica, Cupom de desconto Nuuvem, Cupom de desconto CVC, Cupom de desconto Asus, Cupom de desconto World Tennis