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

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

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

/* ПРОГРАММА ДЛЯ ПОДСЧЕТА ИМПУЛЬСОВ 
 *  ПРИ ПОМОЩИ ОПТИЧЕСКОГО ДАТЧИКА
 *  SX 4009-P1
 *  с подтягиванием вывода OUT через 
 *  резистор 10к + 5V.
 *  1 оборот = 2 импульса
 *  Все работает нормально.
 */
#include <Bounce2.h>
 
#define RCLK 3    //12 pin 74hс595
#define SCLK 4    //11 pin 74hс595
#define DIO  5    //14 pin 74hс595

#define startPin  9
#define stopPin  8
#define sensPin  2
#define ledPin   13
#define motoPin   12

Bounce debouncer1 = Bounce();      // Создаем Bounce object для Кнопка startPin
Bounce debouncer2 = Bounce();      // Создаем Bounce object для Кнопка sensPin

 boolean lastSens = LOW;           //переменная для хранения предыдущего состояния датчика
 boolean currentSens = LOW;        // -/- текущего -/-
 boolean ledOn = false;            //текущее состояние вывода ledPin

byte digitBuffer[8];

int Buffer=0;

void setup() {

  
  pinMode(RCLK,OUTPUT);// 12 pin 74рс595
  pinMode(SCLK,OUTPUT);// 11 pin 74рс595
  pinMode(DIO,OUTPUT); // 14 pin 74рс595
   
  pinMode(startPin, INPUT_PULLUP); 
  debouncer1.attach(startPin);
  debouncer1.interval(5);                
  pinMode(stopPin, INPUT_PULLUP);
  debouncer2.attach(stopPin);       
  debouncer2.interval(5);
   
  pinMode(ledPin, OUTPUT);
  pinMode(motoPin, OUTPUT);
  pinMode(sensPin, INPUT);
    
 // Заполняем массив и выводим на дисплей 0000  
 //при перекрытом датчике на дисплее 0000
 //при открытом - 0001
  digitBuffer[0]=0;
  digitBuffer[1]=0;
  digitBuffer[2]=0;
  digitBuffer[3]=0;
  digitBuffer[4]=0;
  digitBuffer[5]=0;
  digitBuffer[6]=0;
  digitBuffer[7]=0;
}
//Функция сглаживания дребезга
//принимает в качестве аргумента предыдущее состояние датчика
//и выдет фактическое
boolean debounce(boolean last) 
{
  boolean current = digitalRead(sensPin);
     if(last != current)
     {
      current = digitalRead(sensPin);
      return current;
     }
}

void loop() 
{
  debouncer1.update();
  debouncer2.update();
  int valueP = debouncer1.read();             // 9
  int valueS = debouncer2.read();             // 8

  //Пуск-Стоп 
  
    if(valueP == 0)                         //Если кн. ПУСК нажата,
    {digitalWrite(motoPin, 1);}             //то включить МОТОР
      
    if(valueS == 0)                         //Если кн. СТОП нажата,
    { digitalWrite(motoPin, 0);}            //то выключить МОТОР

    //Счетчик
    
  currentSens = debounce(lastSens);
     if(lastSens == HIGH && currentSens == LOW)
     {
      ledOn = !ledOn;
      Buffer++;
      if(Buffer >=2){
         Buffer=0; 
          digitBuffer[7]++;
            if(digitBuffer[7]>=10){
             digitBuffer[7]=0;
             digitBuffer[6]++;
               if(digitBuffer[6]>=10){
                 digitBuffer[6]=0;
                 digitBuffer[5]++;
                  if(digitBuffer[5]>=10){
                    digitBuffer[5]=0;
                    digitBuffer[4]++;
                     if(digitBuffer[4]>=10){
                      digitBuffer[4]=0;
                      digitBuffer[3]++;
                       if(digitBuffer[3]>=10){
                        digitBuffer[3]=0;
                        digitBuffer[2]++;
                         if(digitBuffer[2]>=10){
                          digitBuffer[2]=0;
                           digitBuffer[1]++;
                            if(digitBuffer[1]>=10){
                             digitBuffer[1]=0;
                             digitBuffer[0]++;
                              if(digitBuffer[0]>=10){
                               digitBuffer[0]=0;
                               
          }}}}}}}}}}
     lastSens = currentSens;
     digitalWrite(ledPin, ledOn);
  
  
  showDisplay();
}
 
void showDisplay(){

  const byte digit[10]={ //маска для цифры
  0b00111111,//0
  0b00000110,//1
  0b01011011,//2
  0b01001111,//3
  0b01100110,//4
  0b01101101,//5
  0b01111101,//6
  0b00000111,//7
  0b01111111,//8
  0b01101111,//9
};

const byte chr[8]={ //маска для разряда
  0b11101111,
  0b11011111,
  0b10111111,
  0b01111111,
  0b11111110,
  0b11111101,
  0b11111011,
  0b11110111,
  
};

//отправляем в цикле по 2 байта в сдвиговые регистры
  for(byte i=0; i<=7; i++){
    digitalWrite(RCLK, LOW);
      shiftOut(DIO, SCLK, MSBFIRST, chr[i]);
      shiftOut(DIO, SCLK, MSBFIRST, digit[digitBuffer[i]]);
    digitalWrite(RCLK, HIGH);
    //delay(500);         // с задержкой работает только при
                        // низкой частоте импульсов (для контактных датчиков)
  }
}

 

Муж_Долговой
Муж_Долговой аватар
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 до замены следующим. Иначе - не успеешь считать показания.  Мне такая попадалась.

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