БК автомобиля
- Войдите на сайт для отправки комментариев
Здравствуйте. Занялся я тут написанием простенького бортового компьютера для своего таза 2108, а то там даже вольтметра нет) И так как на arduino я пока ничего серьезного не писал (светодиодами только моргал:)) и дабы избежать каких-нибудь грубых ошибок, решил выложить здесь код, чтобы вы его покритиковали. Особенно интересуют всякие программные хитрости, чтобы более приятно было наблюдать за экранчиком. Например, вот обороты пробовал снимать, и прыгали они постоянно, было не очень, и я попробовал округлять их по 50, но пока не проверял, как это будет смотреться. Проект сейчас на начальной стадии, работает только датчик напряжения и оборотов. С нетерпением жду ваших замечаний :)
P.S.: LCD 16х2 подвешен на сдвиговый регистр 74hc595. Их там 2 стоит. Возможно, будет и 74hc165
// include the library code:
#include <math.h>
#include <LiquidCrystalExt.h>
#include <LineDriver.h>
#include <SPI_Bus.h>
#include <SPI.h>
SPI_Bus shreg(_16bit,8);
LiquidCrystal lcd(6, 5, 4, 3, 2, 1, &shreg); //LCD экран 16х2
// Пины датчиков
const int sensVolt = A1; //датчик напряжения
const int ledLCD = 6; //освещение LCD
const int sensFuel = A2; //датчик топлива в баке
const int sensRPM = 2; //датчик оборотов
const int sensSpeedCar = 4; //датчик скорости(расстояния)
const int sensLight = 7; //габариты
//переменные
unsigned long thisSec = 0; //временная переменная секунды
unsigned long thisSec2 = 0;
unsigned long ledLcdSec = 0; //временная переменная времени подсветки дисплея
float volt = 0; //напряжение
float tVolt = 0; //времменая переменная напряжения
float volt2 = 0; //напряжение прошлое, для сравнения
float voltPorog = 4; //порог напряжения
int RPM = 0; //обороты
int RPM2 = 0; //обороты прошлые, для сравнения
int tRPM = 0; //времменая переменная оборотов
float speedCar = 0; //скорость
float speedCar2 = 0; //скорость прошлая, для сравнения
int tSpeedCar = 0; //времменая переменная скорости
float fastDist = 0; //мгновенное расстояние
float fastDistAll = 0;
float dist = 0; //оставшееся расстояния на баке
float dist2 = 0; //расстояние прошлое, для сравнения
float tDist = 0; //
float rasFuel = 0;
float rasFuelFast = 0;
float fuel = 0; //кол-во топлива в баке
float tFuel = 0; //времменая переменная кол-ва топлива
float r = 0.0003; //радиус колеса
int ledPorog = 120; //порог яркости LCD
int cyl = 4; //количество цилиндров
int i = 0;
boolean j = LOW;
boolean k = LOW;
void setup() {
noInterrupts();
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("Beautiful mind");
pinMode(ledLCD, OUTPUT);
pinMode(sensRPM, INPUT);
pinMode(sensSpeedCar, INPUT);
pinMode(sensLight, INPUT);
analogWrite(ledLCD, 255);
digitalWrite(sensRPM, HIGH);
interrupts();
delay(1000);
// чистка LCD
lcd.clear();
millisRPM = millis();
refreshLCD();
lastRPM = digitalRead(sensRPM);
lastSpeedCar = digitalRead(sensSpeedCar);
//Serial.begin(9600);
}
void loop() {
thisSec = millis();
//цикл для опроса приоритетных датчиков
while(millis() - thisSec < 601)
{
//считывание с датчика напряжения
tVolt = tVolt + analogRead(sensVolt)*5.0001/1023;
i++;
//подсчет оборотов, считывание данных
if(lastRPM != digitalRead(sensRPM))
{
if(lastRPM == LOW && digitalRead(sensRPM) == HIGH)
tRPM++;
lastRPM = digitalRead(sensRPM);
}
//подсчет скорости, считывание данных
if(lastSpeedCar != digitalRead(sensSpeedCar))
{
if(lastSpeedCar == LOW && digitalRead(sensSpeedCar) == HIGH)
tSpeedCar++;
lastSpeedCar = digitalRead(sensSpeedCar);
}
}
thisSec2 = millis();
//подсчет оборотов
RPM = round(1200.0*(float)tRPM/((float)(thisSec2-thisSec)*(float)cyl))*50;
tRPM = 0;
//подсчет мгновенного растояния
fastDist = (float)tSpeedCar*2.0*M_PI*r;
fastDistAll = fastDistAll + fastDist;
//вычисление расхода топлива
if (fastDistAll > 1000)
{
rashFuel = rashFuelFast / fastDistAll;
fastDistAll = 0;
}
//подсчет скорости
speedCar = 3600.0*fastDist/((float)(thisSec2-thisSec)/1000);
tSpeedCar = 0;
dist = thisSec2-thisSec;
volt = round(100.0*tVolt/(i+1))/100.0;
i = 0;
tVolt = 0;
//Уменьшение яркости дисплея
if(digitalRead(sensLight)) analogWrite(ledLCD, ledPorog);
else analogWrite(ledLCD, 255);
if(volt2 != volt)
{
printVoltLCD();
volt2 = volt;
}
if(RPM2 != RPM)
{
printRPMLCD();
RPM2 = RPM;
}
if(speedCar2 != speedCar)
{
printSpeedCarLCD();
speedCar2 = speedCar;
}
if(dist2 != dist)
{
printDistLCD();
dist2 = dist;
}
}
void printVoltLCD()
{
//вывод напряжения бортовой сети на экран
lcd.setCursor(2, 0);
lcd.print(" ");
if (volt < 10)
lcd.setCursor(3, 0);
else if (volt < 100)
lcd.setCursor(2, 0);
lcd.print(volt);
}
void printRPMLCD()
{
//вывод оборотов на экран
lcd.setCursor(12, 0);
lcd.print(" ");
if (RPM < 10)
lcd.setCursor(15, 0);
else if (RPM < 100)
lcd.setCursor(14, 0);
else if (RPM < 1000)
lcd.setCursor(13, 0);
else
lcd.setCursor(12, 0);
lcd.print(RPM);
}
void printSpeedCarLCD()
{
//вывод расхода на экран
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(rashFuel);
lcd.setCursor(5, 1);
lcd.print("l/km");
}
void printDistLCD()
{
//вывод оставшегося пути на с учетом расхода на экран
lcd.setCursor(10, 1);
lcd.print(" ");
if (dist < 10)
lcd.setCursor(13, 1);
else if (dist < 100)
lcd.setCursor(12, 1);
else if (dist < 1000)
lcd.setCursor(11, 1);
else if (dist < 10000)
lcd.setCursor(10, 1);
else
lcd.setCursor(9, 1);
lcd.print(dist);
lcd.setCursor(14, 1);
lcd.print("km");
}
void refreshLCD()
{
//вывод напряжения бортовой сети на экран
lcd.setCursor(0, 0);
lcd.print("V:");
lcd.print(" ");
if (volt < 10)
lcd.setCursor(3, 0);
else if (volt < 100)
lcd.setCursor(2, 0);
lcd.print(volt);
//вывод оборотов на экран
lcd.setCursor(8, 0);
lcd.print("RPM:");
lcd.print(" ");
if (RPM < 10)
lcd.setCursor(15, 0);
else if (RPM < 100)
lcd.setCursor(14, 0);
else if (RPM < 1000)
lcd.setCursor(13, 0);
else
lcd.setCursor(12, 0);
lcd.print(RPM);
//вывод расхода на экран
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(speedCar);
lcd.setCursor(5, 1);
lcd.print("l/km");
//вывод оставшегося пути на с учетом расхода на экран
lcd.setCursor(10, 1);
lcd.print(" ");
if (dist < 10)
lcd.setCursor(13, 1);
else if (dist < 100)
lcd.setCursor(12, 1);
else if (dist < 1000)
lcd.setCursor(11, 1);
else
lcd.setCursor(10, 1);
lcd.print(dist);
lcd.setCursor(14, 1);
lcd.print("km");
}
LCD 16х2 подвешен на сдвиговый регистр 74hc595. Их там 2 стоит
а почему для LCD поставили 2а регистра сдвига?
и кстати мне вот через регистр сдвига уджалось запустить толкьо так...