Сначала скетч ждёт первый импульс. Захватывает текущее время и считает импульсы, пока время меньше 3 сек. Через 3 сек проверяет сколько импульсов пришло. Если не менее 20 , мигает 14 раз и возвращается к ожиданию первого импульса. Если не менее 10, мигает 10 раз и вощвращается к ожиданию первого импульса. помогите в скетче пожалуйста
Вам не кажется, что если сработало условие "не менее 20", то и "не менее 10" сработает? Может логику надо описать внятно?
Точнее так. Сначала скетч ждёт первый импульс. Захватывает текущее время и считает импульсы, пока время меньше 3 сек. Через 3 сек проверяет сколько импульсов пришло. Если пришло 10 импульсов - мигает 14 раз. Если пришло 20 импульсов - мигает 10 раз.
прерывание и millis() при начале подсчета считываем значение миллисекунд каждое нажатие генерирует прерывание, в обработчике - инкремент числовой переменной при условии, что разница в миллисекунда между началом счета и текущим нажатием меньше 3000, иначе остановить счет. затем if | elseif | endif
Код (C++): #define PIN_INPUT 2 #define PIN_OUTPUT 13 #define N_PULSE_1 10 #define N_PULSE_2 20 #define N_PULSE_MAX 255 #define N_BLINK_1 10 #define N_BLINK_2 14 #define TIMEOUT_MS 300 #define DELAY_BLINK_MS 500 uint8_t counter; long int t0; void countPulse() { if (counter<N_PULSE_MAX) counter++; } void blinkLED(uint8_t count, int onTime, int offTime) { for (uint8_t i=0; i<count; i++) { digitalWrite(PIN_OUTPUT, HIGH); delay(onTime); digitalWrite(PIN_OUTPUT, LOW); delay(offTime); } } void setup() { pinMode(PIN_OUTPUT, OUTPUT); counter = 0; t0 = millis(); attachInterrupt(PIN_INPUT, countPulse, RISING); } void loop() { long int t = millis(); if ((t-t0)>TIMEOUT_MS) { uint8_t n = counter; if (n>=N_PULSE_2) { blinkLED(N_BLINK_2, DELAY_BLINK_MS, DELAY_BLINK_MS); } else if (n>=N_BLINK_1) { blinkLED(N_BLINK_1, DELAY_BLINK_MS, DELAY_BLINK_MS); } counter = 0; t0 = t; } }
а куда планируется ? я писал тахометр для машины... тоже считает импульсы... могу скинуть код... он меряет время между импульсами и пересчитывает в обороты в минуту..точнее импульсы в минуту... надо могу кинуть код.
генератор на котором тестировал ... писал для себя поэтому коментов нет... Код (C++): unsigned long int time; unsigned long int time2; float wait, oborots; void setup() { pinMode(12, OUTPUT); time = millis(); Serial.begin (9600); } void loop() { for ( oborots = 800; oborots < 5000; oborots) { wait = ((1000000 / (oborots / 60)) - 500); if ((micros() - time) > (wait)) { digitalWrite (12, HIGH); /* time2 = micros() - time; Serial.print (oborots); Serial.print (" "); Serial.print (wait); Serial.print (" "); Serial.print (time2); Serial.print (" "); Serial.println (micros());*/ time = micros(); oborots = oborots + 1; digitalWrite (12, LOW); } } for ( oborots = 5000; oborots > 800; oborots) { wait = ((1000000 / (oborots / 60)) - 500); if ((micros() - time) > (wait)) { digitalWrite (12, HIGH); /*time2 = micros() - time; Serial.print (oborots); Serial.print (" "); Serial.print (wait); Serial.print (" "); Serial.println (time2); Serial.print (" "); Serial.println (micros());*/ time = micros(); oborots = oborots - 1; digitalWrite (12, LOW); } } } тахометр Код (C++): #include <TouchScreen.h> #include <Adafruit_GFX.h>// подключаем библотеку экрана #include <gfxfont.h>// фонт для вывода #include <MCUFRIEND_kbv.h> // драйвер экрана #define LCD_RD A0 //для LCD #define LCD_WR A1 //и для LCD и для сенсора #define LCD_RS A2 //и для LCD и для сенсора #define LCD_CS A3 //для LCD #define BLACK 0x0000 #define BLUE 0x001A #define RED 0xFBEF #define GREEN 0x07E0 //#define CYAN 0x33FF #define CYAN 0xDDFF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF #define YM 7 // для сенсора #define XP 6 // для сенсора //SD CARD //SD_SS=CS=10 SD_DI=MOSI=11 SD_DO=MISO=12 SD_SCK=CLK=13 #include <SD.h> #include <SPI.h> #define SD_CS 10 //пин картридера File myFile; uint8_t G = 0x0000; // данные чтения с карты uint8_t B = 0x0000; // данные чтения с карты MCUFRIEND_kbv tft; volatile unsigned long int time = 0; //для учета оборотов volatile unsigned long int time_last = 0;//для учета оборотов volatile unsigned long int rpm_array[5] = {0, 0, 0, 0, 0};//для учета оборотов volatile unsigned long int rpm;//для учета оборотов int unsigned long time_screen;//для ограничения вывода на экран float x1, y1, x2, y2, h; //для вывода тахометра по кругу int clockCenterX = 319; //для вывода тахометра по кругу int clockCenterY = 239; //для вывода тахометра по кругу int x3, y3, x4, y4;//для вывода тахометра по кругу TouchScreen ts = TouchScreen(XP, LCD_RS, LCD_WR, YM, 269);// TouchScreen ts = TouchScreen(XP, YP, XM, YM, 269); short TS_MINX = 20; short TS_MINY = 20; short TS_MAXX = 920; short TS_MAXY = 940; int Y, X; int tipvivoda = 0; // флаг для переключения типа отображения; void setup() { tft.reset(); uint16_t identifier = tft.readID(); tft.begin(identifier); tft.setRotation(1); tft.fillScreen(BLACK); tft.setTextSize(5); Serial.begin(9600); time_screen = millis(); if (tipvivoda == 1) { riski(); //рисуем черточки и цифры } attachInterrupt(4, merilka, RISING); } void loop() { if ((millis() - time_screen ) > 200) { if (tipvivoda == 0) { printscreen(); time_screen = millis(); } else { drawscreen(((rpm - 600) / 100)); time_screen = millis(); } } sensor(); if ((X > 0) && (Y > 0)) { detachInterrupt(4); if (tipvivoda == 0) { tipvivoda = 1; tft.fillScreen(BLACK); riski(); } else { tipvivoda = 0; tft.fillScreen(BLACK); tft.setTextSize(5); } attachInterrupt(4, merilka, RISING); } } void merilka () { //измеряем обороты detachInterrupt(4); time = (micros() - time_last); time_last = micros(); rpm_array[0] = rpm_array[1]; rpm_array[1] = rpm_array[2]; rpm_array[2] = rpm_array[3]; rpm_array[3] = rpm_array[4]; rpm_array[4] = 60 * (1000000 / (time)); rpm = (rpm_array[0] + rpm_array[1] + rpm_array[2] + rpm_array[3] + rpm_array[4]) / 5; attachInterrupt(4, merilka, RISING); } void printscreen() { // выводим цифрами detachInterrupt(4); tft.setCursor(0, 0); tft.setTextColor(CYAN , BLACK); tft.print (rpm); tft.print (" "); //Serial.println(time); attachInterrupt(4, merilka, RISING); } void drawscreen(int h) { //выводим стрелкой tft.fillTriangle(x1, y1, x2 - 4, y2 + 4, x2 + 4, y2 - 4, BLACK); /*tft.drawLine(x1, y1, x2, y2 , BLACK); /* tft.drawLine(x1+1, y1+1, x2+1, y2+1 , BLACK); tft.drawLine(x1-1, y1-1, x2-1, y2-1 , BLACK);*/ h = h * 2; h = h + 180; x1 = 210 * cos(h * 0.0175); y1 = 210 * sin(h * 0.0175); x2 = 180 * cos(h * 0.0175); y2 = 180 * sin(h * 0.0175); x3 = (x1 + clockCenterX); y3 = (y1 + clockCenterY); x4 = (x2 + clockCenterX); y4 = (y2 + clockCenterY); tft.fillTriangle(x3, y3, x4 - 4, y4 + 4, x4 + 4, y4 - 4, CYAN); /*tft.drawLine(x3, y3, x4, y4 , CYAN); tft.drawLine(x3+1, y3+1, x4+1, y4+1 , CYAN); tft.drawLine(x3-1, y3-1, x4-1, y4-1 , CYAN);*/ x1 = x3; x2 = x4; y1 = y3; y2 = y4; } void riski() { //рисуем циферблат tft.drawCircle(319, 239, 172, CYAN); tft.drawCircle(319, 239, 211, CYAN); for (float n = 0; n < 5; n++) { for (float i = -1; i < 2; i) { h = 183 + i * 0.25 + n * 20; x1 = 220 * cos(h * 0.0175); y1 = 220 * sin(h * 0.0175); x2 = 210 * cos(h * 0.0175); y2 = 210 * sin(h * 0.0175); x3 = (x1 + clockCenterX); y3 = (y1 + clockCenterY); x4 = (x2 + clockCenterX); y4 = (y2 + clockCenterY); tft.drawLine(x3, y3, x4, y4 , CYAN); i = i + 1; } } tft.setCursor(85, 215); tft.setTextColor(CYAN , BLACK); tft.setTextSize(3); tft.print (1); tft.setCursor(98, 137); tft.print (2); tft.setCursor(140, 72); tft.print (3); tft.setCursor(203, 25); tft.print (4); tft.setCursor(300, 0); tft.print (5); } String utf8rus(String source) // вывод русских букв { int i, k; String target; unsigned char n; char m[2] = { '0', '\0' }; k = source.length(); i = 0; while (i < k) { n = source[i]; i++; if (n >= 0xBF) { switch (n) { case 0xD0: { n = source[i]; i++; if (n == 0x81) { n = 0xA8; break; } if (n >= 0x90 && n <= 0xBF) n = n + 0x2F; break; } case 0xD1: { n = source[i]; i++; if (n == 0x91) { n = 0xB7; break; } if (n >= 0x80 && n <= 0x8F) n = n + 0x6F; break; } } } m[0] = n; target = target + String(m); } return target; } void sensor(void) // опрос сенсора экрана { TSPoint tem = ts.getPoint(); X = 0; Y = 0; pinMode(LCD_WR, OUTPUT);// для сенсорного экрана pinMode(LCD_RS, OUTPUT);// для сенсорного экрана if (tem.z > 0) { Y = (map(tem.x, TS_MINX, TS_MAXX, tft.height(), 0)); X = (map(tem.y, TS_MINY, TS_MAXY, tft.width(), 0)); X = X - 14; Y = Y - 14; if (X < 0) { X = 0; } if (Y < 0) { Y = 0; } X = X * 1.172; Y = Y * 1.23; if (X > 320) { X = 320; } if (Y > 240) { Y = 240; } //tft.drawFastHLine(X,Y,2,RED); } } void knopki() { //функция чтения с карты и вывода на экран }