Kahraman
Yeni Üye
- Katılım
- 14 Ekim 2024
- Mesajlar
- 8
merabalar formda yeniyim 48 volt elektirikli bisiklet için ( hız /tahmini kalan km/batarya kapasitesi/toplam yapılan mesafe) gösterge paneli geliştirmeye çalışıyorum. Fakat Anlık hız ekranda sabit 4.86 olarak duruyor bir türlü hall sensörden gelen bilgiye göre hesaplamasını yapamadım kodu tam olarak paylaşıyorum yardımcı olursanız sevinirim herkese kolay gelsin
C++:
#include <EEPROM.h> // Toplam km'yi saklamak için
#include <LiquidCrystal.h> // LCD ekranı kontrol etmek için
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // LCD pin bağlantıları
const int buttonPin = 6; // Ekran geçiş butonu
const int resetPin = 7; // Toplam km sıfırlama butonu
const int ledPin = 8; // Far kontrol butonu
const int hallSensorPin = 9; // Hall sensörü pini
const int batteryPin = A0; // Batarya voltajı A0 pininden okunacak
float wheelCircumference = 1.35; // Tekerlek çapı (135 cm = 1.35 m)
unsigned long totalDistance = 0; // Toplam mesafe
float currentSpeed = 0; // Anlık hız
int batteryPercentage = 100; // Batarya yüzdesi (örnek veri)
bool screenToggle = false; // Ekran durumu (false: birinci ekran, true: ikinci ekran)
volatile unsigned long pulseCount = 0; // Hall sensöründen gelen sinyaller
unsigned long lastPulseTime = 0; // Son sinyal zamanı
unsigned long lastUpdateTime = 0; // Zaman güncellemesi için
unsigned long lastDisplayUpdate = 0; // Ekran güncelleme zamanı
bool firstScreenUpdated = false; // İlk ekran güncellendi mi
bool secondScreenUpdated = false; // İkinci ekran güncellendi mi
void setup() {
pinMode(buttonPin, INPUT_PULLUP); // Ekran geçiş butonu
pinMode(resetPin, INPUT_PULLUP); // Toplam km sıfırlama butonu
pinMode(ledPin, OUTPUT); // Far kontrol pin
pinMode(hallSensorPin, INPUT_PULLUP); // Hall sensörü pini
attachInterrupt(digitalPinToInterrupt(hallSensorPin), countPulse, FALLING); // Hall sensörünü kesmeye bağla
lcd.begin(16, 2); // 16x2 LCD ekran
lcd.clear();
// EEPROM'dan son mesafeyi yükleyelim
totalDistance = EEPROM.read(0) | (EEPROM.read(1) << 8); // EEPROM'dan toplam mesafeyi geri yükle
lcd.setCursor(0, 0);
lcd.print("Hazir...");
delay(2000); // Başlangıçta mesaj
}
void loop() {
// Zaman ve hız güncelleme her 1 saniyede bir
if (millis() - lastUpdateTime > 1000) {
currentSpeed = calculateSpeed(); // Anlık hızı hesapla
batteryPercentage = calculateBatteryPercentage(); // Batarya yüzdesini güncelle
lastUpdateTime = millis();
// Ekranı 1 saniyede bir güncelle
if (!screenToggle) {
displayFirstScreen();
} else {
displaySecondScreen();
}
}
// Ekran geçiş butonuna basıldığında
if (digitalRead(buttonPin) == LOW) {
delay(200); // Buton basışını dengele
screenToggle = !screenToggle; // Ekran değiştir
}
// Toplam mesafe sıfırlama butonuna basıldığında
if (digitalRead(resetPin) == LOW) {
delay(200);
totalDistance = 0;
EEPROM.write(0, totalDistance & 0xFF); // İlk 8 bit
EEPROM.write(1, (totalDistance >> 8) & 0xFF); // İkinci 8 bit
}
// Far kontrol butonu
if (digitalRead(ledPin) == LOW) {
digitalWrite(ledPin, !digitalRead(ledPin)); // Far aç/kapat
}
}
void displayFirstScreen() {
lcd.clear(); // Ekranı temizle
lcd.setCursor(0, 0);
lcd.print("Hiz: "); // Anlık hız
lcd.setCursor(6, 0);
lcd.print(currentSpeed);
lcd.setCursor(0, 1);
lcd.print("Mesafe"); // Sabit metin
lcd.setCursor(9, 1);
lcd.print(calculateRemainingDistance()); // Kalan mesafe
}
void displaySecondScreen() {
lcd.clear(); // Ekranı temizle
lcd.setCursor(0, 0);
lcd.print("Pil: ");
lcd.setCursor(5, 0);
lcd.print(batteryPercentage); // Pil kapasitesi
lcd.setCursor(0, 1);
lcd.print("T.mesafe"); // Toplam mesafe
lcd.setCursor(9, 1);
lcd.print(totalDistance); // EEPROM'dan gelen toplam mesafe
}
void countPulse() {
pulseCount++; // Hall sensöründen gelen her sinyali say
}
float calculateSpeed() {
unsigned long timeNow = millis();
float timeDifference = (timeNow - lastPulseTime) / 1000.0; // Saniyeye çevir
lastPulseTime = timeNow;
// Tekerlek çevresi ile hız hesapla (m/s)
float speed = (wheelCircumference / timeDifference) * 3.6; // km/h'ye çevir
return speed;
}
int calculateRemainingDistance() {
// Pil kapasitesine göre kalan mesafeyi hesapla (Maksimum 35 km)
return (batteryPercentage * 0.35); // %1 için 0.35 km
}
int calculateBatteryPercentage() {
int analogValue = analogRead(batteryPin); // A0 pininden voltajı oku
float batteryVoltage = analogValue * (5.0 / 1023.0); // 0-1023 arasındaki değeri voltaja çevir (Arduino 5V referansı)
// Batarya voltajını %0 ile %100 arasında bir değere dönüştür
// Batarya %100'deyken 3.37V ve %0'dayken 2.76V
if (batteryVoltage > 3.37) batteryVoltage = 3.37;
if (batteryVoltage < 2.76) batteryVoltage = 2.76;
return map(batteryVoltage * 100, 276, 337, 0, 100); // Voltajı %'ye dönüştür
}
Last edited by a moderator: