ожидание всех импульсов

Тема в разделе "Arduino & Shields", создана пользователем Suro, 5 июл 2017.

  1. Suro

    Suro Нерд

    Сначала скетч ждёт первый импульс.
    Захватывает текущее время и считает импульсы, пока время меньше 3 сек.
    Через 3 сек проверяет сколько импульсов пришло.
    Если не менее 20 , мигает 14 раз и возвращается к ожиданию первого импульса.
    Если не менее 10, мигает 10 раз и вощвращается к ожиданию первого импульса.

    помогите в скетче пожалуйста
     
  2. DetSimen

    DetSimen Guest

    Вам не кажется, что если сработало условие "не менее 20", то и "не менее 10" сработает?
    Может логику надо описать внятно?
     
  3. Suro

    Suro Нерд

    Точнее так.
    Сначала скетч ждёт первый импульс.
    Захватывает текущее время и считает импульсы, пока время меньше 3 сек.
    Через 3 сек проверяет сколько импульсов пришло.
    Если пришло 10 импульсов - мигает 14 раз.
    Если пришло 20 импульсов - мигает 10 раз.
     
  4. warman

    warman Гик

    прерывание и millis()
    при начале подсчета считываем значение миллисекунд
    каждое нажатие генерирует прерывание, в обработчике - инкремент числовой переменной при условии, что разница в миллисекунда между началом счета и текущим нажатием меньше 3000, иначе остановить счет.
    затем if | elseif | endif
     
  5. Suro

    Suro Нерд

    можете показать пример??????
     
  6. Suro

    Suro Нерд

    ??????????
     
  7. Unixon

    Unixon Оракул Модератор

    Код (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;
      }
    }
     
  8. Семен C.

    Семен C. Нерд

    а куда планируется ? я писал тахометр для машины... тоже считает импульсы... могу скинуть код... он меряет время между импульсами и пересчитывает в обороты в минуту..точнее импульсы в минуту... надо могу кинуть код.
     
  9. Suro

    Suro Нерд

    да кинте пожалуйста )
     
  10. Семен C.

    Семен C. Нерд

    генератор на котором тестировал ... писал для себя поэтому коментов нет...

    Код (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() { //функция чтения с карты и вывода на экран

    }

     
     
  11. Suro

    Suro Нерд


    очень спосибо брат )