min,max значения аналогового сигнала.

Тема в разделе "Arduino & Shields", создана пользователем REm, 24 сен 2017.

  1. REm

    REm Гик

    Подскажите, как правильно делают калибровку перед началом работы.
    Код (C++):

    int sensorValue = 0;      
    int sensorMin = 10268;      
    int sensorMax = 0;        
    void setup() {
      pinMode(13, OUTPUT);
      digitalWrite(13, HIGH);
     
      while (millis() < 25000) {
        sensorValue = analogRead(sensorPin);
     
        if (sensorValue > sensorMax) {
          sensorMax = sensorValue;
        }
         if (sensorValue < sensorMin) {
          sensorMin = sensorValue;
        }
      }
      digitalWrite(13, LOW);
     
  2. ORLENOK

    ORLENOK Гик

    А чем этот код не устраивает?
    У меня в методе loop каждые 3 секунды калибруется. Вообще, если все возможные варианты можно сразу сделать, то, я думаю, можно сделать так, как вы делали
     
  3. REm

    REm Гик

    не работает, фиксирует только максимальное значение. Думаю, проблем в остальном коде. Он в Фурье сигнал гоняет.
     
  4. NikitOS

    NikitOS Король шутов Администратор

    Как 0 может быть больше...10268
     
  5. ostrov

    ostrov Гуру

    А как 8-битный АЦП может принимать значение 10268?
     
  6. ORLENOK

    ORLENOK Гик

    Странно, у меня такой код и всё ок:
    Код (C++):

    int minFoto = 500;
    int maxFoto = 0;
    int fotoRes = A1;

    void loop() {
      int tempFoto = analogRead(fotoRes);
      if((millis()/1000) % 3 == 0)
        fotoCalibr(tempFoto);
    }
    void fotoCalibr(int currentFoto)
    {
      if(currentFoto > maxFoto)
        maxFoto = currentFoto;
      if(currentFoto < minFoto)
        minFoto = currentFoto;
    }
    А если в Serial выводить значения, то какой минимум наблюдается? И есть ли что-то перед калибровкой или во время?
     
  7. REm

    REm Гик

    Должно быть у меня проблема в том, что я стыковал два кода.

    Код (C++):

    #include <Goertzel.h>

    int sensorPin = A0;
    int led = 13;
    float  counter = 0;
    float  counter2 = 0;
      float TARGET_FREQUENCY = 100;
      const int N = 200;  
    const float THRESHOLD = 7950;  
    const float SAMPLING_FREQUENCY = 8900;
    Goertzel goertzel = Goertzel(TARGET_FREQUENCY, N, SAMPLING_FREQUENCY);
    // переменные фильтра диапазона датчика
    int sensorValue = 0;         // значение, полученное от сенсора
    int sensorMin = 0;        // минимальное значение от сенсора
    int sensorMax = 0;           // максимальное значение от сенсора
    void setup(){
      pinMode(led, OUTPUT);  
      Serial.begin(9600);
      // включаем светодиод, чтобы оповестить о начале калибровочного периода:
      digitalWrite(13, HIGH);
      // считываем данные в течение первых пяти секунд:
      while (millis() < 5000) {
        sensorValue = goertzel.detect();
        // записываем максимальное значение, считанное от сенсора:
        if (sensorValue > sensorMax) {
          sensorMax = sensorValue;
        }
        // записываем минимальное значение, считанное от сенсора:
        if (sensorValue < sensorMin) {
          sensorMin = sensorValue;
        }
      }
      // выключаем светодиод, оповещая о конце калибровочного периода:
      digitalWrite(13, LOW);
    }

    void loop()
    {
      goertzel.sample(sensorPin); //Will take n samples
      float magnitude = goertzel.detect();  //check them for target_freq
                      if (magnitude>THRESHOLD) {
                      digitalWrite(led, HIGH); counter++;
      }
      else {
        digitalWrite(led, LOW); counter = counter;
      }
      if (counter >= 100) {
        counter = 0;
        }
      if (counter >= 99) {
        counter2 ++;
      }
      else {
        counter2 = counter2;
    }
      //Serial.println(magnitude);
       Serial.print("sensorMin = "); // выводим значение по x
    Serial.println(sensorMin);
      Serial.print("sensorMax = "); // выводим значение по x
      Serial.println(sensorMax);
    }

     
     
  8. ORLENOK

    ORLENOK Гик

    Не очень я понял, как пользоваться библиотекой Goertzel.
    Возможно нужно сделать так:
    и так:
    Ещё я не знаю, в каком диапазоне могут быть значения goertzel.detect();
     
  9. DIYMan

    DIYMan Guest

    Или я чего не понял, или одно из двух :) Почему не работает? Зачем не работает?

    Код (C++):
    #define MIN_SENSOR_VAL 0
    #define MAX_SENSOR_VAL 1024
    #define CALIBRATION_PASSES 20

    int sensorMin = MAX_SENSOR_VAL;
    int sensorMax = MIN_SENSOR_VAL;

    void setup()
    {
        for(int i=0;i<CALIBRATION_PASSES;i++)
        {
            int sensorVal = analogRead(sensorPin);
            sensorMin = min(sensorMin,sensorVal);
            sensorMax = max(sensorMax,sensorVal);
        }
    }
    Не?
     
  10. ORLENOK

    ORLENOK Гик

    Этот код работать будет. Но тут значение не преобразованные будут. Я так понял нужны преобразованные данные. Что именно делает та библиотека, я к сожалению не знаю. Зачем вообще там весь loop нужен - не очень понятно. Есть ещё разница в том, что у вас считывается 20 раз, а там условно 20 секунд.
     
  11. DIYMan

    DIYMan Guest

    Ну я ж условно обрисовал, главное - принцип ;)
    Встроенный макрос map никто не отменял ;) После чтения с АЦП и получения мин и макс значений - кличем map, примерно так:

    Код (C++):
    sensorMin = map(sensorMin, 0, MAX_SENSOR_VAL, 0, какое-там у нас макс значение нужно).
    И всё ;)
     
  12. REm

    REm Гик

    если в порт дать данные магнитуды, то видно наводку 50 Гц, значения я эти обрабатываю. Потому они высокие такие. И map, в данном случае, не нужно.
     

    Вложения:

    • z.jpg
      z.jpg
      Размер файла:
      91,5 КБ
      Просмотров:
      824