Você está na página 1de 3

/* canal: "arduino && máquinas"

titular: André
22/abril/2021
configuração de giro: [0.00228] / aro 29 bike's
projeto: "odômetro de bike com arduino" */

#include <SPI.h> // biblioteca de "interface periférica de


comunicação"
#include <Wire.h> // biblioteca de comunicação via fios SCK, SDA
#include <Adafruit_SSD1306.h> // biblioteca configuração / lcd orgânico
color 128x64 - Oled I2C, e similares
#define Ss 8 // sensor [reed switch] habilitado na porta digital 8
bool ss = 1; // variável de Sensor reed com nível lógico alto, e
resistor interno ativo
#define OLED_RESET 4 // pino digital 4, reservado para manter "nível
analógico de reset" no display
Adafruit_SSD1306 display(OLED_RESET); // instancía classe do objeto
"display" (POO)
float giro = 0.00000; // variável de armazenamento de distância obtida
em metros percorridos, inicializada em "0"
// antes do 1º giro imprime [0.00000] = '0'Mt e '00'Cm
// no 1º giro imprimirá: [0.00228] = '2'Mt e '28'Cm
// a cada volta realizada na roda, será somado mais 2Mt e 28Cm
#define pino 12 // o pino 12 atua como pulsador de tempo definido
através do "millis". Ex: (tempoAnterior >= 18)
bool clocks = LOW; // tempo definido através do "millis" ou marca-passo
de inversão
unsigned long int tempoAnterior; // variável de armazenamento de tempo
pré-definido. Ex: tempo = 18 milessegundos

void setup() // escopo realiza apenas uma leitura pelo microcontrolador,


setando e configurando todos os pinos
{
pinMode(pino, OUTPUT); // seta pino 12 como saída, utilizado no
controle de millis
digitalWrite(pino, LOW); // inicializa pino 12, com nível lógico '0'
ou baixo
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // habilita endereço do
lcd:(0x3C) em hexadecimal
display.clearDisplay(); // limpa caracteres de linhas e colunas no
display
pinMode(Ss, INPUT_PULLUP); // Sensor reed switch digital(8), setado
como entrada de pulso ou de sinal
display.setTextSize(1); // formata caracteres de tamanhos pequenos
display.setTextColor(WHITE); // seta apenas primeira linha como cor
amarela
display.setCursor(19,0); // posiciona linha e coluna a fim de ser
escrito String
display.print("Odometro bike's"); // mantém String no display, sem
apresentar efeito de blink
display.display(); // envia conjunto de informações ao lcd, a fim de
de imprimí-los no display
display.setTextSize(2); // formata caracteres de tamanhos médios
display.setTextColor(WHITE); // seta 2ª e demais linhas como cor azul
display.setCursor(25, 15); // posiciona linha e coluna a fim de ser
escrito uma String
display.print("0.00000"); // imprime valor inicial, [0.00000] = '0'
metros iniciais
display.display(); // envia conjunto de informações ao lcd, a fim de
de imprimí-los no display
delay(5); // pausa apenas 5 milessegundos no "Setup",
} // esse tempo não interfere funcionalmente no programa do
odômetro, a leitura do sensor reed
// mantém-se rápida e precisa, independente da velocidade que
é desenvolvida na roda da bike

void loop() // escopo realiza ciclo infinito 16Mhz ou 16 mil vezes por
segundo, cada leitura
{ // controle de tempo sem delay, utilizando (millis = 18)
byte timeStop = 0; // variável de tempo de parada,
// atua no controle de parada, quando ímã neodímio, aproxima-se do sensor
reed switch,
// permanecendo faceados, num período igual ou maior que 18 milessegundos

if (millis() - tempoAnterior >= 18) // tempo desejado ou pré-


definido através de millis
{
tempoAnterior = millis(); // estabelece período pré definido(20)
e armazena-o em tempoAnterior
digitalWrite(pino, clocks); // mantém esse período pré definido
entre '0' a '18' milessegundos
clocks = !clocks; // e ao finalizar o ciclo, inicia-se novamente
a partir de "zero"

ss = digitalRead(Ss); // realiza leitura de deslocamento no pino do


sensor e armazena-o em "ss"
if (ss ==0) // se Sensor recebeu aproximação do ímã
{ // executa o que está escrito abaixo ...
display.clearDisplay(); // limpa caracteres de linhas e colunas no
display
display.setTextSize(1); // formata caracteres de tamanhos pequenos
display.setTextColor(WHITE); // seta primeira linha como cor amarela
display.setCursor(19, 0); // posiciona linha e coluna a fim de ser
escrito uma String
display.print("Odometro bike's"); // mantém String no display, sem
apresentar efeito de blink
display.display(); // envia todo conjunto de informações ao lcd, a
fim de imprimí-los no display
giro = giro + 0.00228; // variável de incremento das voltas na roda
da bike 0.00228 ou 2Mt e 28Cm

display.setTextSize(2); // formata caracteres de tamanhos médios


display.setTextColor(WHITE); // seta segunda e demais linhas com cor
azul
display.setCursor(25, 15); // posiciona linha e coluna a fim de ser
escrito uma String
display.print(giro, 5); // imprime distância, 1 dígito p/ "Km" e 5
dígitos p/ "Metros" e "Centímetros"
display.display(); // envia todo conjunto de informações ao lcd, a
fim de imprimí-los no display
delay(clocks); // pausa de 18 milessegundos, valor extraído do
millis

ss = digitalRead(Ss); // realiza leitura recebida pelo sensor reed


switch e armazena na variável "ss"
if (ss ==0) timeStop ++;// se ímã aproximar-se do sensor, soma '1' na
variável tempo de permanência (ímã/reed)
delay(clocks);// "TEMPO HÁBIL", apenas a fim de obter "LEITURA
NECESSÁRIA" do sensor reed, no pino digital(8)

while( (ss ==0)and(timeStop > 0) ) // enquanto ímã estiver próximo


do sensor e contagem de tempo já iniciou
{ // não incrementa dígitos, nem tão
pouco imprime novo valor no display
ss = digitalRead(Ss); // então, confere-se novamente
leitura do sensor
if( (ss ==1)and(timeStop > 0)) // e se ímã distanciou-se do
sensor, e tempo continua ascendendo
{ // logo, será impresso novo valor no display do
lcd

timeStop=0; // assim sendo, zera-se o tempo de parada e o


microcontrolador roda normalmente
} // o programa, zerando seu valor, o qual
anteriormente era ascendido do zero
delay(3); // tempo de 3 milessegundos pausados, a fim de
sair do "bloco de tempo" ou do "timeStop"
} //end (while ss==0;)
} //end (if ss ==0;)
} // *end (if millis)
} //end program e reinício de
ciclo ///////////////////////////////////////////////////////////////////////////

Você também pode gostar