Кол-во оборотов с прерывание на измерение
- Войдите на сайт для отправки комментариев
Ср, 20/03/2019 - 17:17
Добрый день. Есть код которрый считает обороты с датчика (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 |
021 | Bounce debouncer1 = Bounce(); // Создаем Bounce object для Кнопка startPin |
022 | Bounce debouncer2 = Bounce(); // Создаем Bounce object для Кнопка sensPin |
023 |
024 | boolean lastSens = LOW; //переменная для хранения предыдущего состояния датчика |
025 | boolean currentSens = LOW; // -/- текущего -/- |
026 | boolean ledOn = false ; //текущее состояние вывода ledPin |
027 |
028 | byte digitBuffer[8]; |
029 |
030 | int Buffer=0; |
031 |
032 | void 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 | //и выдет фактическое |
065 | boolean debounce(boolean last) |
066 | { |
067 | boolean current = digitalRead(sensPin); |
068 | if (last != current) |
069 | { |
070 | current = digitalRead(sensPin); |
071 | return current; |
072 | } |
073 | } |
074 |
075 | void 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 | |
132 | void 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 |
147 | const 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 | } |
ADS 1115 - это не датчик! Это аналого-цифровой преобразователь (АЦП). Считать он не умеет. Совсем.
Этот модуль будет использоваться для более точного измерения сопротивления.
Какой МК?
Да ему для начала нужно понять, куда if(oboroty==1000) воткнуть.
atmega328
Верно
Позвольте исправлю свой пост и вопрос. Счёт оборотов после измерения должен продолжаться. Т.е идёт счёт оборотов, прошлой 1000 оборотов, цикл прерывается для измерения, после чего продолжает считать и так через каждый 1000 оборотов
а вопрос-то (хоть исходный, хоть исправленный) где?
а вопрос-то (хоть исходный, хоть исправленный) где?
подскажите пожалуйста как сделать остановку каждые 1000 оборотов
А прерывание не там применяешь. При каждом обороте функцию прерывания пишешь одной строкой n++.
Можно добавить вторую строку измерения переменной val.
А в скетче ждёшь if- ом свою тысячу. И выдаёшь результат уже измеренной переменной.
(Если n=1000, тогда print val; n=0;)
Ты же не написал, что меряешь ... если сопротивение просто делителем резисторным на аналоговый вход - так это практически мгновенно. Если датчики тива DHT22/11 - тогда чуть сложнее.
И ещё: Твой героизм применения вручную сдвиговых регистров достоен, конечно, уважения ... только библиотеки же есть. Можно поискать такую с сохранением числа на 4/7 до замены следующим. Иначе - не успеешь считать показания. Мне такая попадалась.
Ну и напоминание ... прерывания возможны только на определённых пинах ардуинки.