Не работает скетч- сбой

mehub

★✩✩✩✩✩✩
12 Дек 2020
32
10
Скетч
C++:
#include <Adafruit_ADS1015.h>//подключил библиотеку для модуля АЦП ADS1115. С вывода А2 этого модуля снимаю напряжения до 2 вольт




#include <Wire.h>// подключил библиотеку I2C. АЦП с ардуино общается по нему.

Adafruit_ADS1115 ads(0x48);// инициализация для работы данного модуля

void setup() {
Serial.begin(9600);
ads.setGain(GAIN_SIXTEEN);// устанавливается коэффициент усиления модуля ADS 1115 - шестнадцать.

// put your setup code here, to run once:

}

void loop() {
int16_t adc2;// объявляется переменная adc2
adc2=ads.readADC_SingleEnded(2);//этой переменной присваиваются биты напряжения, поступающие на А2 модуля
Serial.println (adc2);//в монитор порта пишутся эти биты напряжения
delay(2000);

}
Этот скетч у меня работает. Но мне бы надо, чтобы эта программа работала бы по прерыванию 1 (вывод D3). Не работает никак. Смотрю скетчи по прерываниям, сопоставлять, но - никак не выходит. Если не сложно- покажите- как правильно написать ..
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,448
981

@mehub, что за прерывание должно инициировать чтение данных?
 

mehub

★✩✩✩✩✩✩
12 Дек 2020
32
10
Прерывание- Фотодиод-светодиод в модуле для ардуино (датчик препятствия- приспособленный для моей цели). Я вместо прерывания написал в скетче условие if. И оказывается, что замер выводится в порт монитора через пол-секунды. Это очень много, и не подходит для данного проекта. Понятно, почему при прерывании ADS1115 не успевало сделать замер. Тогда пока- всё.
 

mehub

★✩✩✩✩✩✩
12 Дек 2020
32
10
Если интересно: почему этот проект не получился. Я пробовал делать замер напряжения и по условию, и использовал свою функцию: то есть монету вставляю в гнездо, и когда монета перекрывает просвет между излучающим диодом и фотодиодом- происходит команда замера напряжения с потенциометра. ( Монета толкает металлический шток вверх и через передачу происходит поворот оси потенциометра. Чем больше монета, тем больше поворот оси). Когда монета максимально толкает шток вверх- тогда она и перекрывает просвет между излучающим диодом и фотодиодом. В этот момент происходит команда замера напряжения с потенциометра на модуль ADS 1115/ Почему я использовал этот модуль для замеров? Потому, что он гораздо чувствительнее, чем входной АЦП в самой Ардуино. Но проблема проявилась в том , что иногда происходит такой сбой: при новом замере (когда в новый раз перекрывается просвет между излучающим диодом и фотодиодом) ардуино делает исполнительную программу ещё по предыдущему замеру. То есть предыдущий замер находится где-то в памяти и исполняется его команда при уже свежем замере. (
C++:
#include <Adafruit_ADS1015.h>// библиотека для ADS 1115




#include <Wire.h>//библиотека для I2C

Adafruit_ADS1115 ads(0x48);// инициализация для модуля ADS1115
int16_t adc2;// переменная adc2 для хранения входных напряжений
void setup() {

  ads.setGain(GAIN_SIXTEEN);// коэффициент усиления ADS1115 установлен- шестнадцать
  pinMode(3,INPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);
  // put your setup code here, to run once:

}

void loop() {
if (digitalRead(3)==HIGH ){
  adc2=ads.readADC_SingleEnded(2);
  qq(adc2);// если просвет между излучающим и фотодиодом затемнён (монета стоит), то переменной adc2 присваивается биты входного напряжения и запускается своя функция qq
  // put your main code here, to run repeatedly:

}}
void qq(int16_t a){

if(a>7000&&a<8600){ // если 1 рубль, то светодод горит на D8
  digitalWrite(8,HIGH);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);}
  else if(a>11000&&a<12250){// если 10 рублей, то горит светодиод на D9
    digitalWrite(8,LOW);
  digitalWrite(9,HIGH);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);}

  else if(a>14100&&a<14400){// если 2 рубля, то горит светодиод на D10
    digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,HIGH);
  digitalWrite(11,LOW);}

  else if(a>19000&&a<21000){// если 5 рублей, то горит светодиод на D11
    digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,HIGH);}


  }
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,448
981
@mehub, очень много предположений и сваливаний с больной головы на здоровую.
Встроенного АЦП было бы достаточно для Ваших нужд, скорость измерений там можно изменять. По крайней мере попробовать можно было легко.
Выбранный Вами АЦП, судя по datasheet, может измерять 860 раз в секунду. Небольшая задержка возникает при передаче данных по I2C, но явно не дольше интервала между монетами. А "обработка" занимает микросекунды. В конце-концов тоже можно было провести эксперимент и замерить длительность выполнения функции чтения. Был успешный опыт использования этой микросхемы для анализа формы сетевого напряжения, правда библиотеки я не использовал. Только имейте в виду, что скорость 9600 на серийном порту будет давать больше задержек, чем всё остальное вместе взятое.
Ну, и приведенный код никак не бьётся с заявленным названием: прерываний в коде мы так и не увидели.
 

mehub

★✩✩✩✩✩✩
12 Дек 2020
32
10
Монету замерил- убрал её. Фото-датчик после этого не даёт команду замера. Проходит, например, минута. Помещается другая монета. Фото-датчик даёт команду нового замера. Но при новом замере выполняется команда как при предыдущем замере. Такой вот сбой. Но так- не всегда. Бывает, что второй замер обрабатывается и правильно. Название темы надо изменить- если пойму- как.
 

bort707

★★★★★★✩
21 Сен 2020
3,168
934
Такой вот сбой.
вопрос, где в приведенном коде прерывание?
Или это уже исправленный код, когда с прерыванием не пошло?

Если вы спрашиваете совета про прерывание - то надо код с прерыванием и выкладывать.

Добавка
Вы, случаем, функцию readADC_SingleEnded(2); не пытались прям в прерывании вызывать? - если да, то как раз такое поведение и будет, как вы описали.
 
Изменено: