Запуск серво при длительном воздействии

Millenial

✩✩✩✩✩✩✩
8 Июл 2019
6
0
Только начал изучать Ардуино, и хочу кое-что смастерить для зарядки аккумуляторов, что бы ночью вдруг не сжечь квартиру))
Увлекаюсь квадрокоптерами, и конечно мне нужно заряжать батареи, причем часа по 3-3.5 каждую, зарядник стандартный, и единственное что он может, так это мигать светодиодом при зарядке и непрерывно гореть когда зарядил (и вроде как заряжать еще и свыше). Вопрос вот в чем: как заставить Ардуинку после 5 секунд непрерывной подачи тока (от зеленой лампочки) подавать сигнал на пин, который будет запускать сервопривод, который в свою очередь будет вырубать удлинитель с зарядкой?
 

Krypt0n

✩✩✩✩✩✩✩
3 Авг 2018
11
1
как заставить Ардуинку после 5 секунд непрерывной подачи тока (от зеленой лампочки) подавать сигнал на пин, который будет запускать сервопривод, который в свою очередь будет вырубать удлинитель с зарядкой?
пин, на который будет приходить сингнал, обозначаешь как кнопку (рекомендую использовать библиотеки Гайвера), устанавливаешь режим чтения, в той же либе смотришь сколько была нажата кнопка. Если 5 сек, то поднимаешь серву, иначе опускаешь
 

Millenial

✩✩✩✩✩✩✩
8 Июл 2019
6
0
Вообщем дело такое, я использовал вот такой вот код:

#include <Servo.h>
Servo myservo;
#define button1B 3 // пин кнопки button1

boolean button1S; // храним состояния кнопок (S - State)
boolean button1F; // флажки кнопок (F - Flag)
boolean button1R; // флажки кнопок на отпускание (R - Release)
boolean button1P; // флажки кнопок на нажатие (P - Press)
boolean button1H; // флажки кнопок на удержание (многократный вызов) (H - Hold)
boolean button1HO; // флажки кнопок на удержание (один вызов при нажатии) (HO - Hold Once)
boolean button1D; // флажки кнопок на двойное нажатие (D - Double)
boolean button1DP; // флажки кнопок на двойное нажатие и отпускание (D - Double Pressed)
boolean servoW; // флаг ожидание серво под 0 градусов
boolean servoC; // флаг перевести в 160 градусов для выключения удлинителя

#define double_timer 100 // время (мс), отведённое на второе нажатие
#define hold 500 // время (мс), после которого кнопка считается зажатой
#define debounce 80 // (мс), антидребезг
unsigned long button1_timer; // таймер последнего нажатия кнопки
unsigned long button1_double; // таймер двойного нажатия кнопки

void setup() {
Serial.begin(9600);
pinMode(button1B, INPUT_PULLUP);
myservo.attach(9);
}

void loop() {
//-------опрос кнопок--------
button1S = !digitalRead(button1B);
buttons(); //отработка кнопок
//-------опрос кнопок--------

// отработка режимов (опускание флага обязательно!)
if (button1P) {
Serial.println("pressed");
button1P = 0;
}
if (button1D) {
Serial.println("double");
button1D = 0;
}
if (button1H && button1HO) {
Serial.println("hold once");
button1HO = 0;
}
/*
if (button1H) {
Serial.println("hold");
button1H = 0;
}
*/
}

//------------------------ОТРАБОТКА КНОПОК-------------------------
void buttons() {
//-------------------------button1--------------------------
// нажали (с антидребезгом)
if (button1S && !button1F && millis() - button1_timer > debounce) {
button1F = 1;
button1HO = 1;
button1_timer = millis();
myservo.write(0);
Serial.println("0");
}
// если отпустили до hold, считать отпущенной
if (!button1S && button1F && !button1R && !button1DP && millis() - button1_timer < hold) {
button1R = 1;
button1F = 0;
button1_double = millis();
myservo.write(0);
Serial.println("0");
}
// если отпустили и прошло больше double_timer, считать 1 нажатием
if (button1R && !button1DP && millis() - button1_double > double_timer) {
button1R = 0;
button1P = 1;
myservo.write(0);
Serial.println("0");
}
// если отпустили и прошло меньше double_timer и нажата снова, считать что нажата 2 раз
if (button1F && !button1DP && button1R && millis() - button1_double < double_timer) {
button1F = 0;
button1R = 0;
button1DP = 1;
myservo.write(0);
Serial.println("0");
}
// если была нажата 2 раз и отпущена, считать что была нажата 2 раза
if (button1DP && millis() - button1_timer < hold) {
button1DP = 0;
button1D = 1;
button1_timer = millis();
myservo.write(0);
Serial.println("0");
}
// Если удерживается более hold, то считать удержанием
if (button1F && !button1D && !button1H && millis() - button1_timer > hold) {
button1H = 1;
myservo.write(160);
Serial.println("160");
}
// Если отпущена после hold, то считать, что была удержана
if (!button1S && button1F && millis() - button1_timer > hold) {
button1F = 0;
button1H = 0;
button1_timer = millis();
myservo.write(160);
Serial.println("160");
}
//-------------------------button1--------------------------
}
//------------------------ОТРАБОТКА КНОПОК-------------------------


И все работает с кнопкой, но вот припаянный провод от катода на заряднике хоть и дает оповещение о срабатывании, вот только ничего не работает((
На него идёт постоянное напряжение от 0.04 до 2.55Вт, и мне кажется что эти 0.04 считаются как нажатая кнопка, или что-то типа того. Но тогда бы сразу запускался серв на 160 градусов, а он и этого не делает.
Вообщем при попытках подключится, COM выдает что кнопка нажата один раз И ТОЛЬКО КОГДА ДИОД ГОРИТ, когда он тухнет, то подключение ничего не дает и даже когда после подключения диод загорается - тот же результат, ничего.
Что не так?@Krypt0n,
 

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,003
406
Москва
wan-derer.ru
@Millenial, GND тоже надо. Напряжение - это разность потенциалов. Т.е. разница между чем-то и чем-то. В данном случае между катодом СД и GND
 

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,003
406
Москва
wan-derer.ru
@Millenial, GND Arduino и зарядник а должны быть общие. Напряжение на 3 ноге Ардуино не должно превышать напряжение питания Ардуино
 

Millenial

✩✩✩✩✩✩✩
8 Июл 2019
6
0
@Wan-Derer, То есть мне нужно пин 3 связать с плюсом диода через макетку с одной стороны, с другой стороны тыкнуть минус диода и GND платы? И туда еще нужны диоды(типа таких), да?
 

MaksFree

✩✩✩✩✩✩✩
28 Июн 2019
25
2
Владивосток
крутиться как дурак туда-сюда
Может в скетч нужно добавить условие:

если лампочка горит и серво в положении зарядки АКБ,
то повернуть серву в положение off.

В таком виде серва не повернется в обратную сторону, т.к. не выполнено второе условие функции "если".
Серву можно наверное заменить на реле.