Mudanças entre as edições de "Medidor de Velocidade Papel Alumínio"
Ir para navegação
Ir para pesquisar
(→Código) |
(→Código: Utilização do código aprimorado pelo ChatGPT) |
||
Linha 8: | Linha 8: | ||
== Código== |
== Código== |
||
<pre> |
<pre> |
||
− | |||
− | /* |
||
− | |||
− | Escala H0 1:87 |
||
− | |||
− | Velocidade = Espaço / Tempo |
||
− | v = dist [mm] / Time [micro_sec] |
||
− | v = dist/Time*3600 [km/h] |
||
− | v = dist/Time*3600*87[km/h em escala real] |
||
− | |||
− | */ |
||
− | |||
#include <LiquidCrystal.h> |
#include <LiquidCrystal.h> |
||
− | #define |
+ | #define SENSOR_1 7 // Pino do sensor 1 |
− | #define |
+ | #define SENSOR_2 8 // Pino do sensor 2 |
− | #define |
+ | #define LED_STATUS 13 // Pino do LED de leitura |
− | float |
+ | const float DIST_MM = 74; // Distância em mm |
⚫ | |||
− | unsigned long Time = 0; //micro sec |
||
− | unsigned long delta_time = 0; //micro sec |
||
− | + | unsigned long startTime = 0; // Tempo em microssegundos |
|
+ | unsigned long elapsedTime = 0; // Tempo decorrido em microssegundos |
||
+ | float speed_mm_per_us = 0; // Velocidade em mm/µs |
||
+ | float speed_kmh = 0; // Velocidade em km/h |
||
⚫ | |||
⚫ | |||
+ | lcd.begin(16, 2); // Inicializa o LCD com 16 colunas e 2 linhas |
||
− | |||
⚫ | |||
− | |||
⚫ | |||
⚫ | |||
+ | pinMode(LED_STATUS, OUTPUT); |
||
− | lcd_1.begin(16, 2); // Set up the number of columns and rows on the LCD. |
||
⚫ | |||
⚫ | |||
⚫ | |||
− | // Print a message to the LCD. |
||
⚫ | |||
delay(500); |
delay(500); |
||
− | + | lcd.clear(); |
|
− | + | lcd.print("Vel(cm/s) Maquete"); |
|
− | + | lcd.setCursor(0, 1); |
|
− | + | lcd.print("Vel(Km/h): Real"); |
|
delay(2000); |
delay(2000); |
||
− | + | lcd.clear(); |
|
− | + | lcd.print("Esperando"); |
|
⚫ | |||
} |
} |
||
− | void loop(){ |
+ | void loop() { |
− | if (!digitalRead( |
+ | if (!digitalRead(SENSOR_1)) { |
− | + | startTime = micros(); |
|
− | + | lcd.clear(); |
|
− | + | lcd.print("Fazendo leitura"); |
|
− | digitalWrite( |
+ | digitalWrite(LED_STATUS, HIGH); |
⚫ | |||
− | while (digitalRead( |
+ | while (digitalRead(SENSOR_2)) { |
+ | // Espera até o SENSOR_2 ser acionado |
||
} |
} |
||
⚫ | |||
⚫ | |||
− | //APARTIR DAQUI DEVERIA SER UMA FUNÇÂO// |
||
+ | calculateSpeed(); |
||
− | //// Eu não sei tipagem ._. //// |
||
+ | displaySpeed(); |
||
− | ////// Vai dar merda ... ////// |
||
⚫ | |||
− | vel = dist/delta_time; //em mm/us |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
− | lcd_1.print(vel*3600*87); |
||
delay(5000); |
delay(5000); |
||
− | + | lcd.clear(); |
|
− | + | lcd.print("Esperando"); |
|
− | digitalWrite( |
+ | digitalWrite(LED_STATUS, LOW); |
} |
} |
||
⚫ | |||
− | //IGNORAR DAQUI PARA BAIXO |
||
+ | startTime = micros(); |
||
⚫ | |||
− | + | lcd.clear(); |
|
⚫ | |||
⚫ | |||
− | + | digitalWrite(LED_STATUS, HIGH); |
|
⚫ | |||
⚫ | |||
+ | // Espera até o SENSOR_2 ser acionado |
||
} |
} |
||
+ | |||
⚫ | |||
− | + | elapsedTime = micros() - startTime; |
|
− | + | calculateSpeed(); |
|
− | + | displaySpeed(); |
|
⚫ | |||
− | Serial.println(delta_time); |
||
− | Serial.print("Velocidade: "); |
||
− | Serial.print(dist/delta_time); |
||
− | Serial.println("mm/us"); |
||
− | Serial.print("Velocidade: "); |
||
− | Serial.print(dist*3600*87/delta_time); |
||
− | Serial.println("Km/h"); |
||
− | Serial.println(); |
||
delay(5000); |
delay(5000); |
||
⚫ | |||
⚫ | |||
⚫ | |||
} |
} |
||
} |
} |
||
+ | void calculateSpeed() { |
||
+ | // Calcula a velocidade em mm/µs e km/h |
||
+ | speed_mm_per_us = DIST_MM / elapsedTime; |
||
+ | speed_kmh = speed_mm_per_us * 3600 * 87; // 87 é o fator de escala |
||
+ | } |
||
+ | |||
+ | void displaySpeed() { |
||
+ | lcd.clear(); |
||
⚫ | |||
+ | lcd.print(speed_mm_per_us * 1e5); // Convertendo para cm/s |
||
⚫ | |||
⚫ | |||
+ | lcd.print(speed_kmh); // Velocidade em km/h |
||
+ | } |
||
</pre> |
</pre> |
Edição das 10h47min de 8 de setembro de 2024
Circuito
Bem simples, apenas um Arduino com o GND ligado a um dos trilhos e deois sensores que são lâminas de papel aluminio por cima deste trilho, quando o trem passa ele fecha contato e detecta que o momento, quando passa pelo segundo o Arduino calcula a velocidade e manda via serial.
TODO
- colocar um display para exibir a velocidade
- melhorar o código com uma função para fazer o Seria.print
Código
#include <LiquidCrystal.h> #define SENSOR_1 7 // Pino do sensor 1 #define SENSOR_2 8 // Pino do sensor 2 #define LED_STATUS 13 // Pino do LED de leitura const float DIST_MM = 74; // Distância em mm LiquidCrystal lcd(12, 11, 5, 4, 3, 2); unsigned long startTime = 0; // Tempo em microssegundos unsigned long elapsedTime = 0; // Tempo decorrido em microssegundos float speed_mm_per_us = 0; // Velocidade em mm/µs float speed_kmh = 0; // Velocidade em km/h void setup() { lcd.begin(16, 2); // Inicializa o LCD com 16 colunas e 2 linhas pinMode(SENSOR_1, INPUT_PULLUP); pinMode(SENSOR_2, INPUT_PULLUP); pinMode(LED_STATUS, OUTPUT); lcd.print("hello world!"); delay(500); lcd.clear(); lcd.print("Vel(cm/s) Maquete"); lcd.setCursor(0, 1); lcd.print("Vel(Km/h): Real"); delay(2000); lcd.clear(); lcd.print("Esperando"); } void loop() { if (!digitalRead(SENSOR_1)) { startTime = micros(); lcd.clear(); lcd.print("Fazendo leitura"); digitalWrite(LED_STATUS, HIGH); while (digitalRead(SENSOR_2)) { // Espera até o SENSOR_2 ser acionado } elapsedTime = micros() - startTime; calculateSpeed(); displaySpeed(); delay(5000); lcd.clear(); lcd.print("Esperando"); digitalWrite(LED_STATUS, LOW); } if (!digitalRead(SENSOR_2)) { startTime = micros(); lcd.clear(); lcd.print("Fazendo leitura"); digitalWrite(LED_STATUS, HIGH); while (digitalRead(SENSOR_1)) { // Espera até o SENSOR_2 ser acionado } elapsedTime = micros() - startTime; calculateSpeed(); displaySpeed(); delay(5000); lcd.clear(); lcd.print("Esperando"); digitalWrite(LED_STATUS, LOW); } } void calculateSpeed() { // Calcula a velocidade em mm/µs e km/h speed_mm_per_us = DIST_MM / elapsedTime; speed_kmh = speed_mm_per_us * 3600 * 87; // 87 é o fator de escala } void displaySpeed() { lcd.clear(); lcd.print("Vel(cm/s): "); lcd.print(speed_mm_per_us * 1e5); // Convertendo para cm/s lcd.setCursor(0, 1); lcd.print("Vel(Km/h): "); lcd.print(speed_kmh); // Velocidade em km/h }