Вопросы по DSN-VC288

Ну, если вы в этом уверены, то инициализируйте ее нулем. А если таки напряжение/ток при старте уже будут? :wink:

Значение переменной будет менятся при каждом вызове, а не только при первом проходе.

@v258
Мне кажется, у него не в этом затык.
Он думает, что статическая переменная как иницировалась (например нулем), так потом больше и не меняется…

1 лайк

Это думает не “он”, а ардуино. :slight_smile:

Ну так я угадал?

Если да, то это бред.
И если у вас “факты” это подтвердили - значит эти факты неверные

Ардуино вообще не думает. Не умеет ))

1 лайк

@KovAl
разберитесь, что написано во второй строке

и для вас станет очевидным, почему строчкой выше Х должен быть static

PS А если не станет - значит вы просто не понимаете код… учитесь

    static uint16_t sensorValue2 = analogRead(A7);// ток
    Serial.print("step1="); Serial.println(sensorValue2);
    sensorValue2 = ( sensorValue2 * 3 + analogRead(A7)) / 4;
    Serial.print("sensorValue2="); Serial.println(sensorValue2);
//    Serial.print("amp="); Serial.println(amp0);
    if (sensorValue2 < amp0) sensorValue2 = amp0;
    sensorValue2=sensorValue2-amp0;// уберем погрешность
    float  T=sensorValue2*0.04;// полученный результат умножаем 
     disp.print2((int)(T * 100.), 3, 0);// напечатать результат на 2 дисплей  

Вывод Serial:

21:31:40.833 → step1=0

21:31:40.833 → sensorValue2=4

21:31:41.307 → step1=0

21:31:41.307 → sensorValue2=4

21:31:41.835 → step1=0

21:31:41.835 → sensorValue2=4

21:31:42.326 → step1=0

21:31:42.326 → sensorValue2=4

21:31:42.826 → step1=0

21:31:42.826 → sensorValue2=4

21:31:43.337 → step1=0

21:31:43.337 → sensorValue2=5

21:31:43.838 → step1=0

21:31:43.838 → sensorValue2=6

21:31:44.339 → step1=0

21:31:44.339 → sensorValue2=6

21:31:44.813 → step1=0

21:31:44.813 → sensorValue2=8

Убираю static (uint16_t sensorValue2 = analogRead(A7);// ток)

1:37:54.854 → sensorValue2=9

21:37:55.338 → step1=9

21:37:55.338 → sensorValue2=9

21:37:55.874 → step1=15

21:37:55.874 → sensorValue2=13

21:37:56.341 → step1=10

21:37:56.341 → sensorValue2=9

21:37:56.860 → step1=10

21:37:56.860 → sensorValue2=10

21:37:57.377 → step1=10

21:37:57.377 → sensorValue2=10

21:37:57.876 → step1=10

и какой вывод я должен сделать?
Я пока могу сказать только одно - этот Сериал вывод не от этого кода. Вы решили со мной поиграть?

Гм.. А от какого же???

Да не вопрос, это ваше дело, как и проблемы - тоже ваши ))

Но если sensorValue2 не статик, то строка sensorValue2 = ( sensorValue2 * 3 + analogRead(A7)) / 4; не имеет ни малейшего практического смысла

1 лайк

я не вижу в вашем коде, что вот это за кусок:

и зачем он меняет значение sensorValue2

А хз. Но в первой строке у вас analogRead(A7) выдает 0, а уже в третьей - 16. Вы уж определитесь, что тут доказать хотите :wink:

@KovAl
Если желаете разобраться, оставьте в loop() только эти 4 строки:

и запустите процесс.

1 лайк

В прошлой теме ТС, командир и радист тоже старались, помогали, разъясняли и что-то сейчас я их не вижу. Совпадение? Не думаю :thinking:

2 лайка

@KovAl

Чему равно amp0 в приведенном выше примере?

Вангую, что больше четырех ))

Судя по коду в сообщении #20 даже больше ^)

Ох уж эти пенсионеры… Знаний как у пионера, а гонору… Свою ошибку никогда не признают, вечно будут списывать на “ардуино” или “статиК”…

1 лайк

Вообщем, гонористые пенсионеры посыпали голову пеплом. :slight_smile: И родили вот такой скетч:

//
#define INIT_KEY 59
#define VREF 1.1
#define DIV_R1 74000
#define DIV_R2 2200
//
#include "L6Dig3x3.h"
#include <MsTimer2.h>
#include <EEPROM.h>
//
L6Dig3x3 disp(1, 16,15,14, 19,18,17,  2, 3, 4, 5, 6, 7, 8,9 );

float filtVal = 0;
float filtVolt = 0;
float vk = VREF * ((DIV_R1 + DIV_R2) / DIV_R2) / 1024;
//
uint16_t amp0;
uint16_t amp;
float Amp;
//
void setup() {
  analogReference(INTERNAL);
  Serial.begin(9600);
//  
  pinMode(12, INPUT_PULLUP);
  if (digitalRead(12) == 0)
  {
    cli();
    if (EEPROM.read(0) != INIT_KEY) EEPROM.write(0, INIT_KEY); // записали ключ
    for (uint8_t i = 0; i < 10; i++) {
       static uint16_t amp_zero = analogRead(A7);
       amp_zero = ( amp_zero * 3 + analogRead(A7)) / 4; 
       amp = amp_zero;
       delay(100);
    }
    EEPROM.put(1,amp);
    sei();
  }
  EEPROM.get(1,amp0);
  MsTimer2::set(2, timerInterrupt); // прерывание по таймеру 2 мс 
  MsTimer2::start();
}

void loop() {
// 
   static uint16_t v = analogRead(A6);// напряжение
   v = ( v * 3 + analogRead(A6)) / 4;
   float sensorValueV = v * vk;
   disp.print((int)(sensorValueV * 10.), 3, 0); // напечатать результат на 1 дисплей 
   disp.digit[1] |= 0x80;// зажечь точку 2 разряда 1-го дисплея
   Serial.print("VOLT:");
   Serial.println(sensorValueV);
//
    static uint16_t sensorValueA = analogRead(A7);// ток
    sensorValueA = ( sensorValueA * 3 + analogRead(A7)) / 4;
    float T = (float)(sensorValueA - amp0);// уберем погрешность
    T = T * 0.0083333;
    disp.print2((int)(T  * 100.), 3, 0);// напечатать результат на 2 дисплей  
    Serial.print("AMP:");
    Serial.println(T);
    disp.digit[5] |= 0x80;// зажечь точку 3 разряда 2-го дисплея или же по сути он же 5 разряд по счету
    delay(500);
}
void  timerInterrupt() {// обработчик прерывания 2 мс

  disp.regen(); // регенерация индикатора

}

Всё вроде бы неплохо, но есть просьба:

  1. Покритиковать. Желательно, без фанатизма. :wink:
  2. Подсказать, как правильно посчитать множитель в 57-й строке (T = T * 0.0083333;)
    Сейчас вывел его эмпирически. Хотелось бы сделать его также, как “vk” (стр. 15).
  3. Как уменьшить время “реакции” на изменение измеряемых параметров?

P.S. Кстати..

Если речь про “float sensorValue2 = a-12;// уберем погрешность”, то это не моё. См. #13.
Ну это так, к сведению. :wink:

да-да