нужна программа на ардуино ТАХОМЕТР

Тема в разделе "Закажу проект", создана пользователем Алекс_76_СССР, 14 ноя 2019.

  1. KindMan - что Вы сделали с прогой , хоть что-то запрыгало
    и как Вас отблагодарить.
    Может сможете ЕЕ и подлечить , чтобы заработала стабильно
     
  2. KindMan

    KindMan Гуру

    Если вас устраивает первый вариант с 1602, то вот ваш код без изменений, только вывод вместо 1602 на 7219
    Код (C++):
    #include <HCMAX7219.h>
    #define MAX7219_CS 10 //индикаторов
    #define MAX7219_DIN 11
    #define MAX7219_CLK 13

    HCMAX7219 MAX7219(MAX7219_CS);
    const int pinPhoto = A0; // порт для считывания данных с фоторизистора
    int light = 0; // переменная для хранения данных с фоторизистора
    int numTurn = 0; // номер итерации проверки оборотов
    int valArray[100]; // массив для хранения данных с фоторезистора, нужные для начальной настройки
    int maxLight = 1024;  // порог, при котором будем считать, что светодиод закрыт
    int sum = -1; // сумма количеств оборотов
    int count_zamer = 20; // количество итераций, после которых будет высчитано среднее значение скорости
    unsigned long lastMillis = 0; // переменная для хранения времени предыдущего перекрытия светодиода
    bool work = true; // флаг, который поднимается после открытия светодиода
    void setup() {
      Serial.begin(9600);
      pinMode( pinPhoto, INPUT );

      MAX7219.Intensity(7, 0);
      MAX7219.Clear();
      MAX7219.Refresh();
      // ждем пока светодиод прогреется
      delay(1000);
      // каждые 10 милисек считаем значение с фоторезистора, 100 раз
      for(int i = 0; i< 100; i++){
        valArray[i] = analogRead( pinPhoto );
        delay(10);
      }
      // выбераем минимальное значение с фоторезистора
      for(int i = 0; i< 100; i++){
        if(maxLight > valArray[i]) maxLight = valArray[i];
      }
      // немного снизим порог
      maxLight -= 10;
      Serial.println( maxLight );
      delay(500);
      Serial.println( "START!" );
     
      lastMillis = millis();
    }
    void loop() {
      // считаем показания с фоторезистора
      light = analogRead( pinPhoto );
      // если значение ниже порога, значит светодиод загорожен
      if(light < maxLight && work){
        // опускаем флаг, чтобы не считать, пока светодиод перекрыт
        work = false;
        // если первая итерация, то не считаем ее, чтобы начать отсчет времени
        if(sum == -1){
          // записываем время старта
          lastMillis = millis();
          sum = 0;
        }else{
          unsigned long currentMillis = millis();
          // записываем в sum количество миллисекунд между оборотами
          sum += (currentMillis - lastMillis);  
          numTurn++;
          // считаем 20 раз, для большей точности
          if(numTurn == count_zamer){
            float sredSpeed = 0;
            numTurn = 0;
            // берем среднее и высчитываем количество оборотов для минуты
            sredSpeed = 60000 / (sum / count_zamer); // оборотов в минуту
            Serial.print("speed: ");
            Serial.println(sredSpeed);
            sum = -1;
           
            MAX7219.Clear();
            MAX7219.print7Seg((uint16_t)sredSpeed, 8);
            MAX7219.Refresh();
          }
          lastMillis = currentMillis;
        }
      }
      // если светодиод не загорожен
      if(light >= maxLight){
        work = true;
      }
    }
     
    Daniil нравится это.
  3. 1. да, да , мне параллельный вывод не нужен на 1602.
    2. я вижу Вы почистили код )))
    3.Где ж Вы раньше были , два месяца мучался сам с прогой.

    а вопрос можно?? , на графический 7219 , тяжелее? код переделывать (дисплей на которых часы делают и бегущие строки) просто интересно
     
  4. KindMan

    KindMan Гуру

    Библиотека эта и матрицы поддерживает, думаю всё просто.
     
  5. Не знаю Вашего имени.
    я оч благодарен , реальный человек , рад очень.
    я выхожу, мне на работу пора в ночь собираться.
    Завтра вернусь в форум
    Я подписался на ВАС!!!!!!!!!!!
     
    Mestniy нравится это.