Собственно сам скетч Станка намотки катушки индуктивности с нанесением изоляции на проволоку.Код:
/* Main.ino file generated by New Project wizard
*
* Created: Чт июл 21 2022
* Processor: Arduino Uno
* Compiler: Arduino AVR
*/
// Peripheral Configuration Code (do not edit)
//---CONFIG_BEGIN---
#pragma GCC push_options
#pragma GCC optimize("Os")
#include <core.h> // Required by cpu
#include <cpu.h>
#pragma GCC pop_options
// Peripheral Constructors
CPU &cpu = Cpu;
void peripheral_setup()
{
}
void peripheral_loop()
{
}
//---CONFIG_END---
//Скетч под три кнопки управления станком по намотке провода от Proektirovshik
//видео станка ниже на ютубе и дзене
// https://youtu.be/01Un0Ifq334
// https://zen.yandex.ru/video/watch/626ea9b95bdcdb7bacf09e1d
//управляет сервоприводом укладчика провода и основным мотрчиком с редуктором
//с кнопок на выводах 11 больше и 12 меньше устанавливается значение количества витков и нажимается пуск на кнопке вывод 10
//моторредуктор висит на 3 и 4 выводах через плату контроллера D293
//сервопривод висит на 9 выводе через плату контроллера D293
//управление экраном по шине I2C
#include <Wire.h> //объявление библиотеки Wire
#include <SSD1306Ascii.h> //объявление библиотеки для вывода текста на OLED дисплеи
#include <SSD1306AsciiWire.h> //объявление библиотеки для вывода текста на OLED дисплеи
#include <LiquidCrystal_I2C.h> //#############################################объявление библиотеки для вывода текста на LCD1602
#include <Servo.h> //объявление библиотеки для сервопривода
#define I2C_ADDRESS 0x3C // I2C_ADDRESS присвоить адрес 0x3C
Servo servo; // Создаем объект сервопривод
SSD1306AsciiWire oled; //инициирование дисплея
LiquidCrystal_I2C lcd(0x20, 16, 2); //##############################################установка lcd1602 на адрес 0x20
int UP = 12; //кнопка переманной вперед UP присвоено значение 12
int DOWN = 11; //кнопка переменной назад DOWN присвоено значение 11
int START = 10; //кнопка переменной старт START присвоено значение 10
int NAGREV = 2; //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@вывод на управление нагревом
int GERKON = 5; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! порт 5 называем GERKON
int x = 0; //переменной x присвоено значение 0
unsigned short y = 0; //желаемое количество витков переменной y (0 до 65535) присвоено изначально значение 0
unsigned int CountGerkon = 0; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!счетчик Геркона
static int j = 1; //вспомогательной переменной j присвоена 1 для цикла серво привода
static int g = 0; //переменной g присвоен изначально 0 это количество умещаемых витков в одной секции
#define MOT1_STP 4 // MOT1_STP присвоить значение вывода 4
#define MOT1_DIR 3 // MOT1_DIR присвоить значение вывода 3
void setup()
{
peripheral_setup();
// TODO: put your setup code here, to run once:
servo.attach(9); // Указываем объекту класса Servo, что серво присоединен к пину 9
servo.write(0); // Выставляем начальное положение
Wire.begin(); //Инициализирует библиотеку Wire и подключается к шине I2C
Wire.setClock(400000L); //задаем частоту передачи данных 400кГц
oled.begin(&Adafruit128x64, I2C_ADDRESS);
oled.setFont(Adafruit5x7);
oled.clear(); //почистить экран OLED
lcd.init(); //##################################################инициализация lcd1602
lcd.backlight(); //##################################################вкл подстветка
pinMode(UP, INPUT_PULLUP); //Устанавливает режим работы заданного вход/выхода(pin) как входа
pinMode(DOWN, INPUT_PULLUP); //Устанавливает режим работы заданного вход/выхода(pin) как входа
pinMode(START, INPUT_PULLUP); //Устанавливает режим работы заданного вход/выхода(pin) как входа
pinMode(MOT1_DIR, OUTPUT); //Устанавливает режим работы заданного вход/выхода(pin) как выхода
pinMode(MOT1_STP, OUTPUT); //Устанавливает режим работы заданного вход/выхода(pin) как выхода
pinMode(NAGREV, OUTPUT); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Управление нагревом
pinMode(GERKON, INPUT_PULLUP); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Порт Геркон принимает сигнал от кнопки
x = 0; //обнуляем
y = 0; //обнуляем
}
void loop()
{
peripheral_loop();
// TODO: put your main code here, to run repeatedly:
staticmenu(); //вызов функции
if (!digitalRead(UP) && x == 0) //если нажата кнопка UP
{
oled.clear(); //чистка экрана
lcd.clear(); //#####################################################чистка lcd1602
staticmenu(); //вызов функции
y += 1; //прибавляем один виток при нажатии кнопки UP
delay(5); //задержка при установки числа витков в плюс
oled.setCursor(55, 60); //курсор в точку
oled.print(y, DEC); //на экран в десятичном виде выдать значение переменной y
lcd.setCursor(6, 1); //#####################################################ставим курсор на 6 позицию 1 строки
lcd.print(y, DEC); //#####################################################на экран в десятичном виде выдать значение переменной y
}
if (!digitalRead(DOWN) && x == 0) // если нажата кнопка DOWN
{
oled.clear(); //чистка экрана
lcd.clear(); //чистка lcd1602
staticmenu(); //вызов функции
y -= 1; //вычитаем один виток при нажатии кнопки DOWN
delay(5); //задержка установки числа витков в минус
oled.setCursor(55, 60); //курсор в точку
oled.print(y, DEC); //на экран в десятичном виде выдать значение переменной y
lcd.setCursor(6, 1); //#####################################################ставим курсор на 6 позицию 1 строки
lcd.print(y, DEC); //#####################################################на экран в десятичном виде выдать значение переменной y
}
if (x == 0 && y >= 1) //если x=0 и введено некоторое количество витков y больше или равно 1
{
if (!digitalRead(START)) //если нажата кнопка старт
{
stepA(); //вызвать функцию stepA
}
}
}
void staticmenu() //сама функция staticmenu()
{
oled.set2X();
oled.setCursor(20, 0);
oled.println("HAMOTKA"); //Надпись названия программы сверху
lcd.setCursor(0, 0);
lcd.println(" HAMOTKA "); //##################################################вывод строки Привет мир
}
void stepA() //сама функция stepA
{
x = 1; //переменной x присвоена 1
// for (unsigned int a = 1; a <= y; a++) // a это текущее значение намотанных витков на экране, для a=1, a меньше или равно y, прибавить к a единицу
do // Заменяем цикл FOR на DO .. WHILE цикл идет до тех пор пока CountGerkon не сравняется с установленным количеством намотки y
{
if (j) //организуем цикл для сервопривода качания каретки вправо влево
{
if (g == 22) // g витков в одном слою секции меняется возрастая и убывая
{
j = 0;
--g; //вычесть единицу
}
else
++g; //прибавить единицу
}
else
{
if (g == 0)
{
j = 1;
++g; //прибавить единицу
}
else
--g; //вычесть единицу
}
//////////////////////////////обработка геркона (при нажатии кнопки)
if (!digitalRead(GERKON)) //если сработал геркон
{
oled.clear(); //чистка экрана
lcd.clear(); //#####################################################чистка lcd1602
staticmenu(); //вызов функции
CountGerkon += 1; //прибавляем один при срабатывании геркона
delay(5); //задержка для усранения дребезга
oled.setCursor(55, 60); //курсор в точку
oled.print(CountGerkon, DEC); //на экран в десятичном виде выдать значение переменной y
lcd.setCursor(6, 1); //#####################################################ставим курсор на 6 позицию 1 строки
lcd.print(CountGerkon, DEC); //#####################################################на экран в десятичном виде выдать значение переменной y
}
/////////////////////////////end обработки геркона (нажатия кнопки)
oled.clear(); //почистить экран
lcd.clear(); //чистка lcd1602
staticmenu(); //вызов функции staticmenu()
oled.set2X();
oled.setCursor(55, 65); //курсор поставить на 55 и 65
oled.print(CountGerkon, DEC); //печать на экран фактического текущего значения витков переменной a
lcd.setCursor(6, 1); //#############################################################курсор поставить на 6 позицию 1 строки
lcd.print(CountGerkon, DEC); //#############################################################печать на экран фактического текущего значения витков переменной a
digitalWrite(MOT1_STP, HIGH); //Установка значения HIGH приведет к тому, что напряжение на выходе MOT1_STP будет 5В
digitalWrite(NAGREV, HIGH); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Установка значения HIGH приведет к тому, что включится нагрев
servo.write(g); // Поворачиваем серво на g градусов
delay(355); // ждем 355 подбироается под обороты конкретного редуктора основного привода намотки
} while (CountGerkon <= y - 1);
digitalWrite(MOT1_STP, LOW); //Установка значения LOW приведет к тому, что напряжение на выходе MOT1_DIR будет 0В
digitalWrite(NAGREV, LOW); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Установка значения LOW приведет к тому,что нагрев прекратится
}