Manual

do

Maker

.

com

Quarentena Maker - Dia 3: Meu bitcoin ainda tem valor?

Quarentena Maker - Dia 3: Meu bitcoin ainda tem valor?

Achei uma moeda embaixo da mesa. Abaixei-me para pegá-la e, enquanto estava sentado no chão vendo seu brilho refletindo em meus olhos, lembrei-me que ainda havia uma esperança de eu ver dinheiro logo. Então pensei: "Meu bitcoin ainda tem valor?".

Rapidamente lavei as mãos e a moeda, e passei a monitorar o valor do bitcoin; R$32.198,28. Em alguns segundos, R$32.085,00. Observando mais tempo, R$32.201,42. Não dá. Não posso ficar o dia olhando para o valor, esperando alguns trocos na alta pra vender, ou na baixa para comprar. Tem que ser algo que valha a pena, então resolvi pôr em prática o bitcômetro. A moeda é de 50 centavos, vou deixá-la aqui para uma emergência.

Meu bitcoin ainda tem valor?

Não preciso mais olhar um monte de dígitos e dividir por 10k pra saber quanto tenho. Coloquei o bitcômetro para fazê-lo, de modo que só olho para o ponteiro e vejo se está em alta ou em baixa. Quando parecer propício, olho para o display, que mostra o valor de abertura e o valor atual.

Para isso, foi necessário projetar e cortar um case que comporte uma MCU e um servo-motor. Sem problemas, o tempo está sobrando.

O projeto foi feito no QCAD (programa de CAD que você pode baixar nesse link). Para corte, utilizei o acrílico especial purpurinado da Sinteglas. Claro, para um corte limpo, ágil e bem feito (parece propaganda da Gilette, mas não é), usei a CNC laser L-560 da ECNC com tubo de 100w. Essa CNC é realmente incrível. Para não me prolongar, recomendo a leitura do artigo que fiz especialmente para ela, depois de passar por apuros com uma encrenca que todo mundo tem desgosto.

Bem, normalmente os servo-motores que utilizo são os SG90 dos parceiros CurtoCircuito, UsinaInfo, Saravati ou um dos outros parceiros, cujos links estão aí na coluna da direita (ou no rodapé, se estiver vendo no smartphone).

Corte e dobra de acrílico

O acrílico é o melhor material para trabalhar na CNC laser, sem dúvidas. Além de macio, é fácil de se obter resultados agradáveis aos olhos, principalmente se estiver utilizando acrílicos especiais da Sinteglas.

Se deseja entrar na área, vou deixar os links para facilitar seu ponto de partida:

CNC laser.

Acrílicos Cast especiais.

O acrílico tem algumas vantagens extra, como permitir dobras. Foi o que deu o charme ao bitcômetro. Além do mais, é um material utilizado inclusive em hospitais (encubadoras e máquinas de hemodiálise), por isso é um material próprio inclusive para essa época de pandemia.

Código completo para o bitcômetro

Se perdeu os artigos anteriores relacionados ao bitcômetro e quer ter todos os conceitos envolvidos, deixo os links relacionados:

Como ler json no ESP32 (vai servir para tudo).

Como fazer HTTPS get com ESP8266 (inclusive usei o ESP-01).

Como conectar o ESP-01 ao Arduino sem AT (o ESP-01 é independente do Arduino).

Agora adicionaremos uma pequena lógica exclusiva para o servo-motor. Mas antes, precisamos definir o que corresponderá ao avanço e recuo do bitcômetro.

  • O parâmetro inicial será o valor de abertura.
  • Avanço de 30 graus quando a alta passar de 50 reais em relação à abertura.
  • Recuo de 30 graus (a contar do centro) para desvalorização de 50 reais em relação à abertura.

Quem quiser, adicione avanços e recuos intermediários, ok?

O servo-motor utilizado é o SG90, com abertura de 180 graus. Na biblioteca Servo.h do Arduino vamos direto de 0 à 180. Consideraremos 90 como o valor de abertura, 60 graus para alta e 120 para baixa. Lembre-se que o graus vão da direita para a esquerda.

Um efeito colateral que encontrei foi na leitura serial. Quando ela ocorre, o servo demonstra um cacoete. Não achei mal, a leitura está sendo feita e temos a garantia disso através da reação, por isso não me preocupei em fazer depuração.

bitcometro-300x182.webp

O código ficou desse jeito:

//Esse include é necessário se for programar utilizando o PlatformIO.
#include <Arduino.h>
//Essa biblioteca é necessária para cria a comunicação serial por software.
//Prefira utilizar velocidades baixas nessa comunicação.
#include <SoftwareSerial.h>
#include "Nokia_5110.h"

#include <Servo.h>

//Defina os pinos. TX é Transmissão. Ele deve ir conectado ao RX, que é Recepção
#define SOFT_TX 3
//...e vice-versa.
#define SOFT_RX 2

//definição de linhas e colunas do display Nokia 5110
#define Nokia5110_X     84
#define Nokia5110_Y     48

//definição dos pinos do display
#define PIN_SCE   11  //display: 2
#define PIN_RESET 10  //display: 1
#define PIN_DC    9   //display: 3
#define PIN_SDIN  8   //display: 4
#define PIN_SCLK  7   //display: 5

#define PIN_SERVO 6
#define BITCOIN_HIGH -30
#define BITCOIN_LOW  30

Servo servo;
//Instância de um objeto de comunicação serial, passando os pinos RX/TX como parâmetro.
//Se estiver utilizando outra placa, atente-se ao wiring.
SoftwareSerial SerialESP(SOFT_RX,SOFT_TX);

//Instância do objeto para manipulação do display
Nokia_5110 display = Nokia_5110(PIN_RESET, PIN_SCE, PIN_DC, PIN_SDIN, PIN_SCLK);

//Uma variável para guardar a leitura serial.
String values;

//Quando a leitura estiver concluída, um boolean libera a impressão na serial.
bool ok = false;

void formatValues(String valuesFor){
    String part_one   = valuesFor.substring(0,13);
    String part_two   = valuesFor.substring(15);
    
    if (part_one.toInt() > part_two.toInt()){
        servo.write(60);
    }
    else if (part_one.toInt() < part_two.toInt()){
        servo.write(120);
    }
    else{
        servo.write(90);
    }

    display.clear();
    display.println("Valor atual");
    display.println(part_one);
    display.println("Abertura");
    display.println(part_two);

}
void setup() {
    //inicia o servo
    servo.attach(PIN_SERVO);
    servo.write(90);
    //inicie ambas as seriais. A serial nativa pode estar na velocidade preferida.
    Serial.begin(9600);
    //A velocidade da softwareserial deve ser a mesma utilizada no ESP-01.
    SerialESP.begin(9600);
    //inicia a string com valor nulo.
    values = "";

    String teste = "Manual do Maker";
    display.print(teste);
    delay(2000);
}

void loop() {
  /*Se houver dados advindos do ESP-01, lê até que encontre o final de linha.*/
  while (SerialESP.available()){
      
      values = SerialESP.readStringUntil('\n');
      //quando sair desse loop, o boolean garantirá que o valor seja impresso na serial do Arduino.
      ok = true;
  }

 //Se true, o resultado é impresso na serial do Arduino e a variável é zerada.
 if (ok){
     //Serial.println(values);
     formatValues(values);
     values = "";
     //garanta que não seja executada essa condicional novamente.
     ok = false;
 }
}

Perceba que houve pouca adição de código a partir do artigo anterior relacionado. Escrever código pensando em novas implementações permite fazê-las sem dor.

Um vídeo demonstrativo está no Instagram do DobitAoByte.

Quarentena Maker - Dia 3: Já encontrei algo para olhar enquanto não faço nada. Por sorte, temos a Internet como recurso para buscar informações online nessa época de pand... oh, my God! E se ficarmos sem Internet? Dia 3 passado com sucesso. Antecipando dia 4 para comunicação sem Internet.

 

Revisão: Ricardo Amaral de Andrade

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.