Arduino ile 41F hall sensör okuma sorunu

Kahraman

Yeni Üye
Katılım
14 Ekim 2024
Mesajlar
5
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:
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



#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
}
Kodu inceleyebilecek vaktim yok malesef ama şumu önerebilirim öncelikle Sistemi parçalara bölüp test edin mesela öncelikle hal sensörü gerçekten okuyabiliyor musunuz 3 tane ledi hal sensörlerin durumuna göre yakarak test edebilirsiniz
 
Foruma hoş geldiniz.
Kodu yorumlamak isteyenler için kolaylık olması açısından "forumun kod ekleme" özelliğini kullandım. Sizlerde kod içeren mesajlarınızda bu özelliği kullanırsanız, size yardım etmek isteyenlerin işini kolaylaştırmış olursunuz.

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
}
 
Hall sensörü kesmeye bağladıktan sonra hiç bir yerde kullanmamışsın. Ne okuma, nede okunanı hesaplama gibi bir kod bloğu göremedim.
 
İlginize çok teşekkür ederim arduino ya sinyal almak için hall sensörünü bisikletin ön tekerleğe yaptığım bi düzenek üzerinden alıyorum gelen bilgide herhangi bi sorun yok onunda sağlamasını şöyle yaptım farklı bir hız ölçebilen arduino kodu yüklediğimde aynı düzenekle hız göstergesi çalışıyor.
 
Hall sensör bağlantınız doğruysa, kesmede
C:
void countPulse() {
pulseCount++; // <--- HIZI ÖLÇTÜĞÜNÜZ DEĞİŞKENİ BAŞKA BİR YERDE KULLANMIYORSUNUZ
}


4.86 görmenizin nedeni aşağıdaki fonksiyonu her 1000 milisaniyede bir çağırmanız.
timeDifference değeri hep 1 e eşit oluyor. Haliyle aşağıdaki km/h hesaplama yaptığınız satır sonucu 4.86 çıkıyor.


C:
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;
}
 
İlginize çok teşekkür ederim arduino ya sinyal almak için hall sensörünü bisikletin ön tekerleğe yaptığım bi düzenek üzerinden alıyorum gelen bilgide herhangi bi sorun yok onunda sağlamasını şöyle yaptım farklı bir hız ölçebilen arduino kodu yüklediğimde aynı düzenekle hız göstergesi çalışıyor.
Test ettiğiniz arduino kodundaki ilgili kısımları bu projeye taşıyabilirsiniz.
 
Gokrtl ustam kesme satırından sonra countPulse geçen satırlarda hesaplaması gerekmiyormu ?
 
Yukarıdaki mesajda bu sorunuzun cevabı var.

2024-10-14_22-02.png
 
Test ettiğiniz arduino kodundaki ilgili kısımları bu projeye taşıyabilirsiniz.
frmman o kod da extra komutlar var son çare yine onu ayıklayıp buna entegre etmeye calısıcam . ama bu kodda yaptıgım hata cok zor bişey değilse diğer kodla vakit kaybetmek istemedim :)
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,704
Mesajlar
114,477
Üyeler
2,750
Son üye
Kahraman

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Back
Top