Так d это смещение, постоянная составляющая. Должна быть a равна 3.
Если знать постоянную составляющую, то Вы совершенно правы, но не совсем по любой точке.
Если мы знаем точку (x1, y1) и постоянную составляющую c, то из уравнения:
![]()
Сразу имеем, что амплитуда равна:

Как видите, надо только следить – те точки, в которых знаменатель равен нулю, нужно отбрасывать, они не походят.
Ну да, в теории так и есть. На практике ведь нет точек, при которых знаменатель равен нулю. Мы не можем это чисто физически)
Хотя…
Да, в момент, кратный полупериоду, можно таки попасть в просак ноль.
У нас нет перехода через ноль. У нас однополярный сигнал.
Посмотрите на знаменатель в решении из №42. В самой функции (там выше) не бывает нуля за счёт постоянной составляющей. А вот у знаменателя из решения есть переход через 0 (там ведь обычный синус) и именно он создаёт проблемы. Его надо избегать.
В программе я проверяю знаменатель.
Ну, даже не знаю. Набросал сейчас по-быстрому …
Вот здесь источника 2В (возле него написано) через делитель пополам, даёт амплитуду 1В, которую мы и наблюдаем и на осциллограмме, и в мониторе порта.
И, да, замеры здесь делаются через случайные промежутки времени. Если точка неудачна, там внутри функции measureAC есть цикл ожидания пока она от нуля отойдёт.
void loop(void) {
// Интервал между замерами от полусекунды, до полутора секунд
delay(random(500, 1500));
measureAC(); // замер
}
А MeasureAC() чья функция? Из какой библиотеки?
Своя. Измеряет и в сериал выводит.
