Измерить вольты на pin

Nalik
Nalik аватар
Offline
Зарегистрирован: 02.02.2016

Здравствуйте! Как можно измерить сколько вольт подается на вывод?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

гугли. совсем ленивый

Nalik
Nalik аватар
Offline
Зарегистрирован: 02.02.2016

jeka_tm пишет:

гугли. совсем ленивый

Это да :)

Но у меня есть наработки, проверите?)

int volts = 0; //Переменная для хранения напряжения

void setup() {
  // put your setup code here, to run once:
}

void loop() {
  volts = analogRead(3);     // считываем значение вольта с аналоговова вывода
  if(volts > 0) //Если напряжение есть
  {
    volts = 0; //Сбросить напряжение
    //...выполнение каких-то действий

  }
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

analogRead() отдает значение АЦП (0-1023) относительно опорного (AREF) или что у Вас на ардуине настроено как опорное напряжение.

Nalik
Nalik аватар
Offline
Зарегистрирован: 02.02.2016

Посмотрел)

Отсеял ненужную часть кода (а именно замер времени выполнения)

Получился такой вариант:

#define ADC A0 //Содержит идентификатор и символьную строку (Могу предположить что это А0 это pin аналогово вывода)
float voltage; //Переменная для хранения данных о напряжении

void setup() {
  Serial.begin(9600); 
  //Не очень понимаю зачем тут Serial если он нигде не используется
  //Или он нужен для чтения данных с аналоговых входов?
}
void loop() {
  voltage  = analogRead(ADC) * (5.0 / 1023.0);
  //На вход приходят данные преобразованные по АЦП (от 0 до 1023)
  //Опорное напряжение (в данном случае 5 вольт) делим на 1023 и получаем шаг 0.0049
  //Теперь умножаем пришедшие данные к примеру 409.6 на шаг 0.0049 и получаем значение 2.00704
  //В переменную voltage заносится результат 2.00704, это и есть наши вольты :) 
}

Многое стало понятно, спасибо вам большое!) Но всё таки остались еще некоторые вопросы.

1. А0 из 1 строчки кода это идентификатор аналогово вывода А0 на модуле? 

2. Для чего тут нужен Serial ума не приложу, он же не используется вроде? Или он нужен для получения данных с аналоговова вывода?

Ну и собственно вопросов больше нет, если я где-то что-то не правильно понял поправьте меня пожалуйста) Хочу понимать что у меня происходит в коде)

Nalik
Nalik аватар
Offline
Зарегистрирован: 02.02.2016

Andrey_Y_Ostanovsky пишет:

analogRead() отдает значение АЦП (0-1023) относительно опорного (AREF) или что у Вас на ардуине настроено как опорное напряжение.

Т.е. чтобы замерить на аналоговом выводе напряжение, мне нужно в момент замера подать на вывод AREF опорное напряжение в 5В? Я думал оно по умолчанию используется. 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

serial теперь не нужен

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

используется 5В в качестве опорного. ничего подавать не надо. если будешь внешнее опорное или внутреннее нужно править формулу и вписывать значение опорника

Nalik
Nalik аватар
Offline
Зарегистрирован: 02.02.2016

Нету тут "Спасибок" как на некотрых форумах или "Лучший ответ" :)

Только на словах, спасибо вам большое за помощь и пояснения)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

пожалуйста. нет кроме стрелочек справа в сообщении

Nalik
Nalik аватар
Offline
Зарегистрирован: 02.02.2016

Кстати не подскажите почему в случае если прописать эту строчку кода, программа компилируется, но при это летят ошибки:

#define ADC A0 //Идентификатор аналоговово вывода А0

Ошибки:

D:\Мои документы\Arduino\full_checkedi\full_checked.ino:2:0: warning: "ADC" redefined [enabled by default]

In file included from d:\программы\arduino\hardware\tools\avr\avr\include\avr\io.h:272:0,

                 from d:\программы\arduino\hardware\tools\avr\avr\include\avr\pgmspace.h:88,

                 from D:\Программы\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:28,

                 from sketch\full_checked.ino.cpp:1:

d:\программы\arduino\hardware\tools\avr\avr\include\avr\iom328p.h:446:0: note: this is the location of the previous definition

 #define ADC     _SFR_MEM16(0x78)

 ^

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а что это за строка 13? что она делает?

Nalik
Nalik аватар
Offline
Зарегистрирован: 02.02.2016

У меня нет такой строки, это все ошибки компилятора. Я их просто завернул на форуме в теги кода ардуино, чтобы удобнее читать было. И еще я вот не пойму, у меня на выводе А0 уже висит 1.5 вольта откуда-то. Как убрать это напряжение с А0? Я хочу замерить приходящее напряжение в 1 и 2 волтта, а получается что там по умолчанию уже висит 1.5 вольта))

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

замени ADC на любое другое название

Nalik
Nalik аватар
Offline
Зарегистрирован: 02.02.2016

Ну вот, ошибок больше не выдает :)

Без подключения естественно)

Как просто на плату подаем питание без подключений к чему либо, так там уже висит 1.5В)

Nalik
Nalik аватар
Offline
Зарегистрирован: 02.02.2016
#define analog_pin A0 //Идентификатор аналоговово вывода А0
float voltage = 0; //Переменная для хранения напряжения
int sleep_on_switch = 50; //Время нажатия на кнопку для включения и переключения

void setup() {
  // put your setup code here, to run once:
}

void loop() {
  voltage  = analogRead(analog_pin) * (5.0 / 1023.0); // считываем значение напряжения с аналоговова вывода
  if(voltage > 2) //Если напряжение есть
  {
    voltage =0; 
   //Сюда попадаем даже если на выводе А0 нет 2 вольт
  }
}

И еще у меня не правильно мереет напряжение. Попадает в if() даже если 2 вольта не подается на вывод

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Nalik, если вход висит в воздухе -он работает как антенна, и показания могуть быть любые. Что бы этого не было нужно его притянуть к общему проводу резистором. Либо должен быть подключен измеряемый сигнал.

Nalik
Nalik аватар
Offline
Зарегистрирован: 02.02.2016

К какому общему?

Я вот что сделал, к выводу А0 подсоеденил провод, который висит в воздухе и ждет когда я на него подам питание в 1-2В. После этого программа видит что питание на вывод пришло и нужно выполнять некие условия. 

Но сейчас выходит что в момент отключения внешнего питания, на нём появляется свое внутренее питание, которое мне мешает.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Nalik
Nalik аватар
Offline
Зарегистрирован: 02.02.2016

dimax пишет:

Боюсь эти 100кОм будут гасить мои 1-2 приходящих вольта :D 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Nalik, каким же дохлым должен быть сигнал, что б его несколько микроампер погасили?

Nalik
Nalik аватар
Offline
Зарегистрирован: 02.02.2016

Проверил практически, всё замечательно работает. Спасибо за помощь!)

Я тут еще краем уха слышал что это можно как-то программно реализовать? Т.е. сейчас я физически вешаю между сигналом 100кОм, а можно ли это сделать как-то программно, используя какой нибудь внутренний резистр? 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

в меге такого резистора нет, только к плюсу питания

Nalik
Nalik аватар
Offline
Зарегистрирован: 02.02.2016

jeka_tm пишет:

в меге такого резистора нет, только к плюсу питания

У меня нано :) Но там вроде только 20кОм)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

мега328

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Nalik пишет:
Т.е. чтобы замерить на аналоговом выводе напряжение, мне нужно в момент замера подать на вывод AREF опорное напряжение в 5В? Я думал оно по умолчанию используется.

Какое-то (по умолчанию vcc, а не 5V) - берется само, чтобы бралось какое нужно - это в сетапе можно указать.

Для измерения - сначала нужно выставить ноль, и, по-хорошему, подать образцовое напряжение - тогда коэффициенты пересчета будут более точными. Если просто для индикации - сойдет и так...