Fiz um velocímetro para bicicleta com Arduino e Display Touch P.BOX Victor Vision
Veja como construir um painel para sua bicicleta que marca velocidade e muitas outras informações com o Arduino e o Display Touch P.BOX da Victor Vision!
Displays inteligentes Touch Victor Vision:
Download projeto display UnicView AD:
Arquivos para impressão 3D:
Clicando aqui você pode baixar os arquivos .STL e imprimir na sua impressora 3D.
O código a ser carregado:
Abaixo segue a programação utilizada. Para carregar o código no Arduino você terá que adicionar algumas bibliotecas na IDE do Arduino e essas bibliotecas estão disponíveis aqui em baixo para download. O resto das bibliotecas utilizadas são nativas da IDE do Arduino e não precisam ser instaladas a parte.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
/********************************************* Autor: Marlon Nardi Walendorff Projeto: Painel velocímetro para bibicleta /**********************************************/ //==================== Inclusão de Bibliotecas =================// #include <UnicViewAD.h> //==================== Mapeamento de Hardware ==================// #define pin_hall_sensor 8 //==================== Instânciando Objetos ====================// LCM Lcm(Serial); // Inicializa o LCM com o nome "Lcm" e com o parâmetro da Serial de comunicação com o Display LcmVar velocity_indicatorObject(500); // Cria um objeto com o nome de velocity_indicatorObject configurado com o VP 500 LcmVar distanceObject(501); LcmVar autonomyObject(502); LcmVar capacitybatteryObject(503); LcmVar temperaturebatteryObject(504); LcmVar velocityObject(505); uint16_t velocity_value = 0; uint16_t velocity_indicator_Value = 0; float speed_indicator_multiplier = 1.4285714285714285714285714285714; //==================== Variáveis Globais ==================// const long lcmBaudrate = 115200; // Define a taxa de transmissão de dados do Display com o Arduino volatile uint16_t lastCapture = 0; // Última captura do timer volatile uint16_t capture = 0; // Captura atual do timer volatile uint32_t period = 0; // Período calculado volatile uint32_t frequency = 0; // Frequência calculada volatile bool signalDetected = false; // Indica se o sinal foi detectado unsigned long lastCaptureTime = 0; // Tempo da última captura em ms float wheelCircumference = 2.104; // Circunferência da roda em metros (67 cm diâmetro) C=π×diâmetro int pulsesPerRevolution = 23; // Pulsos por volta do sensor void setup() { Lcm.begin(); // Inicia e configura o baudrate definido no LCM Serial.begin(lcmBaudrate); //Configura pino do sensor hall como entrada // Configura o pino de captura (ICP1, pino 8 no Arduino Uno) como entrada pinMode(pin_hall_sensor, INPUT_PULLUP); // Configura o Timer 1 com prescaler de 256 TCCR1A = 0; // Timer 1 no modo normal TCCR1B = (1 << ICES1) | (1 << CS12); // Captura na borda de subida, prescaler de 256 TCCR1C = 0; TIMSK1 |= (1 << ICIE1); // Habilita interrupção de captura de entrada sei(); // Habilita interrupções globais } ISR(TIMER1_CAPT_vect) { capture = ICR1; // Captura o valor do registrador ICR1 (contagem atual) period = capture - lastCapture; // Calcula o período entre as capturas lastCapture = capture; // Armazena o valor atual para a próxima medição if (period > 0) { // Calcula a frequência: F = clock / (prescaler * período) frequency = 16000000 / (256 * period); // Usando prescaler de 256 signalDetected = true; // Sinal detectado lastCaptureTime = millis(); // Armazena o tempo da última captura em ms } } void loop() { unsigned long currentTime = millis(); // Verifica se mais de 1 segundo passou desde a última captura (timeout para 0 Hz) if (signalDetected && (currentTime - lastCaptureTime > 1100)) { frequency = 0; // Se passou mais de 1 segundo sem capturas, frequência é 0 Hz signalDetected = false; // Marca como sem sinal } if (signalDetected == false) frequency = 0; // Calcula a velocidade em km/h float speedKmh = (wheelCircumference * frequency / pulsesPerRevolution) * 3.6; velocityObject.write(speedKmh); velocity_indicatorObject.write(speedKmh * speed_indicator_multiplier); delay(100); // Atualiza a cada 500 ms } |