Ну, если вы в этом уверены, то инициализируйте ее нулем. А если таки напряжение/ток при старте уже будут?
Значение переменной будет менятся при каждом вызове, а не только при первом проходе.
@v258
Мне кажется, у него не в этом затык.
Он думает, что статическая переменная как иницировалась (например нулем), так потом больше и не меняется…
Это думает не “он”, а ардуино.
Ну так я угадал?
Если да, то это бред.
И если у вас “факты” это подтвердили - значит эти факты неверные
Ардуино вообще не думает. Не умеет ))
@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;
не имеет ни малейшего практического смысла
я не вижу в вашем коде, что вот это за кусок:
и зачем он меняет значение sensorValue2
А хз. Но в первой строке у вас analogRead(A7)
выдает 0, а уже в третьей - 16. Вы уж определитесь, что тут доказать хотите
@KovAl
Если желаете разобраться, оставьте в loop()
только эти 4 строки:
и запустите процесс.
В прошлой теме ТС, командир и радист тоже старались, помогали, разъясняли и что-то сейчас я их не вижу. Совпадение? Не думаю
Чему равно amp0 в приведенном выше примере?
Вангую, что больше четырех ))
Судя по коду в сообщении #20 даже больше ^)
Ох уж эти пенсионеры… Знаний как у пионера, а гонору… Свою ошибку никогда не признают, вечно будут списывать на “ардуино” или “статиК”…
Вообщем, гонористые пенсионеры посыпали голову пеплом. И родили вот такой скетч:
//
#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(); // регенерация индикатора
}
Всё вроде бы неплохо, но есть просьба:
- Покритиковать. Желательно, без фанатизма.
- Подсказать, как правильно посчитать множитель в 57-й строке (T = T * 0.0083333;)
Сейчас вывел его эмпирически. Хотелось бы сделать его также, как “vk” (стр. 15). - Как уменьшить время “реакции” на изменение измеряемых параметров?
P.S. Кстати..
Если речь про “float sensorValue2 = a-12;// уберем погрешность”, то это не моё. См. #13.
Ну это так, к сведению.
да-да