int volts = 0; //Переменная для хранения напряжения
void setup() {
// put your setup code here, to run once:
}
void loop() {
volts = analogRead(3); // считываем значение вольта с аналоговова вывода
if(volts > 0) //Если напряжение есть
{
volts = 0; //Сбросить напряжение
//...выполнение каких-то действий
}
}
Отсеял ненужную часть кода (а именно замер времени выполнения)
Получился такой вариант:
#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 ума не приложу, он же не используется вроде? Или он нужен для получения данных с аналоговова вывода?
Ну и собственно вопросов больше нет, если я где-то что-то не правильно понял поправьте меня пожалуйста) Хочу понимать что у меня происходит в коде)
analogRead() отдает значение АЦП (0-1023) относительно опорного (AREF) или что у Вас на ардуине настроено как опорное напряжение.
Т.е. чтобы замерить на аналоговом выводе напряжение, мне нужно в момент замера подать на вывод AREF опорное напряжение в 5В? Я думал оно по умолчанию используется.
А0 конечно аналоговый пин)) таким образом просто удобно настраивать программу, не нужно искать в коде и менять, а меняешь сверху
используется 5В в качестве опорного. ничего подавать не надо. если будешь внешнее опорное или внутреннее нужно править формулу и вписывать значение опорника
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)
^
У меня нет такой строки, это все ошибки компилятора. Я их просто завернул на форуме в теги кода ардуино, чтобы удобнее читать было. И еще я вот не пойму, у меня на выводе А0 уже висит 1.5 вольта откуда-то. Как убрать это напряжение с А0? Я хочу замерить приходящее напряжение в 1 и 2 волтта, а получается что там по умолчанию уже висит 1.5 вольта))
#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 вольта не подается на вывод
Nalik, если вход висит в воздухе -он работает как антенна, и показания могуть быть любые. Что бы этого не было нужно его притянуть к общему проводу резистором. Либо должен быть подключен измеряемый сигнал.
Я вот что сделал, к выводу А0 подсоеденил провод, который висит в воздухе и ждет когда я на него подам питание в 1-2В. После этого программа видит что питание на вывод пришло и нужно выполнять некие условия.
Но сейчас выходит что в момент отключения внешнего питания, на нём появляется свое внутренее питание, которое мне мешает.
Проверил практически, всё замечательно работает. Спасибо за помощь!)
Я тут еще краем уха слышал что это можно как-то программно реализовать? Т.е. сейчас я физически вешаю между сигналом 100кОм, а можно ли это сделать как-то программно, используя какой нибудь внутренний резистр?
Т.е. чтобы замерить на аналоговом выводе напряжение, мне нужно в момент замера подать на вывод AREF опорное напряжение в 5В? Я думал оно по умолчанию используется.
Какое-то (по умолчанию vcc, а не 5V) - берется само, чтобы бралось какое нужно - это в сетапе можно указать.
Для измерения - сначала нужно выставить ноль, и, по-хорошему, подать образцовое напряжение - тогда коэффициенты пересчета будут более точными. Если просто для индикации - сойдет и так...
гугли. совсем ленивый
гугли. совсем ленивый
Это да :)
Но у меня есть наработки, проверите?)
int volts = 0; //Переменная для хранения напряжения void setup() { // put your setup code here, to run once: } void loop() { volts = analogRead(3); // считываем значение вольта с аналоговова вывода if(volts > 0) //Если напряжение есть { volts = 0; //Сбросить напряжение //...выполнение каких-то действий } }посмотри
http://arduino.ru/forum/obshchii/vremya-na-ispolnenie-raznykh-funktsii#c...
analogRead() отдает значение АЦП (0-1023) относительно опорного (AREF) или что у Вас на ардуине настроено как опорное напряжение.
посмотри
http://arduino.ru/forum/obshchii/vremya-na-ispolnenie-raznykh-funktsii#c...
Посмотрел)
Отсеял ненужную часть кода (а именно замер времени выполнения)
Получился такой вариант:
#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 ума не приложу, он же не используется вроде? Или он нужен для получения данных с аналоговова вывода?
Ну и собственно вопросов больше нет, если я где-то что-то не правильно понял поправьте меня пожалуйста) Хочу понимать что у меня происходит в коде)
analogRead() отдает значение АЦП (0-1023) относительно опорного (AREF) или что у Вас на ардуине настроено как опорное напряжение.
Т.е. чтобы замерить на аналоговом выводе напряжение, мне нужно в момент замера подать на вывод AREF опорное напряжение в 5В? Я думал оно по умолчанию используется.
serial теперь не нужен
А0 конечно аналоговый пин)) таким образом просто удобно настраивать программу, не нужно искать в коде и менять, а меняешь сверху
используется 5В в качестве опорного. ничего подавать не надо. если будешь внешнее опорное или внутреннее нужно править формулу и вписывать значение опорника
Нету тут "Спасибок" как на некотрых форумах или "Лучший ответ" :)
Только на словах, спасибо вам большое за помощь и пояснения)
пожалуйста. нет кроме стрелочек справа в сообщении
Кстати не подскажите почему в случае если прописать эту строчку кода, программа компилируется, но при это летят ошибки:
Ошибки:
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) ^а что это за строка 13? что она делает?
У меня нет такой строки, это все ошибки компилятора. Я их просто завернул на форуме в теги кода ардуино, чтобы удобнее читать было. И еще я вот не пойму, у меня на выводе А0 уже висит 1.5 вольта откуда-то. Как убрать это напряжение с А0? Я хочу замерить приходящее напряжение в 1 и 2 волтта, а получается что там по умолчанию уже висит 1.5 вольта))
смотри схему по поводу 1.5В. или без подключения там уже висит?
замени ADC на любое другое название
Ну вот, ошибок больше не выдает :)
Без подключения естественно)
Как просто на плату подаем питание без подключений к чему либо, так там уже висит 1.5В)
#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 вольта не подается на вывод
Nalik, если вход висит в воздухе -он работает как антенна, и показания могуть быть любые. Что бы этого не было нужно его притянуть к общему проводу резистором. Либо должен быть подключен измеряемый сигнал.
К какому общему?
Я вот что сделал, к выводу А0 подсоеденил провод, который висит в воздухе и ждет когда я на него подам питание в 1-2В. После этого программа видит что питание на вывод пришло и нужно выполнять некие условия.
Но сейчас выходит что в момент отключения внешнего питания, на нём появляется свое внутренее питание, которое мне мешает.
Боюсь эти 100кОм будут гасить мои 1-2 приходящих вольта :D
Nalik, каким же дохлым должен быть сигнал, что б его несколько микроампер погасили?
Проверил практически, всё замечательно работает. Спасибо за помощь!)
Я тут еще краем уха слышал что это можно как-то программно реализовать? Т.е. сейчас я физически вешаю между сигналом 100кОм, а можно ли это сделать как-то программно, используя какой нибудь внутренний резистр?
в меге такого резистора нет, только к плюсу питания
в меге такого резистора нет, только к плюсу питания
У меня нано :) Но там вроде только 20кОм)
мега328
Какое-то (по умолчанию vcc, а не 5V) - берется само, чтобы бралось какое нужно - это в сетапе можно указать.
Для измерения - сначала нужно выставить ноль, и, по-хорошему, подать образцовое напряжение - тогда коэффициенты пересчета будут более точными. Если просто для индикации - сойдет и так...