#include // библиотека для работы с сервоприводом Servo myservo; int pin_servo = 9; // пин для управления сервоприводом // пины для потенциометров int rez_1 = A1; int rez_2 = A2; int rez_3 = A3; // пины для светодиодов, которые служат // в качестве индикатора заряда аккумулятора int pin_leds[4] = {2, 3, 4, 5}; // пин для определения уровня заряда аккумулятора int accum = A5; // максимальный заряд аккумулятора float max_v = 4.25; // минимальный заряд аккумулятора float min_v = 3; int pause_time = 300; // время паузы int delay_time = 150; // время колебания int max_degree = 20; // максимальный угол int degree; // рандомный угол int start_degree = 45; // начальный угол int degree_one; // функция для проверки уровня заряда аккумулятора void check_accum(){ // включаем опорное напряжения 1.1В // чтобы правильно определить заряд аккумулятора analogReference(INTERNAL); // кастыль для переключения опорного напряжения Serial.println(analogRead(accum)); delay(50); float Vbat = (analogRead(accum) * 1.1) / 1023; float del = 0.091; // R2/(R1+R2) 0.99кОм / (9.88кОм + 0.99кОм) float Vin = Vbat / del; // уровень заряда в процентах int proc = ((Vin - min_v) / (max_v - min_v)) * 100; Serial.println(Vbat); Serial.println(proc); // гасим все светодиоды int on_leds = 4; for(int i = 0; i < on_leds; i++){ digitalWrite(pin_leds[i], LOW); } // зажигаем нужные светодиоды // в зависимости от уровня заряда if(proc <= 75) on_leds = 3; if(proc <= 50) on_leds = 2; if(proc <= 25) on_leds = 1; for(int i = 0; i < on_leds; i++){ digitalWrite(pin_leds[i], HIGH); } // переключаем обратно опорное напряжение в дефолтное // состояние, чтобы корректно работали потенциометры analogReference(DEFAULT); delay(50); // кастыль для переключения опорного напряжения Serial.println(analogRead(accum)); } void setup() { // инициализация сервопривода myservo.attach(pin_servo); myservo.write(start_degree); delay(1000); // пины потенциометров pinMode(rez_1, INPUT); pinMode(rez_2, INPUT); pinMode(rez_3, INPUT); // пины светодиодов pinMode(pin_leds[0], OUTPUT); pinMode(pin_leds[1], OUTPUT); pinMode(pin_leds[2], OUTPUT); pinMode(pin_leds[3], OUTPUT); // вывод в монитор порта Serial.begin(9600); } void loop() { check_accum(); // проверка заряда аккумулятора // получаем время паузы pause_time = map(analogRead(rez_1), 0, 1023, 50, 1000); // получаем время колебания delay_time = map(analogRead(rez_2), 0, 1023, 50, 1000); // получаем максимальный угол наклона. Амплитуда колебания max_degree = map(analogRead(rez_3) , 0, 1023, 1, 20); // проверка значений в мониторе порта Serial.println(pause_time); Serial.println(delay_time); Serial.println(max_degree); // если нужен рандомный угол наклона //degree = random(max_degree/2, max_degree); // рандомные колебания degree = max_degree; // поднимаем удочку вверх for (degree_one = start_degree; degree_one <= (start_degree + degree); degree_one++) { delay(delay_time / degree); myservo.write(degree_one); } // задержка между колебаниями delay(pause_time); // опускаем удочку вниз for (degree_one = (start_degree + degree); degree_one >= start_degree; degree_one--) { delay(delay_time / degree); myservo.write(degree_one); } // задержка между колебаниями delay(pause_time); }