Прошу помощи .
Решил использовать библиотеку ServoSmooth.
В цикле LOOP библиотека работает нормально. А в функции Naliv, работать отказывается при использовании setTargetDeg. Однако если использовать write, то все работает нормально, но быстро. Основа ESP32-WROOM
Решил использовать библиотеку ServoSmooth.
В цикле LOOP библиотека работает нормально. А в функции Naliv, работать отказывается при использовании setTargetDeg. Однако если использовать write, то все работает нормально, но быстро. Основа ESP32-WROOM
Блок LOOP:
void loop() {
// желаемая позиция задаётся методом setTarget (импульс) или setTargetDeg (угол), далее
// при вызове tick() производится автоматическое движение сервы
// с заданным ускорением и ограничением скорости
myservo.tick(); // здесь происходит движение серво по встроенному таймеру!
int i = opros_encoder(); // опрос энкодера
switch (i) {
case 1:
// выполнить, если значение == 1 Это короткое нажатие на энкодер
tft.drawString("Это короткое нажатие на энкодер", 0, 0);
//Serial.println("Нажата кнопка");
myservo.setTargetDeg(Pos[1]);
//myservo.write(Pos[1]);
naliv();
break;
case 2:
// выполнить, если значение == 2 Это длинное нажатие на энкодер
tft.drawString("Это длинное нажатие на энкодер", 0, 0);
myservo.setTargetDeg(Pos[2]);
//myservo.write(Pos[2]);
//menuEnter(0); // Переход в меню
break;
case 3:
// выполнить, если значение == 3 Это поворот вправо
tft.drawString("Это поворот вправо", 0, 0);
myservo.setTargetDeg(Pos[0]);
//myservo.write(Pos[0]);
volum_level_new(1);
break;
case 4:
// выполнить, если значение == 4 Это поворот влево
tft.drawString("Это поворот влево", 0, 0);
myservo.setTargetDeg(Pos[5]);
//myservo.write(Pos[5]);
volum_level_new(0);
break;
}
}
Функция Naliv:
void naliv() {
tft.fillScreen(TFT_BLACK); // Заливает экран черным цветом (очищаем)
tft.setTextSize(2);
tft.drawString("Наливаем по 50 мл", 50, 100);
tft.drawString("B -Ю РЮMKУ %", 50, 150);
for (int i = 0; i < NUM_PIXELS; i++) { // Перебираем все рюмки
// if(!digitalRead(SW_pins[i])){
if (sw_state[i]) // Если рюмку не убирали
{
// lcd.clear();
// lcd.setCursor(3, 0); // Устанавливает курсор в (позицию,Строка)
// lcd.print("РЮМКА ");
// lcd.print(i+1, DEC); // Печатаем номер рюмки в которую льем
// lcd.setCursor(3, 1); // Устанавливает курсор в (позицию,Строка)
// lcd.print("налита");
// delay(1000);
// lcd.clear();
// lcd.setCursor(2, 0); // Устанавливает курсор в (Позиция,Строка)
// lcd.print("Смените рюмку");
// delay(1000);
// lcd.clear();
// lcd.setCursor(0, 0); // Устанавливает курсор в (позицию,Строка)
// lcd.print("HAЛИBAЮ по 50MЛ");
// lcd.setCursor(0, 1); // Устанавливает курсор в (позицию,Строка)
// lcd.print("B -Ю РЮMKУ %");
}else
{
tft.drawNumber( i+1, 70, 150); // Устанавливает курсор в (Позиция,Строка) и Печатаем номер рюмки в которую льем
myservo.write(Pos[i]); // Предвигаем серву в позицию " i "
// myservo.setTargetDeg(Pos[i]);
delay(servo_time_work); // Время задержки перед включением помпы
digitalWrite(PUMP_PIN, HIGH); // ВКЛЮЧАЕМ помпу
int pump_time_work_start = millis(); // Время начала налива
// Пока концевик не отпущен и время налива не закончилось крутим цикл в котором помпа работает
// И выводим на экран проценты налива
int t = 0; // Переменная для подсчета времени
t = pump_time_work + pump_time_work_start;
while((millis() < t) && pins_state[i]){
int p = map(millis(), pump_time_work_start, t, 0, 100); // Переменная для вывода процентов
tft.drawNumber( p, 190, 150); // Устанавливает курсор в позицию отображенния процентов налива
delay(100);
};
tft.drawNumber( 100, 190, 150); // Устанавливает курсор в позицию отображенния процентов налива при окончании налива
digitalWrite(PUMP_PIN, LOW); // ВыКЛЮЧАЕМ помпу
sw_state[i] = true; // обновляем состояние концевика
delay(1000);
tft.fillRect(190, 150, 35, 16, TFT_BLACK);
tft.drawNumber( 0, 190, 150); // Устанавливает курсор в позицию отображенния процентов налива при окончании налива
}
}
myservo.write(Pos[6]); // возвращаем серву в парковочную позицию
// myservo.setTargetDeg(Pos[i]);
}
Изменено: