• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Pomiar napięcia akumulatora w samochodzie
#1
Ponieważ mam w moim samochodzie ciągłe problemy z akumulatorem to postanowiłem zrobić sobie miernik napięcia na bazie arduino . Układ już jako tako zmontowany i przyszedł czas na program . Zaczerpnąłem z sieci coś takiego :

Kod:
// www.it-technic.pl - zapraszam po więcej

int voltPin = 0; // ustawiam numer pinu analogowego

void setup()
{
 Serial.begin(9600);
 Serial.println("Monitorowanie napiecia do 10V:");
}

void loop()
{
 int wartosc = analogRead(voltPin); // odczytuję wartość na pinie analogowym  
 float wolty = wartosc / 102.4; // przekształcam wartość na wolty
 Serial.println(wolty);
 delay(500);
}
Lecz niestety jakoś nie wychodzi mi aby wyniki były wyświetlane na wyświetlaczu lcd
Wyświetlacz jest czterowierszowy i jest sterowany przez magistralę I2C . Utknąłem w tym miejscu i nie wiem jak to poprawić aby wyświetlało temperaturę . Obecnie wyświetla tylko napis "Akumulator"

Kod:
int voltPin = 0; // ustawiam numer pinu analogowego
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define BACKLIGHT_PIN 3
LiquidCrystal_I2C  lcd(0x27, 2, 1, 0, 4, 5, 6, 7);
void setup()
{
 Serial.begin(9600);
 lcd.begin(20,4);
 lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
 lcd.setBacklight(HIGH);
 
}

void loop()
{
 int wartosc = analogRead(voltPin); // odczytuję wartość na pinie analogowym  
 float volty = wartosc / 102.4; // przekształcam wartość na wolty
lcd.setCursor (0, 0);
 lcd.write("Akumulator");
 

 delay(500);
}
 
Odpowiedź
#2
Witam, w podobny sposób szukam informacji, znalazłem coś takiego: http://forbot.pl/blog/artykuly/programow...lcd-id4263,  jest fragment kodu do pomiaru napięcia,jak dla mnie dość przystępnie jest opisane.
Może coś pomoże, pozdrawiam.
 
Odpowiedź
#3
Tam jest inaczej obsługiwany wyświetlacz . U mnie leci przez magistrale I2C po czterech przewodach . Gdzię w moim kodzie siedzi błąd ale spece pojechali już chyba na wakacje .
 
Odpowiedź
#4
lcd.write(volty,1); formatowanie jedno miejsce po przecinku(powinno działać).
Jak dasz tak to się wyświetlą wolty .
Obecnie wyświetla tylko napis "Akumulator" Skoro tak jest napisane to tak wyświetla, czyli wszystko działa.
Serial.println("Monitorowanie napiecia do 10V:"); Pamiętaj o odpowiednim dzielniku bo tam jest do 15V ale skoro działa w samochodzie to pewno już wszystko ogarnięte.
Jak ma to być na wyświetlaczu to Serial.begin(9600); jest nie potrzebne.
 
Odpowiedź
#5
(17-06-2016, 20:48)-adamek napisał(a): lcd.write(volty,1); formatowanie jedno miejsce po przecinku(powinno działać).
Jak dasz tak to się wyświetlą wolty .
Obecnie wyświetla tylko napis "Akumulator"  Skoro tak jest napisane to tak wyświetla, czyli wszystko działa.
Serial.println("Monitorowanie napiecia do 10V:");  Pamiętaj o odpowiednim dzielniku bo tam jest do 15V ale skoro działa w samochodzie to pewno już wszystko ogarnięte.
Jak ma to być na wyświetlaczu to  Serial.begin(9600); jest nie potrzebne.

Dzięki za podpowiedzi , lecz udało mi się to w końcu samemu opanować (jednak przerwa robi czasami cuda) Cały działający kod wygląda tak :

Kod:
int voltPin = 0; // ustawiam numer pinu analogowego
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define BACKLIGHT_PIN 3
LiquidCrystal_I2C  lcd(0x27, 2, 1, 0, 4, 5, 6, 7);
void setup()
{
 Serial.begin(9600);
 lcd.begin(20,4);
 Wire.begin();
 lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
 lcd.setBacklight(HIGH);
 
}

void loop()
{
 int wartosc = analogRead(voltPin); // odczytuję wartość na pinie analogowym  
 float volty = wartosc / 102.4; // przekształcam wartość na wolty
lcd.setCursor (0, 0);
 lcd.write("Akumulator ");
 lcd.print(volty);
 
 

 delay(500);
}
Wiem o dzielniku itp . Wszystko mam już zrobione , ale na razie testuję na sucho bateryjką 9V i napięcie ciągle skacze od na razie 4,8v do 5,2 (kilka razy na sekundę) No i mam jeszcze zle obliczoną przekładnię bo zamiast 9 v pokazuje 5v . Dzielnik napięcia mam teraz tak ustawiony że gdy podaję na niego 9v to na arduino idzie 2,5v . czyli jak w samochodzie wzrosloby do 18v to na arduino pójdzie 5v
 
Odpowiedź
#6
delay(500); To wyświetla wynik w połowie sekundy arduino zasilane z tej baterii ? zmierz równocześnie multimetrem.
Zamiast tego opóźnienia można by to na timerze zrobić wynik trzeba mnożyć przez wartość przekładni( tak to chyba się mówi) lcd.write("Akumulator ");to można wyrzucić do setup lcd.setCursor (0, 0); apotem tym operować na wyświetlaczu.
Do 18v nie powinno wzrastać chyba że regulator nie działa dobrze , a i w samochodzie to też skacze w zależności jakie obciążenie alternatora . A ten kłopot to nie ładuje prawidłowo a może coś kradnie nadmiernie prąd po wyłączeniu zapłonu? albo pasek (to strzały ). w ramach dygresji .
 
Odpowiedź
#7
Wiem że delay(500) to co pół sekundy . Arduino mam zasilane na razie z zasilacza , a do pomiaru napięć używam bateri 9v . Z tym taimerem to kompletnie nie wiem jak to zrobić . Nie wiem jak obliczyć tą przekładnię , lecz zrobiłem to metodą prób i błędów . Wyszło mi że musiałem zrobić float volty = wartosc / 55.2; . Wtedy wyświetlacz pokazuje napięcie bateri 9.24 v - tak samo jak multimetr . Natomiast gdy do pomiaru dam paluszka AAA tu multimetr wskazuje 1,52 a arduino 1,49v
Alternator niby ładuje prawidłowo - 14,2v bez obciążenia , do 13,7v gdy załączone są wszystkie odbiorniki . Pobór prądu na załączonym alarmie 44ma . A co jakiś czas problem a aku . Po przeszło roku aku mam do wyrzucenia , a kupowałem Bosch najwyższy model - S4 silwer .
 
Odpowiedź
#8
Rozpocznę dygresją ,to pewnie jakiś chiński ten Bosch , pojazd jeździ od święta parę kilometrów albo problem z rozrusznikiem ale żeby co roku nowy ? choć teraz wszystko jest komputerowo obliczane na okres gwarancji . Można by jeszcze zmierzyć czy są odpowiednie ampery.
Pomiary to napięcie odniesienia i tolerancja na rezystorach ale 0,03 v to chyba dopuszczalne?
 
Odpowiedź
#9
Nie wiem czy to akurat wina tego Boscha . Jestem raczej za tym że coś tam siedzi w moim autku . Lecz mimo wszystko miesiąc temu kupiłem nowy akumulator Ukraiński Westa . I nie chcąc dopuścić znowu do całkowitego rozładowania postanowiłem zrobić sobie stały nadzór napięcia poprzez sklecenie prostego układziku na arduino .Początkowo miało to być na wyświetlaczu 20x4 , lecz ponieważ  w mojej lagunie nie znalazłem miejsca gdzie mógłbym ten wyświetlacz włożyć to postanowiłem dać wyświetlacz 16x2 . A i jego było ciężko wyszukać kawałek prostego miejsca . I tak zamontuję go w samej podsufitce przy przełącznikach oświetlenia kabiny . Ponieważ wyświetlacz jest dwuwierszowy a pomiar napięcia zajmuje jeden wiersz , postanowiłem dodać jeszcze pomiar temperatury w kabinie auta . Chciałem jeszcze dodać  pomiar na zewnątrz lecz nie chce mi się szukać miejsca do przeciągnięcia sondy na zewnątrz auta . Co do rozrusznika - to parę miesięcy temu go rozbierałem , sprawdzałem , czyściłem i jest jak nowy . Natomiast co do jazdy parę kilometrów , to ojciec ma Matiza i jezdzi nim czasami raz w tygodniu ok 4 km na zakupy do sklepu i nie ma żadnych problemów z aku . Zresztą poprzednio miałem Mondeo - diesla i nie miałem żadnych problemów . Dla potomnych wstawiam skecz do pomiaru napięcia i temperatury . Jako dzielnik napięcia użyłem potencjometru wielo obrotowego 1k .

Kod:
int voltPin = 0;
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#define BACKLIGHT_PIN 3
LiquidCrystal_I2C  lcd(0x27, 2, 1, 0, 4, 5, 6, 7);
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress P1 = { 0x28, 0xFF, 0x9D, 0x31, 0xB1, 0x15, 0x1, 0x8E };
void setup()
{

 lcd.begin(16,2);
 Wire.begin();
 sensors.begin();
 lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
 lcd.setBacklight(HIGH);
 
}

void loop()
{
 int wartosc = analogRead(voltPin);   
 float volty = wartosc /53.7;
 lcd.setCursor (0, 0);
 lcd.write("AKUMULATOR ");
 lcd.print(volty);
 lcd.write(byte(86));
 sensors.requestTemperatures();
float tempC1 = sensors.getTempC(P1);
lcd.setCursor (0, 1);
 lcd.write("TEMP IN ");
 lcd.print(tempC1, 1);
 lcd.write(byte(223));
 

 delay(500);
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 2 gości