Кол-во оборотов с прерывание на измерение
- Войдите на сайт для отправки комментариев
Ср, 20/03/2019 - 17:17
Добрый день. Есть код которрый считает обороты с датчика (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); // с задержкой работает только при
// низкой частоте импульсов (для контактных датчиков)
}
}
ADS 1115 - это не датчик! Это аналого-цифровой преобразователь (АЦП). Считать он не умеет. Совсем.
Этот модуль будет использоваться для более точного измерения сопротивления.
Какой МК?
Да ему для начала нужно понять, куда if(oboroty==1000) воткнуть.
atmega328
Верно
Позвольте исправлю свой пост и вопрос. Счёт оборотов после измерения должен продолжаться. Т.е идёт счёт оборотов, прошлой 1000 оборотов, цикл прерывается для измерения, после чего продолжает считать и так через каждый 1000 оборотов
а вопрос-то (хоть исходный, хоть исправленный) где?
а вопрос-то (хоть исходный, хоть исправленный) где?
подскажите пожалуйста как сделать остановку каждые 1000 оборотов
А прерывание не там применяешь. При каждом обороте функцию прерывания пишешь одной строкой n++.
Можно добавить вторую строку измерения переменной val.
А в скетче ждёшь if- ом свою тысячу. И выдаёшь результат уже измеренной переменной.
(Если n=1000, тогда print val; n=0;)
Ты же не написал, что меряешь ... если сопротивение просто делителем резисторным на аналоговый вход - так это практически мгновенно. Если датчики тива DHT22/11 - тогда чуть сложнее.
И ещё: Твой героизм применения вручную сдвиговых регистров достоен, конечно, уважения ... только библиотеки же есть. Можно поискать такую с сохранением числа на 4/7 до замены следующим. Иначе - не успеешь считать показания. Мне такая попадалась.
Ну и напоминание ... прерывания возможны только на определённых пинах ардуинки.