Кол-во оборотов с прерывание на измерение

GKS123
Offline
Зарегистрирован: 20.03.2019

Добрый день. Есть код которрый считает обороты с датчика (SX4009-P1). Выводит показания на семисегментый индикатор. Следующим этапом необходимо, сделать остановку через 1000 оборотов и произвести измерение с помощью датчика ads1115.  подскажите пожалуйста, а то я уже нифига не понимаю. спасибо

001/* ПРОГРАММА ДЛЯ ПОДСЧЕТА ИМПУЛЬСОВ
002 *  ПРИ ПОМОЩИ ОПТИЧЕСКОГО ДАТЧИКА
003 *  SX 4009-P1
004 *  с подтягиванием вывода OUT через
005 *  резистор 10к + 5V.
006 *  1 оборот = 2 импульса
007 *  Все работает нормально.
008 */
009#include <Bounce2.h>
010  
011#define RCLK 3    //12 pin 74hс595
012#define SCLK 4    //11 pin 74hс595
013#define DIO  5    //14 pin 74hс595
014 
015#define startPin  9
016#define stopPin  8
017#define sensPin  2
018#define ledPin   13
019#define motoPin   12
020 
021Bounce debouncer1 = Bounce();      // Создаем Bounce object для Кнопка startPin
022Bounce debouncer2 = Bounce();      // Создаем Bounce object для Кнопка sensPin
023 
024 boolean lastSens = LOW;           //переменная для хранения предыдущего состояния датчика
025 boolean currentSens = LOW;        // -/- текущего -/-
026 boolean ledOn = false;            //текущее состояние вывода ledPin
027 
028byte digitBuffer[8];
029 
030int Buffer=0;
031 
032void setup() {
033 
034   
035  pinMode(RCLK,OUTPUT);// 12 pin 74рс595
036  pinMode(SCLK,OUTPUT);// 11 pin 74рс595
037  pinMode(DIO,OUTPUT); // 14 pin 74рс595
038    
039  pinMode(startPin, INPUT_PULLUP);
040  debouncer1.attach(startPin);
041  debouncer1.interval(5);               
042  pinMode(stopPin, INPUT_PULLUP);
043  debouncer2.attach(stopPin);      
044  debouncer2.interval(5);
045    
046  pinMode(ledPin, OUTPUT);
047  pinMode(motoPin, OUTPUT);
048  pinMode(sensPin, INPUT);
049     
050 // Заполняем массив и выводим на дисплей 0000 
051 //при перекрытом датчике на дисплее 0000
052 //при открытом - 0001
053  digitBuffer[0]=0;
054  digitBuffer[1]=0;
055  digitBuffer[2]=0;
056  digitBuffer[3]=0;
057  digitBuffer[4]=0;
058  digitBuffer[5]=0;
059  digitBuffer[6]=0;
060  digitBuffer[7]=0;
061}
062//Функция сглаживания дребезга
063//принимает в качестве аргумента предыдущее состояние датчика
064//и выдет фактическое
065boolean debounce(boolean last)
066{
067  boolean current = digitalRead(sensPin);
068     if(last != current)
069     {
070      current = digitalRead(sensPin);
071      return current;
072     }
073}
074 
075void loop()
076{
077  debouncer1.update();
078  debouncer2.update();
079  int valueP = debouncer1.read();             // 9
080  int valueS = debouncer2.read();             // 8
081 
082  //Пуск-Стоп
083   
084    if(valueP == 0)                         //Если кн. ПУСК нажата,
085    {digitalWrite(motoPin, 1);}             //то включить МОТОР
086       
087    if(valueS == 0)                         //Если кн. СТОП нажата,
088    { digitalWrite(motoPin, 0);}            //то выключить МОТОР
089 
090    //Счетчик
091     
092  currentSens = debounce(lastSens);
093     if(lastSens == HIGH && currentSens == LOW)
094     {
095      ledOn = !ledOn;
096      Buffer++;
097      if(Buffer >=2){
098         Buffer=0;
099          digitBuffer[7]++;
100            if(digitBuffer[7]>=10){
101             digitBuffer[7]=0;
102             digitBuffer[6]++;
103               if(digitBuffer[6]>=10){
104                 digitBuffer[6]=0;
105                 digitBuffer[5]++;
106                  if(digitBuffer[5]>=10){
107                    digitBuffer[5]=0;
108                    digitBuffer[4]++;
109                     if(digitBuffer[4]>=10){
110                      digitBuffer[4]=0;
111                      digitBuffer[3]++;
112                       if(digitBuffer[3]>=10){
113                        digitBuffer[3]=0;
114                        digitBuffer[2]++;
115                         if(digitBuffer[2]>=10){
116                          digitBuffer[2]=0;
117                           digitBuffer[1]++;
118                            if(digitBuffer[1]>=10){
119                             digitBuffer[1]=0;
120                             digitBuffer[0]++;
121                              if(digitBuffer[0]>=10){
122                               digitBuffer[0]=0;
123                                
124          }}}}}}}}}}
125     lastSens = currentSens;
126     digitalWrite(ledPin, ledOn);
127   
128   
129  showDisplay();
130}
131  
132void showDisplay(){
133 
134  const byte digit[10]={ //маска для цифры
135  0b00111111,//0
136  0b00000110,//1
137  0b01011011,//2
138  0b01001111,//3
139  0b01100110,//4
140  0b01101101,//5
141  0b01111101,//6
142  0b00000111,//7
143  0b01111111,//8
144  0b01101111,//9
145};
146 
147const byte chr[8]={ //маска для разряда
148  0b11101111,
149  0b11011111,
150  0b10111111,
151  0b01111111,
152  0b11111110,
153  0b11111101,
154  0b11111011,
155  0b11110111,
156   
157};
158 
159//отправляем в цикле по 2 байта в сдвиговые регистры
160  for(byte i=0; i<=7; i++){
161    digitalWrite(RCLK, LOW);
162      shiftOut(DIO, SCLK, MSBFIRST, chr[i]);
163      shiftOut(DIO, SCLK, MSBFIRST, digit[digitBuffer[i]]);
164    digitalWrite(RCLK, HIGH);
165    //delay(500);         // с задержкой работает только при
166                        // низкой частоте импульсов (для контактных датчиков)
167  }
168}

 

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

ADS 1115  - это не датчик! Это аналого-цифровой преобразователь (АЦП). Считать он не умеет. Совсем.

GKS123
Offline
Зарегистрирован: 20.03.2019

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

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Какой МК?

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Да ему для начала нужно понять, куда if(oboroty==1000) воткнуть.

 

GKS123
Offline
Зарегистрирован: 20.03.2019

atmega328

GKS123
Offline
Зарегистрирован: 20.03.2019

Верно

GKS123
Offline
Зарегистрирован: 20.03.2019

Позвольте исправлю свой пост и вопрос. Счёт оборотов после измерения должен продолжаться. Т.е идёт счёт оборотов, прошлой 1000 оборотов, цикл прерывается для измерения, после чего продолжает считать и так через каждый 1000 оборотов

SLKH
Offline
Зарегистрирован: 17.08.2015

GKS123 пишет:
Позвольте исправлю свой пост и вопрос. Счёт оборотов после измерения должен продолжаться. Т.е идёт счёт оборотов, прошлой 1000 оборотов, цикл прерывается для измерения, после чего продолжает считать и так через каждый 1000 оборотов

а вопрос-то (хоть исходный, хоть исправленный) где?

GKS123
Offline
Зарегистрирован: 20.03.2019

SLKH пишет:

GKS123 пишет:
Позвольте исправлю свой пост и вопрос. Счёт оборотов после измерения должен продолжаться. Т.е идёт счёт оборотов, прошлой 1000 оборотов, цикл прерывается для измерения, после чего продолжает считать и так через каждый 1000 оборотов

а вопрос-то (хоть исходный, хоть исправленный) где?


подскажите пожалуйста как сделать остановку каждые 1000 оборотов

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

А прерывание не там применяешь. При каждом обороте функцию прерывания пишешь одной строкой      n++. 

Можно добавить вторую строку измерения переменной val.

А в скетче ждёшь if- ом свою тысячу.  И выдаёшь результат уже измеренной переменной.

(Если n=1000, тогда print val; n=0;)

Ты же не написал, что меряешь ... если сопротивение просто делителем резисторным на аналоговый вход - так это практически мгновенно. Если датчики тива DHT22/11 - тогда чуть сложнее.

И ещё: Твой героизм применения вручную сдвиговых регистров достоен, конечно, уважения ... только библиотеки же есть. Можно поискать такую с сохранением числа  на 4/7 до замены следующим. Иначе - не успеешь считать показания.  Мне такая попадалась.

Ну и напоминание ... прерывания возможны только на определённых пинах ардуинки.