Помогите с вольтметром.
- Войдите на сайт для отправки комментариев
Сб, 24/02/2018 - 10:30
Здравствуйте. Это я опять со своим вольтметром.Вольтметр собрал на 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
}
мотрел разные примеры ничего похожего не нашел . Подскажите как это организовать.
#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); }может не дергать референс и просто поставить делитель 1 к 5 на датчик?
Схема уже собрана в готовом виде.Хотелось програмно этот вопрос решить.
может не дергать референс и просто поставить делитель 1 к 5 на датчик?
Если программно не получится придеться возможно так и сделать.
Перед analogRead ставить analogReference(INTERNAL) или analogReference(DEFAULT) в зависимости от того какой референс использовать для оцифровки. Ну delay(1) не забываем между ними.
Перед analogRead ставить analogReference(INTERNAL) или analogReference(DEFAULT) в зависимости от того какой референс использовать для оцифровки. Ну delay(1) не забываем между ними.
nik182, спасибо! Буду пробовать.
Здравствуйте. 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); }Может опять что не так я сделал?
Кроме запятой в 27 строке никакого криминала не вижу. Тестером ногу Aref Можете посмотреть? Напряжение на ней должно прыгать от 1.1 до 5 вольт каждые 500 мс . Попробуйте в 23 строке делей до 100 увеличить. И удалить строки 24 и 44.
nik182, да напряжение на AREF скачет от 1.1 в до 5 В. Попробую сейчас.
Так же все. Вольтметр не хочет правильно работать(.
В целях эксперимента пробовал 42 строку убирать. Вольтметр начинает работать,а датчик разряжения перестает.
а попробуйте не делей использовать, а пропускать цикл лупа
тоесть в начале чиклы делаете замер 1 (по 1.1в) - после чего меняете референс на 5в
в следующей итерации лупа делаете замер 2 по 5в и меняете референс на 1.1
Вот так тоже не работает?
#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); }Здравствуйте, nik182. Так и не хочет вольтметр работать.(
а попробуйте не делей использовать, а пропускать цикл лупа
тоесть в начале чиклы делаете замер 1 (по 1.1в) - после чего меняете референс на 5в
в следующей итерации лупа делаете замер 2 по 5в и меняете референс на 1.1
Попробовал, такая же история: неправильные показания вольтметра.
Какие-то неправильные вольты , они делает неправильный ... вольтметр.
Сделал пару замеров этим вольтметром на выводах 5 в и 3.3 В Ардуино и замерил тестером. Получается в в программе после расчета значения вольтметра придеться еще коррекцию делать :
Тогда начинает работать. Но хотелось бы конечно что бы работало как надо.
Так работает. Где то в недрах ардуины засада 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); }nik 182, так и не хочет вольтметр работать. При нажатии на кнопку резет вольтметр показывает правильно,но после загрузки строки значения разряжения, опять неправильные значения кажет. Спасибо за помощь. Достал я вас с этим вольтметром.
У меня на нано работает. У вас какая плата?
По крайней мере вот эта программа при подаче 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); }nik182, ардуино нано. Не знаю так и не работает. Поступил как в 17 посте. Запарил меня этот вольтметр...
Покажате что выводит программа из #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); }