Кол-во оборотов с прерывание на измерение
- Войдите на сайт для отправки комментариев
Ср, 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 до замены следующим. Иначе - не успеешь считать показания. Мне такая попадалась.
Ну и напоминание ... прерывания возможны только на определённых пинах ардуинки.