Нужна помощь

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 10, 6, 5, 4, 3);
volatile byte nSpeed;            // колво импульсов, если не будете гонять более 255 км/час
//volatile int nSpeed;           // колво импульсов, если    будете гонять более 255 км/час
#define speedPin 2               // для UNO
#define buttonPin 4              // кнопка на GND и на пин 4 !!!!!!!!!!!!!!!!!!!!!!!!!!!
unsigned long speedMillisOld;    // "секундомер" для замера скорости
const byte speedMillisDelta=60;  // время измерения скорости - 60 mS
boolean getSpeed;                // флаг измерения скорости
byte nLCD=0;                     // 0 - приветствие , 1 - скорость, 2,3,4,5 - что придумаешь
//================================================================================
void speedInterrupt()
{
  nSpeed++;
}
//================================================================================
void outputDispHello()
{
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(" Hello !");
  lcd.setCursor(0,1);
  lcd.print(" Hello !");
}
//================================================================================
void outputDispSpeed()
{
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print(" Speed :");
  lcd.setCursor(2,1);
  lcd.print(nSpeed);
  lcd.setCursor(4,1);
  lcd.print(" km/h");
}
//================================================================================
void outputDispXXXX()      // просто так
{
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print("XXXXXXXX");
}
//================================================================================
void setup()
{
  lcd.begin(8,2);
  pinMode(speedPin,INPUT);
  digitalWrite(speedPin,HIGH);
  pinMode(buttonPin,INPUT);
  digitalWrite(buttonPin,HIGH);
  attachInterrupt(0,speedInterrupt,RISING);
}
//================================================================================
void loop()
{
// расчёт скорости
  if(getSpeed)
  {
    nSpeed=0;
    speedMillisOld=millis();
  }
  else
  {
    if((millis()-speedMillisOld)>speedMillisDelta)
    {
      getSpeed=1;
    }
  }
// обработка кнопки
  if(digitalRead(buttonPin)==0)
  {
    delay(75);                                   // подождали окончания дребезга
    while(digitalRead(buttonPin)==0) { }         // ждём отпускания кнопки
    nLCD++;
    if(nLCD>2) nLCD=0;                           // 2 поменять на ( колво экранов - 1 )
  }
// вывод экранов
  switch (nLCD)
  {
    case 0: {outputDispHello(); break;}
    case 1: {outputDispSpeed(); break;}
    case 2: {outputDispXXXX(); break;}
//  case 3:
  }
}
//================================================================================

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

ВОПРОС: можно ли подать напряжение на аналоговый вход от 0 до 6 вольт
нельзя - допуск 0.....5 V
и что бы это показывалось на экране?
хочешь вывести на экран напряжение бортсети ? можно
интересут не код программы а именно возможность работы платы Ardruino Nano v3 обработки такого низкого напряжения?
для аналогового входа низкое напряжение это < 4,8 милливольт.....
да, возможность есть :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 10, 6, 5, 4, 3);
volatile byte nSpeed;            // колво импульсов, если не будете гонять более 255 км/час
//volatile int nSpeed;           // колво импульсов, если    будете гонять более 255 км/час
#define speedPin 2               // для UNO
#define buttonPin 4              // кнопка на GND и на пин 4 !!!!!!!!!!!!!!!!!!!!!!!!!!!
unsigned long speedMillisOld;    // "секундомер" для замера скорости
const byte speedMillisDelta=60;  // время измерения скорости - 60 mS
boolean getSpeed;                // флаг измерения скорости
byte nLCD=0;                     // 0 - приветствие , 1 - скорость, 2 - напряжение,3,4,5 - что придумаешь
float voltage=14.2;
//================================================================================
void speedInterrupt()
{
  nSpeed++;
}
//================================================================================
void outputDispHello()
{
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(" Hello !");
  lcd.setCursor(0,1);
  lcd.print(" Hello !");
}
//================================================================================
void outputDispSpeed()
{
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print(" Speed :");
  lcd.setCursor(2,1);
  lcd.print(nSpeed);
  lcd.setCursor(4,1);
  lcd.print(" km/h");
}
//================================================================================
void outputDispVoltage()
{
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print("Voltage:");
  lcd.setCursor(2,1);
  lcd.print(voltage);
  lcd.setCursor(4,1);
  lcd.print(" V");
}
//================================================================================
void setup()
{
  lcd.begin(8,2);
  pinMode(speedPin,INPUT);
  digitalWrite(speedPin,HIGH);
  pinMode(buttonPin,INPUT);
  digitalWrite(buttonPin,HIGH);
  attachInterrupt(0,speedInterrupt,RISING);
}
//================================================================================
void loop()
{
// расчёт скорости
  if(getSpeed)
  {
    nSpeed=0;
    speedMillisOld=millis();
  }
  else
  {
    if((millis()-speedMillisOld)>speedMillisDelta)
    {
      getSpeed=1;
    }
  }
// обработка кнопки
  if(digitalRead(buttonPin)==0)
  {
    delay(75);                                   // подождали окончания дребезга
    while(digitalRead(buttonPin)==0) { }         // ждём отпускания кнопки
    nLCD++;
    if(nLCD>2) nLCD=0;                           // 2 поменять на ( колво экранов - 1 )
  }
// вывод экранов
  switch (nLCD)
  {
    case 0: {outputDispHello(); break;}
    case 1: {outputDispSpeed(); break;}
    case 2: {outputDispVoltage(); break;}
//  case 3:
  }
}
//================================================================================

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Vanya_87 пишет:

ну со скоростью вроде разобрались, остался температурный датчик и что то типо вольтметра только на уровень бака в литрах. там у меня на машине соответствие напряжения к литрам))) ну и сам вольтметр))) остальное будут формулы))))

ого ! как хотелки растут быстро :)
на экран - приветствие, скорость, напряжение борт сети, температура ОЖ, уровень топлива - можно много чего ещё добавить  :)  , только постепенно....

Vanya_87
Offline
Зарегистрирован: 31.03.2015

спасибо за нормальный код)))

это не хотелки быстро растут, а так было задумано изначально :)))

Vanya_87
Offline
Зарегистрирован: 31.03.2015

т.е. вот это код напряжения напрямую от 0 до 5 V подключенного на пин A0 - я правильно понял?


const int analogInPin = 0;
 
float sensorValue = 0;       
float outputValue = 0;        
 
void setup() 
{
  Serial.begin(9600);
}
 
void loop() 
{
  outputValue = float(analogRead(analogInPin))/204,6
  Serial.print("Voltage = " );                      
  Serial.println(outputValue); 
  delay(500);
}
SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 10, 6, 5, 4, 3);
volatile byte nSpeed;            // колво импульсов, если не будете гонять более 255 км/час
//volatile int nSpeed;           // колво импульсов, если    будете гонять более 255 км/час
#define speedPin 2               // для UNO
#define buttonPin 4              // кнопка на GND и на пин 4 !!!!!!!!!!!!!!!!!!!!!!!!!!!
unsigned long speedMillisOld;    // "секундомер" для замера скорости
const byte speedMillisDelta=60;  // время измерения скорости - 60 mS
boolean getSpeed;                // флаг измерения скорости
byte nLCD=0;                     // 0 - приветствие , 1 - скорость, 2 - напряжение,3,4,5 - что придумаешь
#define voltagePin A0            // пин для измерения бортсети
                                 // с +АКБ авто на резистор 3 kOm, с него на резистор 1 kOm, с него на - АКБ
                                 // среднюю точку резисторов на пин A0
float kVoltage=1.01;            // поправочный коэффициент для напряжения - число с потолка !!!!!!!!!!!!!!
float voltage;
//================================================================================
void speedInterrupt()
{
  nSpeed++;
}
//================================================================================
void outputDispHello()
{
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(" Hello !");
  lcd.setCursor(0,1);
  lcd.print(" Hello !");
}
//================================================================================
void outputDispSpeed()
{
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print(" Speed :");
  lcd.setCursor(2,1);
  lcd.print(nSpeed);
  lcd.setCursor(4,1);
  lcd.print(" km/h");
}
//================================================================================
void outputDispVoltage()
{
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print("Voltage:");
  lcd.setCursor(2,1);
  lcd.print(voltage);
  lcd.setCursor(4,1);
  lcd.print(" V");
}
//================================================================================
void setup()
{
  lcd.begin(8,2);
  pinMode(speedPin,INPUT);
  digitalWrite(speedPin,HIGH);
  pinMode(buttonPin,INPUT);
  digitalWrite(buttonPin,HIGH);
  attachInterrupt(0,speedInterrupt,RISING);
}
//================================================================================
void loop()
{
// расчёт скорости
  if(getSpeed)
  {
    nSpeed=0;
    speedMillisOld=millis();
  }
  else
  {
    if((millis()-speedMillisOld)>speedMillisDelta)
    {
      getSpeed=1;
    }
  }
  
// измерение напряжения бортсети
//  voltage=5/1024*analogRead(voltagePin)*4*kVoltage;
  voltage=0.01953125*analogRead(voltagePin)*kVoltage;  // это - тоже самое что и выше
  
// обработка кнопки
  if(digitalRead(buttonPin)==0)
  {
    delay(75);                                   // подождали окончания дребезга
    while(digitalRead(buttonPin)==0) { }         // ждём отпускания кнопки
    nLCD++;
    if(nLCD>2) nLCD=0;                           // 2 поменять на ( колво экранов - 1 )
  }
  
// вывод экранов
  switch (nLCD)
  {
    case 0: {outputDispHello(); break;}
    case 1: {outputDispSpeed(); break;}
    case 2: {outputDispVoltage(); break;}
  }
}
//================================================================================

тут и про напряжение бортсети добавлено....
код из #56 - строка 3 - зачем нужна ?
строка 13 даст ошибку ( скобки проверьте ) и ( не 204,6 а 204.6 )! и почему делить на 204.6 ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

обрати внимание на строки 11...13
...и почитай про #define

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Vanya_87 пишет:

спасибо за нормальный код)))

это не хотелки быстро растут, а так было задумано изначально :)))

дык реализовывать надо постепенно , а не засорять код переменными , которые будут использовацца через месяц :)
...а экранчик 20 х 4 - был бы более удобен :) , но и на 8 х 2 всё можно решить
что значит - нормальный код ? заработал на железе ? .... а то я не проверял ( неохота макетку лепить )

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

void outputDisp........()  - сам в них текст правь ( неохота считать знакоместа, сам красоту наводи )

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

const int analogInPin = 0;  - это не аналоговый пин, аналоговые - это A0........A5
пины 0 и 1 - никогда не трогай ( год, два - минимум :) )

outputValue = float(analogRead(analogInPin))/204,6  - это вывод напряжения 0......5 V с аналогового пина на индикацию ?
где ты такое взял ?

const int analogInPin = 0;  - ещё раз ! - надо #define voltagePin A0 - что он аналоговый ясно из того что он пин A0, что он входной - это прописывается в сетапе.... не надо вкладывать в текстовое объявление пина ВСЕ его параметры... 
"voltagePin"  в любом месте кода знаем что это пин измерения напряжения бортсети....
voltageAnalogInputPin = вода водянистая :)

Vanya_87
Offline
Зарегистрирован: 31.03.2015
Vanya_87
Offline
Зарегистрирован: 31.03.2015

SU-27-16 пишет:

const int analogInPin = 0;  - это не аналоговый пин, аналоговые - это A0........A5
пины 0 и 1 - никогда не трогай ( год, два - минимум :) )

outputValue = float(analogRead(analogInPin))/204,6  - это вывод напряжения 0......5 V с аналогового пина на индикацию ?
где ты такое взял ?

const int analogInPin = 0;  - ещё раз ! - надо #define voltagePin A0 - что он аналоговый ясно из того что он пин A0, что он входной - это прописывается в сетапе.... не надо вкладывать в текстовое объявление пина ВСЕ его параметры... 
"voltagePin"  в любом месте кода знаем что это пин измерения напряжения бортсети....
voltageAnalogInputPin = вода водянистая :)

 

мерять напряжения надо на цифровых пинах что ли? я что то запутался. по схеме у них А0, а const int analogInPin = 0 это D0.

почему не трогать А0 и А1, они особенные что ли какие то?

Vanya_87
Offline
Зарегистрирован: 31.03.2015

впринципе, я могу занять все ножки от А2 до А7. тогда А2,А3,А4 - это будет мерять напряжения, т.е. кол-во портов мне позволяет так сделать)))

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

 

Ваня, напряжение 6 вольт для ардуины низким назвать нельзя, так как предел-5 вольт

Vanya_87
Offline
Зарегистрирован: 31.03.2015

Теперь есть такие цифры:

0,79 V = 59 литров

4,38 V = 2 литра

как снимать напряжение с порта я примерно понял, надо сделать что то типо такого:

void DUT()

{ DUT++}

void loop ()

{

if (dut)

{voltage = 4.38;

DUT = 2;}

else 

{

if {voltage = 0.79;

DUT= 59;}

}

я так понимаю он мне будет считывать только только две эти точки, если вообще будет)))

нужно задать что то типо: напряжение = от 4,38 до 0,79 то DUT = от 2 до 59 литров.

так же есть формула зависимость напряжения на датчике от остатка бака: U = 4.512 - 0.064Vост

нужна подсказка)))

Vanya_87
Offline
Зарегистрирован: 31.03.2015

Yarik.Yar пишет:

 

Ваня, напряжение 6 вольт для ардуины низким назвать нельзя, так как предел-5 вольт

 

всё, 6 вольт не нужны, там всё в пределах 5, а значит всё ок))))

Vanya_87
Offline
Зарегистрирован: 31.03.2015

что то не так с кодом, не хочет он считать скорость.


#include <LiquidCrystal.h>

volatile byte nSpeed;            // колво импульсов, если не будете гонять более 255 км/час
//volatile int nSpeed;           // колво импульсов, если    будете гонять более 255 км/час
#define speedPin 2               // для UNO
unsigned long speedMillisOld;    // "секундомер" для замера скорости
const byte speedMillisDelta=60;  // время измерения скорости - 60 mS
boolean getSpeed;
LiquidCrystal lcd(12, 10, 6, 5, 4, 3);
//=========================================================================
void setup()
{ lcd.begin(8, 2);
  
  pinMode(speedPin,INPUT);
  digitalWrite(speedPin,HIGH);
  attachInterrupt(0,speedInterrupt,RISING);
  getSpeed=1;
  speedMillisOld=millis();
}
//=========================================================================
void speedInterrupt()
{
  nSpeed++;
}
//=========================================================================
void loop()
{
  if(getSpeed)
  {
    nSpeed=0;
    speedMillisOld=millis();
  }
  else
  {
    if((millis()-speedMillisOld)>speedMillisDelta)
    {
      getSpeed=1;
          delay (500); 
    }
  }
  lcd.setCursor(0,0);
      lcd.print(" Speed:   ");
      lcd.setCursor(0,1);
      lcd.print("  ");
      lcd.setCursor(2,1);
      lcd.print(nSpeed*1);
      lcd.setCursor(4,1);
      lcd.print(" kmh   ");
}
//=========================================================================
// маленький кулер запитайте от VCC-GND , выход датчика Холла кулера подайте на пин 2
// притормаживайте-отпускайте крыльчатку кулера, смотрите в сериал

почему digitalWrite(speedPin,HIGH) а не read этого порта?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

а что ты подсоединил к пину 2 ?

Если вход/выход (pin) был установлен в режим вход (INPUT), то функция digitalWrite со значением HIGH будет активировать внутренний 20K нагрузочный резистор. Подача LOW в свою очередь отключает этот резистор.
http://arduino.ru/Reference/DigitalWrite

Vanya_87
Offline
Зарегистрирован: 31.03.2015

датчик скорости через резистор 10 кОм

или нужно датчик скорости подключать напрямую без резисторов?  

вроде понял свою ошибку, пойду напрямую подключу)))

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

сколько проводов идёт от датчика ? какое напряжение на проводах ?

на сигнальном может быть 0.....12 ! будет конец ардуине, не надо торопицца !

Vanya_87
Offline
Зарегистрирован: 31.03.2015

провод импульсный, т.е. зависимый от скорости. напряжение +5V

Vanya_87
Offline
Зарегистрирован: 31.03.2015

тут всё нормально, через резистор же считается расход))) правда на аналоговый вход. думаю что резистор гасит импульсы немного и цифровой вход не успевает их считать)))

идти проверять?)))

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

а GND ардуины с корпусом машинки соединили ?

Vanya_87
Offline
Зарегистрирован: 31.03.2015

сходил проверил. подсоединил без резистора.

на скорости от 5 км/ч начинает на дисплее быстро меняться "0" "1" и то же до полной остановки. чем выше скорость тем быстрее частота 0 и 1. 

кроме 0 и 1 на дисплее ничего не показывается)))

Vanya_87
Offline
Зарегистрирован: 31.03.2015

питание друины от борт сети авто, поэтому думаю "-" он же GND у них общий, тоже сейчас подтвертил и мультиметр))

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

старый

#include <LiquidCrystal.h>

volatile byte nSpeed;            // колво импульсов, если не будете гонять более 255 км/час
//volatile int nSpeed;           // колво импульсов, если    будете гонять более 255 км/час
#define speedPin 2               // для UNO
unsigned long speedMillisOld;    // "секундомер" для замера скорости
const byte speedMillisDelta=60;  // время измерения скорости - 60 mS
boolean getSpeed;
LiquidCrystal lcd(12, 10, 6, 5, 4, 3);
//=========================================================================
void setup()
{ lcd.begin(8, 2);
  
  pinMode(speedPin,INPUT);
  digitalWrite(speedPin,HIGH);
  attachInterrupt(0,speedInterrupt,RISING);
  getSpeed=1;
  speedMillisOld=millis();
}
//=========================================================================
void speedInterrupt()
{
  nSpeed++;
}
//=========================================================================
void loop()
{
  if(getSpeed)
  {
    nSpeed=0;
    speedMillisOld=millis();
  }
  else
  {
    if((millis()-speedMillisOld)>speedMillisDelta)
    {
      getSpeed=1;
          delay (500); 
    }
  }
  lcd.setCursor(0,0);
      lcd.print(" Speed:   ");
      lcd.setCursor(0,1);
      lcd.print("  ");
      lcd.setCursor(2,1);
      lcd.print(nSpeed*1);
      lcd.setCursor(4,1);
      lcd.print(" kmh   ");
}
//=========================================================================
// маленький кулер запитайте от VCC-GND , выход датчика Холла кулера подайте на пин 2
// притормаживайте-отпускайте крыльчатку кулера, смотрите в сериал

новый



#include <LiquidCrystal.h>

volatile byte nSpeed;            // колво импульсов, если не будете гонять более 255 км/час
//volatile int nSpeed;           // колво импульсов, если    будете гонять более 255 км/час
#define speedPin 2               // для UNO
unsigned long speedMillisOld;    // "секундомер" для замера скорости
const byte speedMillisDelta=60;  // время измерения скорости - 60 mS
boolean getSpeed;
LiquidCrystal lcd(12, 10, 6, 5, 4, 3);
//=========================================================================
void setup()
{ lcd.begin(8, 2);
  
  pinMode(speedPin,INPUT);
  digitalWrite(speedPin,HIGH);
  attachInterrupt(0,speedInterrupt,RISING);
  getSpeed=1;
  speedMillisOld=millis();
}
//=========================================================================
void speedInterrupt()
{
  nSpeed++;
}
//=========================================================================
void loop()
{
  if(getSpeed)
  {
    nSpeed=0;
    getSpeed=0;                        // была пропущена строка :(
    speedMillisOld=millis();
  }
  else
  {
    if((millis()-speedMillisOld)>speedMillisDelta)
    {
      getSpeed=1;
        lcd.setCursor(0,0);
        lcd.print(" Speed:");
        lcd.setCursor(0,1);
        lcd.print("  ");
        lcd.setCursor(2,1);
        lcd.print(nSpeed);
        lcd.setCursor(4,1);
        lcd.print(" km/h");
      delay (500); 
    }
  }
}
//=========================================================================
// маленький кулер запитайте от VCC-GND , выход датчика Холла кулера подайте на пин 2
// притормаживайте-отпускайте крыльчатку кулера, смотрите в сериал

не работал из-за отсутствия строки 31 в старом коде :(

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

крайняя полная версия ( работать кусками - путь к ошибкам )

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 10, 6, 5, 4, 3);
volatile byte nSpeed;            // колво импульсов, если не будете гонять более 255 км/час
//volatile int nSpeed;           // колво импульсов, если    будете гонять более 255 км/час
#define speedPin 2               // для UNO
#define buttonPin 4              // кнопка на GND и на пин 4 !!!!!!!!!!!!!!!!!!!!!!!!!!!
unsigned long speedMillisOld;    // "секундомер" для замера скорости
const byte speedMillisDelta=60;  // время измерения скорости - 60 mS
boolean getSpeed;                // флаг измерения скорости
byte nLCD=0;                     // 0 - приветствие , 1 - скорость, 2 - напряжение,3,4,5 - что придумаешь
#define voltagePin A0            // пин для измерения бортсети
                                 // с +АКБ авто на резистор 3 kOm, с него на резистор 1 kOm, с него на - АКБ
                                 // среднюю точку резисторов на пин A0
float kVoltage=1.00;             // поправочный коэффициент для напряжения бортсети
float voltage;                   // напряжение бортсети
#define toplivoPin A1            // пин для измерения остатка топлива
byte toplivo;                    // остаток топлива
//================================================================================
void speedInterrupt()
{
  nSpeed++;
}
//================================================================================
void outputDispHello()
{
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(" Hello !");
  lcd.setCursor(0,1);
  lcd.print(" Hello !");
}
//================================================================================
void outputDispSpeed()
{
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print(" Speed :");
  lcd.setCursor(2,1);
  lcd.print(nSpeed);
  lcd.setCursor(4,1);
  lcd.print(" km/h");
}
//================================================================================
void outputDispVoltage()
{
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print("Voltage:");
  lcd.setCursor(2,1);
  lcd.print(voltage);
  lcd.setCursor(4,1);
  lcd.print(" V");
}
//================================================================================
void outputDispToplivo()
{
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print("Toplivo:");
  lcd.setCursor(2,1);
  lcd.print(toplivo);
  lcd.setCursor(4,1);
  lcd.print(" L");
}
//================================================================================
void setup()
{
  lcd.begin(8,2);
  pinMode(speedPin,INPUT);
  digitalWrite(speedPin,HIGH);
  pinMode(buttonPin,INPUT);
  digitalWrite(buttonPin,HIGH);
  pinMode(toplivoPin,INPUT);
  digitalWrite(toplivoPin,HIGH);
  attachInterrupt(0,speedInterrupt,RISING);
}
//================================================================================
void loop()
{
// расчёт скорости
  if(getSpeed)
  {
    nSpeed=0;
    getSpeed=0;
    speedMillisOld=millis();
  }
  else
  {
    if((millis()-speedMillisOld)>speedMillisDelta)
    {
      getSpeed=1;
    }
  }
  
// измерение напряжения бортсети
//  voltage=5/1024*analogRead(voltagePin)*4*kVoltage;
  voltage=0.01953125*analogRead(voltagePin)*kVoltage;  // это - тоже самое что и выше

// измерение остатка топлива
// находится в разработке

// обработка кнопки
  if(digitalRead(buttonPin)==0)
  {
    delay(75);
    while(digitalRead(buttonPin)==0) { }
    nLCD++;
    if(nLCD>3) nLCD=0;
  }
  
// вывод экранов
  switch (nLCD)
  {
    case 0: {outputDispHello(); break;}
    case 1: {outputDispSpeed(); break;}
    case 2: {outputDispVoltage(); break;}
    case 3: {outputDispToplivo(); break;}
  }
}
//================================================================================

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

раз ты утверждаешь что диапазон напряжений с датчиков не превышает 5 V и при наличии только двух точек ( будем считать зависимость напряжения с датчика от колва топлива линейной ) - то приступим к расчёту топлива....

остаток топлива L = map ( 5 / 1024 * analogRead( пинТопливо) *100 , 79 , 438 , 59 , 2 )
итого
L = map ( 0.48828125 * analogRead( пинТопливо)  , 79 , 438 , 59 , 2 )

...будем проверять :)

Vanya_87
Offline
Зарегистрирован: 31.03.2015

SU-27-16 спасибо огромнийшее, очень сильно выручаешь.

 

случилась у меня печалька, спалил питание на USB входе. на вход приходит +5 и тишина, друина мёртвая. Огорчился, полазил в инете, нашёл инфу про внешнее питание и начал калдовать. по характеристикам на VIN и GND от 6 до 20 V - чушь полная, подключил 12,3 плата стала греться как от паяльника. Напряжение взял со старого блока питания компа, там как раз и 12 и 5 есть. но не тут то было, на 5V с комп.блока выходит 5,36, тут я труханул подключаться на 5V и GND ардуинки. благо была под рукой "тринога" 7805 зная по про её способности спаял на "+5V" блока и получил на выходе 4,5V подключил и ардуинка от 5V тоже завилась. так и оставлю наверное. правда остался на плате без +5V, не проблема))))))

а началось всё с замыкания земли на +5V ICSP, ничаяно задел проводком подключенным на землю и не успевшим заизолироваться)))

Vanya_87
Offline
Зарегистрирован: 31.03.2015

будем конечно проверять... я там формулу писал зависимости напряжения от остатка литров, её будем как то использЫвать?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

крайний - с топливом

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 10, 6, 5, 4, 3);
volatile byte nSpeed;            // колво импульсов, если не будете гонять более 255 км/час
//volatile int nSpeed;           // колво импульсов, если    будете гонять более 255 км/час
#define speedPin 2               // для UNO
#define buttonPin 4              // кнопка на GND и на пин 4 !!!!!!!!!!!!!!!!!!!!!!!!!!!
unsigned long speedMillisOld;    // "секундомер" для замера скорости
const byte speedMillisDelta=60;  // время измерения скорости - 60 mS
boolean getSpeed;                // флаг измерения скорости
byte nLCD=3;                     // 0 - приветствие , 1 - скорость, 2 - напряжение, 3 - топливо
#define voltagePin A0            // пин для измерения бортсети
                                 // с +АКБ авто на резистор 3 kOm, с него на резистор 1 kOm, с него на - АКБ
                                 // среднюю точку резисторов на пин A0
float kVoltage=1.00;             // поправочный коэффициент для напряжения бортсети
float voltage;                   // напряжение бортсети
#define toplivoPin A1            // пин для измерения остатка топлива
byte toplivo;                    // остаток топлива
//================================================================================
void speedInterrupt()
{
  nSpeed++;
}
//================================================================================
void outputDispHello()
{
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(" Hello !");
  lcd.setCursor(0,1);
  lcd.print(" Hello !");
}
//================================================================================
void outputDispSpeed()
{
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print(" Speed :");
  lcd.setCursor(2,1);
  lcd.print(nSpeed);
  lcd.setCursor(4,1);
  lcd.print(" km/h");
}
//================================================================================
void outputDispVoltage()
{
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print("Voltage:");
  lcd.setCursor(2,1);
  lcd.print(voltage);
  lcd.setCursor(4,1);
  lcd.print(" V");
}
//================================================================================
void outputDispToplivo()
{
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print("Toplivo:");
  lcd.setCursor(2,1);
  lcd.print(toplivo);
  lcd.setCursor(4,1);
  lcd.print(" L");
//  Serial.println(toplivo);
}
//================================================================================
void setup()
{
//  Serial.begin(9600);
  lcd.begin(8,2);
  pinMode(speedPin,INPUT);
  digitalWrite(speedPin,HIGH);
  pinMode(buttonPin,INPUT);
  digitalWrite(buttonPin,HIGH);
  pinMode(toplivoPin,INPUT);
  digitalWrite(toplivoPin,HIGH);
  attachInterrupt(0,speedInterrupt,RISING);
}
//================================================================================
void loop()
{
// расчёт скорости
  if(getSpeed)
  {
    nSpeed=0;
    getSpeed=0;
    speedMillisOld=millis();
  }
  else
  {
    if((millis()-speedMillisOld)>speedMillisDelta)
    {
      getSpeed=1;
    }
  }
  
// измерение напряжения бортсети
  voltage=0.01953125*analogRead(voltagePin)*kVoltage;

// измерение остатка топлива
  toplivo=map(0.48828125*analogRead(toplivoPin),79,438,59,2);    // доделать надо, расширить диапазон

// обработка кнопки
  if(digitalRead(buttonPin)==0)
  {
    delay(75);
    while(digitalRead(buttonPin)==0) { }
    nLCD++;
    if(nLCD>3) nLCD=0;
  }
  
// вывод экранов
  switch (nLCD)
  {
    case 0: {outputDispHello(); break;}
    case 1: {outputDispSpeed(); break;}
    case 2: {outputDispVoltage(); break;}
    case 3: {outputDispToplivo(); break;}
  }
}
//================================================================================

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

так же есть формула зависимость напряжения на датчике от остатка бака: U = 4.512 - 0.064Vост
не увидел, просмотрел.... переделаю....

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

а началось всё с замыкания земли на +5V ICSP, ничаяно задел проводком подключенным на землю и не успевшим заизолироваться)))
бывает :((((

тут на сайте есть решение такого горя - что перепаять на ардуине - сам поищи, вспомню, сброшу

зависимость U от L - не нужна... нужно наоборот....
т.е. получаем - L=(4.512-U)/0.064

ща переделаю....

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

крайний

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 10, 6, 5, 4, 3);
volatile byte nSpeed;            // колво импульсов, если не будете гонять более 255 км/час
//volatile int nSpeed;           // колво импульсов, если    будете гонять более 255 км/час
#define speedPin 2               // для UNO
#define buttonPin 4              // кнопка на GND и на пин 4 !!!!!!!!!!!!!!!!!!!!!!!!!!!
unsigned long speedMillisOld;    // "секундомер" для замера скорости
const byte speedMillisDelta=60;  // время измерения скорости - 60 mS
boolean getSpeed;                // флаг измерения скорости
byte nLCD=3;                     // 0 - приветствие , 1 - скорость, 2 - напряжение, 3 - топливо
#define voltagePin A0            // пин для измерения бортсети
                                 // с +АКБ авто на резистор 3 kOm, с него на резистор 1 kOm, с него на - АКБ
                                 // среднюю точку резисторов на пин A0
float kVoltage=1.00;             // поправочный коэффициент для напряжения бортсети
float voltage;                   // напряжение бортсети
#define toplivoPin A1            // пин для измерения остатка топлива
byte toplivo;                    // остаток топлива
//================================================================================
void speedInterrupt()
{
  nSpeed++;
}
//================================================================================
void outputDispHello()
{
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(" Hello !");
  lcd.setCursor(0,1);
  lcd.print(" Hello !");
}
//================================================================================
void outputDispSpeed()
{
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print(" Speed :");
  lcd.setCursor(2,1);
  lcd.print(nSpeed);
  lcd.setCursor(4,1);
  lcd.print(" km/h");
}
//================================================================================
void outputDispVoltage()
{
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print("Voltage:");
  lcd.setCursor(2,1);
  lcd.print(voltage);
  lcd.setCursor(4,1);
  lcd.print(" V");
}
//================================================================================
void outputDispToplivo()
{
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print("Toplivo:");
  lcd.setCursor(2,1);
  lcd.print(toplivo);
  lcd.setCursor(4,1);
  lcd.print(" L");
  Serial.println(toplivo);
}
//================================================================================
void setup()
{
  Serial.begin(9600);
  lcd.begin(8,2);
  pinMode(speedPin,INPUT);
  digitalWrite(speedPin,HIGH);
  pinMode(buttonPin,INPUT);
  digitalWrite(buttonPin,HIGH);
  pinMode(toplivoPin,INPUT);
  digitalWrite(toplivoPin,HIGH);
  attachInterrupt(0,speedInterrupt,RISING);
}
//================================================================================
void loop()
{
// расчёт скорости
  if(getSpeed)
  {
    nSpeed=0;
    getSpeed=0;
    speedMillisOld=millis();
  }
  else
  {
    if((millis()-speedMillisOld)>speedMillisDelta)
    {
      getSpeed=1;
    }
  }
  
// измерение напряжения бортсети
  voltage=0.01953125*analogRead(voltagePin)*kVoltage;

// измерение остатка топлива
//  toplivo=(4.512-U)/0.064;                                // преобразуем :)
//  toplivo=(4.512-5/1024*digitalRead(toplivoPin))/0.064;   // преобразуем :)
  toplivo=70.5-0.0762939453125*digitalRead(toplivoPin);

// обработка кнопки
  if(digitalRead(buttonPin)==0)
  {
    delay(75);
    while(digitalRead(buttonPin)==0) { }
    nLCD++;
    if(nLCD>3) nLCD=0;
  }
  
// вывод экранов
  switch (nLCD)
  {
    case 0: {outputDispHello(); break;}
    case 1: {outputDispSpeed(); break;}
    case 2: {outputDispVoltage(); break;}
    case 3: {outputDispToplivo(); break;}
  }
}
//================================================================================

а чё - полный бак = 70 литров ?

Vanya_87
Offline
Зарегистрирован: 31.03.2015

SU-27-16 пишет:

крайний

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 10, 6, 5, 4, 3);
volatile byte nSpeed;            // колво импульсов, если не будете гонять более 255 км/час
//volatile int nSpeed;           // колво импульсов, если    будете гонять более 255 км/час
#define speedPin 2               // для UNO
#define buttonPin 4              // кнопка на GND и на пин 4 !!!!!!!!!!!!!!!!!!!!!!!!!!!
unsigned long speedMillisOld;    // "секундомер" для замера скорости
const byte speedMillisDelta=60;  // время измерения скорости - 60 mS
boolean getSpeed;                // флаг измерения скорости
byte nLCD=3;                     // 0 - приветствие , 1 - скорость, 2 - напряжение, 3 - топливо
#define voltagePin A0            // пин для измерения бортсети
                                 // с +АКБ авто на резистор 3 kOm, с него на резистор 1 kOm, с него на - АКБ
                                 // среднюю точку резисторов на пин A0
float kVoltage=1.00;             // поправочный коэффициент для напряжения бортсети
float voltage;                   // напряжение бортсети
#define toplivoPin A1            // пин для измерения остатка топлива
byte toplivo;                    // остаток топлива
//================================================================================
void speedInterrupt()
{
  nSpeed++;
}
//================================================================================
void outputDispHello()
{
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(" Hello !");
  lcd.setCursor(0,1);
  lcd.print(" Hello !");
}
//================================================================================
void outputDispSpeed()
{
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print(" Speed :");
  lcd.setCursor(2,1);
  lcd.print(nSpeed);
  lcd.setCursor(4,1);
  lcd.print(" km/h");
}
//================================================================================
void outputDispVoltage()
{
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print("Voltage:");
  lcd.setCursor(2,1);
  lcd.print(voltage);
  lcd.setCursor(4,1);
  lcd.print(" V");
}
//================================================================================
void outputDispToplivo()
{
  lcd.clear(); 
  lcd.setCursor(0,0);
  lcd.print("Toplivo:");
  lcd.setCursor(2,1);
  lcd.print(toplivo);
  lcd.setCursor(4,1);
  lcd.print(" L");
  Serial.println(toplivo);
}
//================================================================================
void setup()
{
  Serial.begin(9600);
  lcd.begin(8,2);
  pinMode(speedPin,INPUT);
  digitalWrite(speedPin,HIGH);
  pinMode(buttonPin,INPUT);
  digitalWrite(buttonPin,HIGH);
  pinMode(toplivoPin,INPUT);
  digitalWrite(toplivoPin,HIGH);
  attachInterrupt(0,speedInterrupt,RISING);
}
//================================================================================
void loop()
{
// расчёт скорости
  if(getSpeed)
  {
    nSpeed=0;
    getSpeed=0;
    speedMillisOld=millis();
  }
  else
  {
    if((millis()-speedMillisOld)>speedMillisDelta)
    {
      getSpeed=1;
    }
  }
  
// измерение напряжения бортсети
  voltage=0.01953125*analogRead(voltagePin)*kVoltage;

// измерение остатка топлива
//  toplivo=(4.512-U)/0.064;                                // преобразуем :)
//  toplivo=(4.512-5/1024*digitalRead(toplivoPin))/0.064;   // преобразуем :)
  toplivo=70.5-0.0762939453125*digitalRead(toplivoPin);

// обработка кнопки
  if(digitalRead(buttonPin)==0)
  {
    delay(75);
    while(digitalRead(buttonPin)==0) { }
    nLCD++;
    if(nLCD>3) nLCD=0;
  }
  
// вывод экранов
  switch (nLCD)
  {
    case 0: {outputDispHello(); break;}
    case 1: {outputDispSpeed(); break;}
    case 2: {outputDispVoltage(); break;}
    case 3: {outputDispToplivo(); break;}
  }
}
//================================================================================

а чё - полный бак = 70 литров ?

 

59 литров

Vanya_87
Offline
Зарегистрирован: 31.03.2015

SU-27-16 пишет:

топливо после загрузки кода сразу показал 70 литров, а вольтаж "2."

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

ничё страшного !
просто если с датчика придёт 5 V - то покажет 70 литров....
...но раз датчик ( с твоих слов ) не даёт более 4,512 V - то нормально :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

без подключения датчика - так и будет = 70 литров, поэтому и спросил :)-

вольтаж = 2 ? дык не подключено к делителю напряжения НИЧЕГО , вот и глюки.....

не спали пины ардуины 12.....15-ю вольтами ! лучше переспроси....

Vanya_87
Offline
Зарегистрирован: 31.03.2015

SU-27-16 пишет:

ничё страшного !
просто если с датчика придёт 5 V - то покажет 70 литров....
...но раз датчик ( с твоих слов ) не даёт более 4,512 V - то нормально :)

 

слушай, у меня дисплей стал как будто контрастности нету,может быть из за того что ему напряжения не хватает?

я к 4,4V подключил друину+дисплей+кнопка

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

если им надо 5 - то и надо давать 5 !
...питай их по нормальному !

Vanya_87
Offline
Зарегистрирован: 31.03.2015

SU-27-16 пишет:

без подключения датчика - так и будет = 70 литров, поэтому и спросил :)-

вольтаж = 2 ? дык не подключено к делителю напряжения НИЧЕГО , вот и глюки.....

не спали пины ардуины 12.....15-ю вольтами ! лучше переспроси....

переспрашиваю, напряжения борт сети у меня максимум 14,5 - спалю так пин?))

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

переспрашиваю, напряжения борт сети у меня максимум 14,5 - спалю так пин?))
вышеееееее написал уже как подключить бортсеть к пину А0 - два резистора, номиналы прописал, код тоже с учётом этого !

делитель рассчитан на макс бортсети - 20 V - лучше ПЕРЕ-бздеть, чем НЕДО-бздеть

Vanya_87
Offline
Зарегистрирован: 31.03.2015

SU-27-16 пишет:

если им надо 5 - то и надо давать 5 !
...питай их по нормальному !

5,15 - это много?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Vanya_87 пишет:

5,15 - это много?

курс доллара ? фунта стерл. ? напряжения ? на чём ? где ? :)-

Vanya_87
Offline
Зарегистрирован: 31.03.2015
SU-27-16 пишет:

 

если им надо 5 - то и надо давать 5 !
...питай их по нормальному !

 

 

5,15V- это много?

щас замерил напряжение на USB показывает 5,26V

заработало)))

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

если на холостом ходу БП даёт 5,15 , а под нагрузкой 4,45 - это херовый БП !
ищи и применяй БП , который держит на выходе 5,0 при токе потребления от 0 до 400 mA для твоей задачи

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

игры с питанием МК - всегда против МК :(
какой-то МК и от 5,50 будет работать , другие выпустят свою силу в виде дыма и запаха....
.....читай ДатаШит

Vanya_87
Offline
Зарегистрирован: 31.03.2015

у меня всё таже проблема с экраном, рябь от строки lcd.clear();. 

когда нажимаю на кнопку и держу, всё ок. когда кнопка отпущенная рябится(((((((((

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

давай так -  5,15 - это много? 
да, много 
4,85 - это мало?
да, мало