Помогите с вольтметром.

Мишка
Offline
Зарегистрирован: 09.05.2017

Здравствуйте. Это я опять со своим вольтметром.Вольтметр собрал на 5 в. Работает. Собрал еще схему для замера разряжения с датчиком давления. Оба скетча работают по отдельности, но вместе не хотят. Для вольтметра использовал analogReference(INTERNAL)  -  1.1 В, а для датчика разряжения 4.91 В. Мне здесь подсказали, что нужно настраивать референс перед каждым чтением,потом делать паузу в миллисекунду после смены референса. С

01
#include <LiquidCrystal.h>
02
int V1=0;    // Аналоговый вход A1 для замера напряжения
03
int Dat=0;   //Аналоговый вход 0 для подключения датчика разряжения
04
int C = 0;
05
float V2=0;
06
float V3=0;
07
float V4=0;
08
float C1 = 0;
09
float P = 0;
10
LiquidCrystal lcd(2,3,4,5,6,7);
11
 
12
 
13
 
14
void setup() {
15
lcd.begin(16,2);
16
lcd.clear();
17
analogReference(INTERNAL);
18
 
19
}
20
 
21
void loop() {
22
V1= analogRead(A1);
23
V2= (1.1/1023.0)*V1 ;
24
V3= V2/(3.1/(11.0+3.1));
25
V4= 1.0385*V3;
26
if (V4<0.27) {
27
V4=0.0;
28
}
29
 C = analogRead(Dat);
30
  C1 = ((4.91/1023)*C);
31
  P = (20 * C1 + 12);
32
lcd.setCursor(0,0);
33
lcd.print("Voltmetr:");
34
lcd.setCursor(0,10);
35
lcd.print(V4,3);
36
lcd.setCursor(0,16);
37
lcd.print("B");
38
delay(1000);
39
 
40
lcd.setCursor(0,1);
41
    lcd.print("DAD:");
42
    lcd.setCursor(5,1);
43
    lcd.print(P);
44
  lcd.setCursor(9,1);
45
  lcd.print("kPa");
46
 delay(500);
47
 
48
 
49
 
50
 
51
}

мотрел разные примеры ничего похожего не нашел . Подскажите как это организовать.

Мишка
Offline
Зарегистрирован: 09.05.2017

 

#include <LiquidCrystal.h>

int V1=0;    // Аналоговый вход A1 для замера напряжения
int Dat=0;   //Аналоговый вход 0 для подключения датчика разряжения
int C = 0;
float V2=0;
float V3=0;
float V4=0;
float C1 = 0;
float P = 0;
LiquidCrystal lcd(2,3,4,5,6,7);

 
void setup() {
lcd.begin(16,2);
lcd.clear();
analogReference(INTERNAL);
}
void loop() {
V1= analogRead(A1);
V2= (1.1/1023.0)*V1 ;
V3= V2/(3.1/(11.0+3.1));
V4= 1.0385*V3;
if (V4<0.27) {
V4=0.0;
}
C = analogRead(Dat);
C1 = ((4.91/1023)*C);
P = (20 * C1 + 12);
lcd.setCursor(0,0);
lcd.print("Voltmetr:");
lcd.setCursor(0,10);
lcd.print(V4,3);
lcd.setCursor(0,16);
lcd.print("B");
delay(1000);
lcd.setCursor(0,1);
lcd.print("DAD:");
lcd.setCursor(5,1);
lcd.print(P);
 lcd.setCursor(9,1);
 lcd.print("kPa");
delay(500);
}

 

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

может не дергать референс и просто поставить делитель 1 к 5 на датчик?

Мишка
Offline
Зарегистрирован: 09.05.2017

Схема уже собрана в готовом виде.Хотелось програмно этот вопрос решить.

Мишка
Offline
Зарегистрирован: 09.05.2017

ELITE пишет:

может не дергать референс и просто поставить делитель 1 к 5 на датчик?

Если программно не получится придеться возможно так и сделать.

nik182
Offline
Зарегистрирован: 04.05.2015

Перед analogRead  ставить analogReference(INTERNAL) или analogReference(DEFAULT) в  зависимости от того какой референс использовать для оцифровки. Ну delay(1) не забываем между ними.

...
analogReference(INTERNAL);
delay(1) ;
analogRead(A0);
.....
analogReference(DEFAULT); 
delay(1) ;
analogRead(A1);
.........

 

Мишка
Offline
Зарегистрирован: 09.05.2017

nik182 пишет:

Перед analogRead  ставить analogReference(INTERNAL) или analogReference(DEFAULT) в  зависимости от того какой референс использовать для оцифровки. Ну delay(1) не забываем между ними.

...
analogReference(INTERNAL);
delay(1) ;
analogRead(A0);
.....
analogReference(DEFAULT); 
delay(1) ;
analogRead(A1);
.........

 

nik182, спасибо! Буду пробовать.

Мишка
Offline
Зарегистрирован: 09.05.2017

Здравствуйте. nik182,сделал как писали выше. Датчик разряжения заработал и вольтметр то же. Только вольтметр показывать стал неверные значения. Если нажать на кнопку резет, то в первую секунду вольтметр показывает правильное значение,потом когда загружается вторая строка с значением разряжения опять неверное показывает. Датчик разряжения работает правильно.

#include <LiquidCrystal.h>
int V1=0;    // Аналоговый вход A1 для замера напряжения
int Dat=0;   //Аналоговый вход 0 для подключения датчика разряжения
int C = 0;
float V2=0;
float V3=0;
float V4=0;
float C1 = 0;
float P = 0;
LiquidCrystal lcd(2,3,4,5,6,7);



void setup() {
lcd.begin(16,2);
lcd.clear();
 
}

void loop() {

analogReference(INTERNAL);
delay(1);
analogRead(A1);

V1= analogRead(A1); 
V2= (1,1/1023.0)*V1 ;
V3= V2/(3.1/(11.0+3.1));
V4= 1.0385*V3;
if (V4<0.27) {
V4=0.0;
}
lcd.setCursor(0,0);
lcd.print("V");
lcd.setCursor(6,0);
lcd.print(V4,3); 
lcd.setCursor(12,0);
lcd.print("B");
delay(500);


analogReference(DEFAULT);
delay(1);
analogRead(A0);


C = analogRead(Dat);
 C1 = ((5.0/1023)*C);  
  P = (20 * C1 + 12);
lcd.setCursor(0,1);
    lcd.print("DAD");
    lcd.setCursor(5,1);
    lcd.print(P,2); 
  lcd.setCursor(11,1);
  lcd.print("kPa");
 delay(500);

}

Может опять что не так я сделал?

nik182
Offline
Зарегистрирован: 04.05.2015

Кроме запятой в 27 строке никакого криминала не вижу. Тестером ногу Aref Можете посмотреть? Напряжение на ней должно прыгать от 1.1 до 5 вольт каждые 500 мс . Попробуйте в 23 строке делей до 100 увеличить. И удалить строки 24 и 44.

Мишка
Offline
Зарегистрирован: 09.05.2017

nik182, да напряжение на AREF скачет от 1.1 в до 5 В. Попробую сейчас.

Мишка
Offline
Зарегистрирован: 09.05.2017

Так же все. Вольтметр не хочет правильно работать(.

Мишка
Offline
Зарегистрирован: 09.05.2017

В целях эксперимента пробовал 42 строку убирать. Вольтметр начинает работать,а датчик разряжения перестает.

analogReference(DEFAULT)

 

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

а попробуйте не делей использовать, а пропускать цикл лупа

тоесть в начале чиклы делаете замер 1 (по 1.1в) - после чего меняете референс на 5в

в следующей итерации лупа делаете замер 2 по 5в и меняете референс на 1.1

nik182
Offline
Зарегистрирован: 04.05.2015

Вот так тоже не работает?

#include <LiquidCrystal.h>
int C = 0,V1;

float V2=0;
float V3=0;
float V4=0;
float C1 = 0;
float P = 0;
LiquidCrystal lcd(2,3,4,5,6,7);



void setup() {
lcd.begin(16,2);
lcd.clear();
 
}

void loop() {

analogReference(INTERNAL);
delay(1);

V1= analogRead(A1); 
V2= (1.1/1023.0)*V1 ;
V3= V2/(3.1/(11.0+3.1));
V4= 1.0385*V3;
if (V4<0.27) { V4=0.0;};
lcd.setCursor(0,0);
lcd.print("V");
lcd.setCursor(6,0);
lcd.print(V4,3); 
lcd.setCursor(12,0);
lcd.print("B");
delay(500);


analogReference(DEFAULT);
delay(1);
C = analogRead(A0);
 C1 = ((5.0/1023)*C);  
  P = (20 * C1 + 12);
lcd.setCursor(0,1);
    lcd.print("DAD");
    lcd.setCursor(5,1);
    lcd.print(P,2); 
  lcd.setCursor(11,1);
  lcd.print("kPa");
 delay(500);

}

 

Мишка
Offline
Зарегистрирован: 09.05.2017

Здравствуйте, nik182. Так и не хочет вольтметр работать.(

Мишка
Offline
Зарегистрирован: 09.05.2017

ELITE пишет:

а попробуйте не делей использовать, а пропускать цикл лупа

тоесть в начале чиклы делаете замер 1 (по 1.1в) - после чего меняете референс на 5в

в следующей итерации лупа делаете замер 2 по 5в и меняете референс на 1.1

Попробовал, такая же история: неправильные показания вольтметра.

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Какие-то неправильные вольты , они делает неправильный ... вольтметр. 

Мишка
Offline
Зарегистрирован: 09.05.2017

Сделал пару замеров этим вольтметром на выводах 5 в и 3.3 В Ардуино и замерил тестером. Получается в в программе после расчета значения вольтметра придеться еще коррекцию делать :

V4= V4/0.234;

Тогда начинает работать. Но  хотелось бы конечно что бы работало как надо.

nik182
Offline
Зарегистрирован: 04.05.2015

Так работает. Где то в недрах ардуины засада analogReference(DEFAULT) после первого вызова остальные вызовы не дают результата.

#include <LiquidCrystal.h>
int C = 0,V1;

float V2=0;
float V3=0;
float V4=0;
float C1 = 0;
float P = 0;
LiquidCrystal lcd(2,3,4,5,6,7);
byte low,high;


void setup() {
lcd.begin(16,2);
lcd.clear();
 
}

void loop() {

  ADMUX = 0xC1;
  delay(1);
  ADCSRA|= 0x40;
  while (bit_is_set(ADCSRA, ADSC));
  low  = ADCL;
  high = ADCH;
  V1= (high << 8) | low;
  V2= (1.1/1023.0)*V1 ;
  V3= V2/(3.1/(11.0+3.1));
  V4= 1.0385*V3;
  if (V4<0.27) { V4=0.0;};
  lcd.setCursor(0,0);
  lcd.print("V");
  lcd.setCursor(6,0);
  lcd.print(V4,3); 
  lcd.setCursor(12,0);
  lcd.print("B");
  delay(500);


  ADMUX = 0x40;
  delay(1);
  ADCSRA|= 0x40;
  while (bit_is_set(ADCSRA, ADSC));
  low  = ADCL;
  high = ADCH;
  C= (high << 8) | low;
  C1 = ((5.0/1023)*C);  
  P = (20 * C1 + 12);
lcd.setCursor(0,1);
    lcd.print("DAD");
    lcd.setCursor(5,1);
    lcd.print(P,2); 
  lcd.setCursor(11,1);
  lcd.print("kPa");
 delay(500);

}

 

Мишка
Offline
Зарегистрирован: 09.05.2017

nik 182, так и не хочет вольтметр работать. При нажатии на кнопку резет вольтметр показывает правильно,но после загрузки строки значения разряжения, опять неправильные значения кажет. Спасибо за помощь. Достал я вас с этим вольтметром.

nik182
Offline
Зарегистрирован: 04.05.2015

У меня на нано работает. У вас какая плата?

По крайней мере вот эта программа при подаче 1 В на входы  А0 и А1 выдает разные коды в соответствии с референсным напряжением.

int V1,V2;
byte low,high;


void setup() {
Serial.begin(9600);
}

void loop() {

  ADMUX = 0xC1;
  delay(1);
  ADCSRA|= 0x40;
  while (bit_is_set(ADCSRA, ADSC));
  low  = ADCL;
  high = ADCH;
  V1= (high << 8) | low;

  ADMUX = 0x40;
  delay(1);
  ADCSRA|= 0x40;
  while (bit_is_set(ADCSRA, ADSC));
  low  = ADCL;
  high = ADCH;
  V2= (high << 8) | low;

  Serial.print("V1=");
  Serial.print(V1);
  Serial.print(" V2=");
  Serial.print(V2);
  Serial.println();      
  
  delay(1000);
}

 

Мишка
Offline
Зарегистрирован: 09.05.2017

nik182, ардуино нано. Не знаю так и не работает. Поступил как в 17 посте. Запарил меня этот вольтметр...

nik182
Offline
Зарегистрирован: 04.05.2015

Покажате что выводит программа из #20 в терминал при подаче на входы А0 и А1 напряжения 1 вольт. Потом в строках 12 и 20 delay(1) поменяйте на delay(20). У меня на одной плате на Uref висит конденсатор и похоже 1 мс на ней мало для изменения Vref. После увеличения задержки после переключения Uref на этой плате тоже стал нормально мерить. Поиграйте с задержками в этих строчках. Думаю и у вас всё будет мерить нормально. 

P.S. Подумал над задержкой и родил вот такую конструкцию. Работает! В 9 строке только присваивается константа, в 10 она пишется в железо, в 11 строке задержка на установку Vref, в 12 собственно чтение. Ну идля второй переменной такая же конструкция.

int V1,V2;
byte low,high;

void setup() {
 Serial.begin(115200);       
}

void loop() {
  analogReference(INTERNAL);
  V1= analogRead(A1);
  delay(20);
  V1= analogRead(A1); 
  analogReference(DEFAULT);
  V2=analogRead(A0);
  delay(20);
  V2=analogRead(A0);
  Serial.print("V1=");
  Serial.print(V1);
  Serial.print("  V2=");
  Serial.print(V2);
  Serial.println();
  delay(1000);
}