Зимняя электронная удочка на Arduino Nano,
кивок на реле 3В.
Ловись рыбка - большая и маленькая.
Видео этой электронной зимней удочки на Ютубе.
В видео показана зимняя электронная удочка, основой, которой является Arduino Nano. А "дёргалка" изготовлена из СТАНДАРТНОЙ трёх вольтовой релюшки.
Не надо, ничего НАМАТЫВАТЬ!!! Практически, подавляющее большинство радиолюбителей, даже не начинают делать схему, если что-то надо намотать.. . Поэтому считаю, что главное достижение этой самоделки, это применение в качестве исполнительного элемента готового изделия -- трёхвольтового реле, которое достаточно просто найти. (На Алиэкспрес, точно есть!!!). К дергающемуся лепестку реле, припаивается коротенькая трубочка в которую потом вставляется кивок... Длина импульса, пауза между импульсами, количество импульсов в пачке, пауза между пачками, всё это регулируется в достаточно широких пределах (на столько, на сколько способно это выполнить реле). Все регулировки производятся с помощью энкодера. Есть режим постоянной работы, когда заданный режим КИВКОВ - работает постоянно. И режим, когда КИВКИ или пачки кивков по нажатию кнопочки. Конструкция включает в себя: трех позиционный маленький Тумблер (автоматич. раб. -- ВЫКЛЮЧЕНО -- Работа по нажатию кнопочки), Кнопочка, Энкодер, три Светодиода (индикация реж. , что регулирует энкодер), платка Arduino Nano, платка зарядки аккумулятора, маленькая платка повышения напряжения до 5-7 Вольт (Ардуино в 5 вольтовый вход 7 держит, аккуратно), Транзистор включения реле, четыре малюсеньких резистора, два маленьких конденсатора и РЕЛЕ (в качестве "дёргалки"). Всё это, вполне поместилось, как видно на видео в корпус старенькой зимней удочки.
Схема принципиальная электронной зимней удочки
(извините, уж какая есть).
Внизу статьи можно скачать более увеличенную схему.
А также скетч для ардуинки нано.
Электронная зимняя удочка. СКАЧАТЬ.
В видео и описании не оговорена маленькая деталь!
Если с программой (представленной ниже), включить питание удочки с нажатой кнопкой энкодера! Программа загрузится с парраметрами по умолчанию (с гарантированными условиями "дёргания реле")!!!
Ниже приведён скетч для электронной зимней удочки
на ARDUINO NANO !
#include
#define CLK 0
#define DT 1
#define SW 2
#include "GyverEncoder.h"
Encoder enc1(CLK, DT, SW);
#include
// #include // Подключение библиотеки
#include // Подключение альтернативной библиотеки
// LiquidCrystal_I2C lcd(0x27,16,2); // Указываем I2C адрес (наиболее распространенное значение), а также параметры экрана (в случае LCD 1602 - 2 строки по 16 символов в каждой
LiquidCrystal_PCF8574 lcd(0x27); // Вариант для библиотеки PCF8574
int show;
int value1 = 10;
int value2 = 20;
int value3 = 100;
int value4 = 100;
int sensorPin1 = A0;
// int sensorPin2 = A1; // Подготовлено для второго резистора
int Pin1 = 3;
int Pin2 = 4;
int Pin3 = 5;
int Pin4 = 6;
int Pin5 = 7;
int Pin6 = 8;
int Pin7 = 9;
int Pin8 = 10;
int Pin9 = 11;
int Pin10 = 12;
int LedPin = 13;
int PinV_A0 = 14;
int PinV_A1 = 15;
int PinV_A2 = 16;
int PinV_A3 = 17;
// int sensorValue1 = 30;
// int sensorValue2 = 31;
int State1 = HIGH;
int State11 = HIGH;
int State2 = LOW;
int State22 = LOW;
int State3 = HIGH;
int State33 = LOW;
int State4 = LOW;
int State5 = HIGH;
int State6 = LOW;
int State7 = HIGH;
int State8 = LOW;
int State9 = HIGH;
int State10 = LOW;
// int State9 = 1;
int knopka=3;
unsigned long previousMillis1, previousMillis2, previousMillis3, previousMillis4 = 0;
unsigned long previousMillis5, previousMillis6, previousMillis7, previousMillis8, previousMillis9, previousMillis10 = 0;
unsigned long previousMillis18 = 0;
int Pachka = LOW;
byte ReadSW = LOW;
byte Run;
void setup() {
if (digitalRead(SW) == LOW ) {
EEPROM.write(1, 10);
EEPROM.write(2, 10);
EEPROM.write(3, 50);
EEPROM.write(4, 50);
}
digitalWrite(Pin4, HIGH);
value1 = EEPROM.read(1);
value2 = EEPROM.read(2);
value3 = EEPROM.read(3);
value4 = EEPROM.read(4);
int error;
Serial.begin(115200);
Serial.println("LCD...");
while (! Serial);
Serial.println("Dose: check for LCD");
// See http://playground.arduino.cc/Main/I2cScanner
Wire.begin();
Wire.beginTransmission(0x27);
error = Wire.endTransmission();
Serial.print("Error: ");
Serial.print(error);
if (error == 0) {
Serial.println(": LCD found.");
} else {
Serial.println(": LCD not found.");
} // if
lcd.begin(16, 2); // initialize the lcd
show = 0;
// setup()
/*
lcd.init(); // Инициализация дисплея
lcd.backlight(); // Подключение подсветки
lcd.setCursor(0,0); // Установка курсора в начало первой строки
lcd.print("Hello"); // Набор текста на первой строке
lcd.setCursor(0,1); // Установка курсора в начало второй строки
lcd.print("ArduinoMaster"); // Набор текста на второй строке
*/
// Serial.begin(9600);
enc1.setType(1); // тип энкодера TYPE1 одношаговый, TYPE2 двухшаговый. Если ваш энкодер работает странно, смените тип
pinMode(Pin1, OUTPUT);
pinMode(Pin2, OUTPUT);
pinMode(Pin3, OUTPUT);
pinMode(Pin4, OUTPUT);
pinMode(Pin5, OUTPUT);
pinMode(Pin6, OUTPUT);
pinMode(Pin7, OUTPUT);
pinMode(Pin8, OUTPUT);
pinMode(Pin9, OUTPUT);
pinMode(Pin10, OUTPUT);
pinMode(PinV_A0, INPUT);
pinMode(PinV_A1, INPUT);
// pinMode(PinV_A2, INPUT);
// pinMode(PinV_A3, INPUT);
digitalWrite(Pin1,HIGH);
digitalWrite(Pin2,HIGH);
}
void loop() {
unsigned long currentMillis1 = millis();
ReadSW = digitalRead(SW);
Run = digitalRead(PinV_A0) || digitalRead(PinV_A1); // Для меня...
// Run = digitalRead(PinV_A1); // Для Игоря!!
//=========================================
if (ReadSW == HIGH) {
previousMillis18 = currentMillis1;
}
if (ReadSW == LOW ) {
if (currentMillis1 - previousMillis18 >= 3000) {
EEPROM.write(1, value1);
EEPROM.write(2, value2);
EEPROM.write(3, value3);
EEPROM.write(4, value4);
digitalWrite(LedPin,HIGH);
delay(3333);
}
}
//============================================
// const long interval1 = 5000;
const long interval1 = value1*5; // Переменная умножена на
const long interval2 = value2*5;
const long interval3 = value3*40;
const long interval4 = value4*40;
int ReadPin9 = digitalRead(Pin1);
int ReadPin10 = digitalRead(Pin2);
enc1.tick();
if(digitalRead(Pin1)==LOW && ReadPin10==LOW){
if (enc1.isRight()) value1++; // если был поворот направо, увеличиваем на 1
if (enc1.isLeft()) value1--; // если был поворот налево, уменьшаем на 1
value1 = constrain(value1, 1, 60);
digitalWrite(LedPin, State5 );
// digitalWrite(Pin5, State5 );
if(interval1 != value1*5){
if (show == 0) {
lcd.setBacklight(55);
lcd.home(); lcd.clear();
lcd.print(interval1);
// lcd.print("Hello LCD");
lcd.print(" ");
lcd.print(interval2);
lcd.setCursor(0, 1);
lcd.print(interval3);
lcd.print(" ");
lcd.print(interval4);
}
}
}
if(digitalRead(Pin1)==HIGH && ReadPin10==LOW){
if (enc1.isRight()) value2++; // если был поворот направо, увеличиваем на 1
if (enc1.isLeft()) value2--; // если был поворот налево, уменьшаем на 1
value2 = constrain(value2, 1, 70);
digitalWrite(LedPin,State7);
// digitalWrite(Pin5, State7 );
if(interval2 != value2*5){
if (show == 0) {
lcd.setBacklight(55);
lcd.home(); lcd.clear();
lcd.print(interval1);
// lcd.print("Hello LCD");
lcd.print(" ");
lcd.print(interval2);
lcd.setCursor(0, 1);
lcd.print(interval3);
lcd.print(" ");
lcd.print(interval4);
}
}
}
if(digitalRead(Pin1)==LOW && ReadPin10==HIGH){
if (enc1.isRight()) value3++; // если был поворот направо, увеличиваем на 1
if (enc1.isLeft()) value3--; // если был поворот налево, уменьшаем на 1
value3 = constrain(value3, 1, 120);
digitalWrite(LedPin,State9);
// digitalWrite(Pin5, State9);
if(interval3 != value3*40){
if (show == 0) {
lcd.setBacklight(55);
lcd.home(); lcd.clear();
lcd.print(interval1);
// lcd.print("Hello LCD");
lcd.print(" ");
lcd.print(interval2);
lcd.setCursor(0, 1);
lcd.print(interval3);
lcd.print(" ");
lcd.print(interval4);
}
}
}
if(digitalRead(Pin1)==HIGH && ReadPin10==HIGH){
if (enc1.isRight()) value4++; // если был поворот направо, увеличиваем на 1
if (enc1.isLeft()) value4--; // если был поворот налево, уменьшаем на 1
value4 = constrain(value4, 1, 170);
digitalWrite(LedPin, digitalRead(Pin3));
// digitalWrite(Pin5, digitalRead(Pin3));
if(interval4 != value4*40){
if (show == 0) {
lcd.setBacklight(55);
lcd.home(); lcd.clear();
lcd.print(interval1);
// lcd.print("Hello LCD");
lcd.print(" ");
lcd.print(interval2);
lcd.setCursor(0, 1);
lcd.print(interval3);
lcd.print(" ");
lcd.print(interval4);
}
}
}
// unsigned long currentMillis1 = millis();
if (Run==LOW) {
previousMillis3 = currentMillis1;
previousMillis4 = currentMillis1;
previousMillis1 = currentMillis1;
previousMillis2 = currentMillis1;
State1 = LOW;
State2 = LOW;
State3 = LOW;
State4 = LOW;
}
if (Run==HIGH && State2 == LOW) {
State1=HIGH;
}
if (State1==HIGH) {
if (currentMillis1 - previousMillis1 >= interval1) {
State1 = LOW;
State2 = HIGH;
previousMillis2 = currentMillis1;
}
}
if (State2==HIGH) {
if (currentMillis1 - previousMillis2 >= interval2) {
State2 = LOW;
State1 = HIGH;
previousMillis1 = currentMillis1;
}
}
digitalWrite(Pin4, State1);
if (Run==HIGH && State4 == LOW) {
State3 = HIGH;
}
if (State3 == HIGH) {
if (State1 == LOW) {
Pachka = HIGH;
}
if (currentMillis1 - previousMillis3 >= interval3) {
State3 = LOW;
State4 = HIGH;
previousMillis4 = currentMillis1;
}
}
if (State4 == HIGH) {
if (State1 == LOW) {
Pachka = LOW;
}
if (currentMillis1 - previousMillis4 >= interval4) {
State4 = LOW;
State3 = HIGH;
previousMillis3 = currentMillis1;
}
}
// =======================================
if (State5==HIGH) {
if (currentMillis1 - previousMillis5 >= 50) {
State5 = LOW;
State6 = HIGH;
previousMillis6 = currentMillis1;
}
}
if (State6==HIGH) {
if (currentMillis1 - previousMillis6 >= 150) {
State6 = LOW;
State5 = HIGH;
previousMillis5 = currentMillis1;
}
}
// --------------------------------------------------
if (State7==HIGH) {
if (currentMillis1 - previousMillis7 >= 50) {
State7 = LOW;
State8 = HIGH;
previousMillis8 = currentMillis1;
}
}
if (State8==HIGH) {
if (currentMillis1 - previousMillis8 >= 950) {
State8 = LOW;
State7 = HIGH;
previousMillis7 = currentMillis1;
}
}
// ----------------------------------------------
if (State9==HIGH) {
if (currentMillis1 - previousMillis9 >= 3000) {
State9 = LOW;
State10 = HIGH;
previousMillis10 = currentMillis1;
}
}
if (State10==HIGH) {
if (currentMillis1 - previousMillis10 >= 2000) {
State10 = LOW;
State9 = HIGH;
previousMillis9 = currentMillis1;
}
}
// ====================================
// digitalWrite(Pin5, State3);
// digitalWrite(Pin6, State4);
if(digitalRead(SW)==LOW && knopka==0)//если кнопка нажата
// и перемення "knopka" равна 0 , то ...
{
delay(50);//защита от дребезга
knopka++;//пишем 1 в переменную кнопка
// digitalWrite(Pin9, !digitalRead(Pin9));//меняем значение порта на противоположное
digitalWrite(Pin1, HIGH);
delay(333);
}
if(digitalRead(SW)==LOW&&knopka==1)
{
delay(50);//защита от дребезга
knopka++;
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, HIGH);
delay(333);
}
if(digitalRead(SW)==LOW && knopka==2)//если кнопка нажата
{
delay(50);//защита от дребезга
knopka++;//пишем 1 в переменную кнопкa
digitalWrite(Pin1, HIGH);
// digitalWrite(Pin9, HIGH);
// digitalWrite(Pin7, digitalRead(Pin9));
delay(333);
}
if(digitalRead(SW)==LOW&&knopka==3)//если кнопка НЕ нажата
{
delay(50);//защита от дребезга
knopka=0;//обнуляем переменную "knopka"
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
delay(333);
}
digitalWrite(Pin3, Pachka && State1);
// // "||" <-> "ИЛИ", "&&" <-> "И",
// int ReadsPin4 = digitalRead(Pin4);
// digitalWrite(Pin1, State1 && (!readsKn || reads2 || reads5));
// digitalWrite(Pin3, (State3 || reads3) && State1); // "||" <-> "ИЛИ", "&&" <-> "И",
// digitalWrite(Pin3, State3 && ReadsPin4);
// digitalWrite(Pin2, LOW);
// digitalWrite(Pin4, HIGH);
}
Внизу стать в файле RAR "Электронная зимняя удочка программа.rar" ?
можно скачать программу и некоторые библиотеки для ARDUINO
Электронная зимняя удочка программа для ARDUINO скачать бесплатно скачать
Под видео в ютубе в качестве комментария, можете задать вопрос!
Постораюсь ответить!
Файлы:
Суммарное количество:12,Суммарный размер:50(Mb).