Потребовалось изменить выходной сигнал от датчика. Имеем аналоговый датчик, на выходе которого что то похожее на синусоиду, амплитудой от 0 до 2 Вольт. Пробуем программный преобразователь. (сдвиг по времени + сжатие/увеличение по амплитуде можно задать любые к коде)
Единственное ограничение по количеству запоминаемых значений напряжений. Если памяти 2 Кб (Описание различных ардуино плат) и мы храним 8-ми битное значения типа byte, то мы можем хранить не более 2000 значений в памяти (+ остальные переменные скетча и служебная память). Т.е. для повышения точности характеристик изменяемого сигнала в моём примере можно увеличить сдвиг или увеличить частоту изменения показаний (считывания) напряжения датчика.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | int analogReadPin = A0; int analogWritePin = 11; const int maxCountValues = 300; byte analogReadPinValue = 0; byte values[maxCountValues]; int posWriteToPin = 0; int posReadFromPin = 0; void setup () { Serial.begin(9600); pinMode(analogReadPin, INPUT); pinMode(analogWritePin, OUTPUT); } void loop () { analogReadPinValue = map(analogRead(analogReadPin), 0, 1023, 0, 255); values[posReadFromPin] = analogReadPinValue; Serial.print("Read "); Serial.print(posReadFromPin); Serial.print(" "); Serial.println(values[posReadFromPin]); posReadFromPin++; if (posReadFromPin > maxCountValues-1) { posReadFromPin = 0; } if (millis()>300) { analogWrite(analogWritePin, values[posWriteToPin]); Serial.print("Write "); Serial.print(posWriteToPin); Serial.print(" "); Serial.println(values[posWriteToPin]); posWriteToPin++; if (posWriteToPin > maxCountValues-1) { posWriteToPin = 0; } } delay(50); } |