У меня тут что то получилось, а что не понятно. сможете проверить? пины смотрел на плате Arduino Uno/
1-я плата
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
int Speed = 0; //скорость,
int sensorSpeed = 0 ; //аналоговое задание скорости на входе
int sensorTime = 0; // задание время работы на входе,
int time = 0; // промежуточная переменная времени работы , сек
int timeMinut = 0; //время работы в мин и сек
int timeSecond = 0;
int sensorRevers = 0 ; // задание время цикла реверса на входе
int reversTime = 0; // промежуточная переменная времени реверса , сек
int reversMinut = 0; //время цикла реверса в мин и сек
int reversSecond = 0;
int AutoReversMinut = 0; //промежуточное время наступления реверса в мин и сек
int AutoReversSecond = 0;
int reversIn1 = HIGH; // переменная реверс вход 1
int reversIn2 = HIGH; // переменная реверс вход 2
int reversOut = LOW; // переменная направления реверса выход на модуль ШД 1-вперед, 0-назад
volatile int Start = HIGH; // переменная кнопки "пуск" 0-пуск, 1- стоп
volatile int Stop = LOW; // переменная кнопки "стоп" 0- стоп
int Auto = HIGH; // вход ручное упр.- 1, автомат - 0
int Rabota = HIGH; // переменная 0- "Работа", 1 - остановка
long mn = 0; //минуты из millis
long s = 0; //секунды из millis
int StopMinut = 0; //время остановки в автомате мин, сек,
int StopSecond = 0;
void setup()
{
pinMode(8, INPUT); // переключатель реверс вх1
pinMode(7, INPUT); // переключатель реверс вх2 10-вперед, 01-назад, 11- автореверс
pinMode(13, INPUT); // кнопка 0- пуск
attachInterrupt(13, pusk, FALLING); // Прерывание при нажатии кнопки Пуск. 1-0 пуск
pinMode(12, INPUT); // кнопка 0- стоп
attachInterrupt(4, avtomat, CHANGE); // переключатель 0-автомат,1-ручной (остановка по прерыванию при изменении положения перекл.)
pinMode(5, OUTPUT); // выход на контр.ШД 1-пуск, 0-стоп
pinMode(6, OUTPUT); // выход реверс на модуль ШД 1-вперед, 0-назад
pinMode(2, OUTPUT); // выход звук , 0-звук
//предустановка выходов
digitalWrite(5, LOW); // стоп
digitalWrite(6, LOW); //назад
digitalWrite(2, LOW); // нет звука
lcd.init(); //запуск индикатора
lcd.backlight();
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print("CTOn");
}
void loop()
{
// скорость вращения
sensorSpeed = analogRead(A0); //читаем задание скорости
Speed = map(sensorSpeed, 0, 1023, 20, 150); // масштабируем из 0-1023 в диапазон 20-150
lcd.setCursor(0, 0); // печатаем скорость
lcd.print("Ckop:");
lcd.setCursor(12, 0);
lcd.print(" ");
lcd.setCursor(12, 0);
if ( Speed < 100 ) {
lcd.print(" "); //если цифра скорости двузначная, то впереди печатаем пробел
}
lcd.print(Speed);
lcd.setCursor(16, 0);
lcd.print("o6/m");
lcd.setCursor(0, 1);
lcd.print("Bpem:");
//реверс - время, направление, режим
reversIn1 = digitalRead(
; //читаем вход 1 реверса
reversIn2 = digitalRead(7); //читаем вход 2 реверса
if (reversIn1 == HIGH && reversIn2 == LOW) { //если 1 и 0 то...
digitalWrite(6, LOW); // выдаем на выход "вперед"
reversOut = LOW ;
} // запоминаем состояние реверса
if (reversIn1 == LOW && reversIn2 == HIGH) { //если 0 и 1 то...
digitalWrite(6, HIGH); // выдаем на выход "назад"
reversOut = HIGH ;
} // запоминаем состояние реверса
if (reversIn1 == HIGH && reversIn2 == HIGH) { //если 1 и 1 то режим автореверс
digitalWrite(6, reversOut); // выдаем на выход переменную направления реверса
lcd.setCursor(11, 2);
lcd.print("ABTO");
sensorRevers = analogRead(A2); //читаем задание времени реверса
reversTime = map(sensorRevers, 0, 1023, 5, 120); // масштабируем из 0-1023 в диапазон 5-120 сек
reversMinut = reversTime / 60; // вычисляем минуты
reversSecond = 5 * ((reversTime - (reversMinut * 60)) / 5); // вычисляем секунды (кратно 5)
lcd.setCursor(16, 2); // печатаем время реверса, минут
lcd.print(" ");
lcd.setCursor(16, 2);
lcd.print(reversMinut);
lcd.setCursor(17, 2); // печатаем время реверса, секунд
lcd.print(":");
lcd.setCursor(18, 2);
if ( reversSecond < 10 ) {
lcd.print("0");
}
lcd.print(reversSecond);
unsigned long currentMillis = millis(); //Вычисляем текущие минуты и секунды из millis
mn = (((currentMillis / 1000) / 60 ) % 60 ) % 60 ;
s = (currentMillis / 1000) % 60 ;
if ( Rabota == LOW ) { //если в режиме автореверса идет "работа" то сравниваем время
if ( mn >= AutoReversMinut && s >= AutoReversSecond ) { //если наступило время переключения, то...
reversOut = !reversOut ; //меняем направление реверса...
AutoReversSecond = s + reversSecond ; // ...и считаем следующее время переключения
if ( AutoReversSecond > 59 ) {
AutoReversSecond = AutoReversSecond - 60 ;
AutoReversMinut = mn + reversMinut + 1 ;
}
else {
AutoReversMinut = mn + reversMinut ;
}
if ( AutoReversMinut > 59 ) {
AutoReversMinut = AutoReversMinut - 60 ;
}
}
}
else {
AutoReversSecond = s + reversSecond ; //если режим автореверса и нет работы то запоминаем время для начала отсчета реверса при работе
if ( AutoReversSecond > 59 ) {
AutoReversSecond = AutoReversSecond - 60 ;
AutoReversMinut = mn + reversMinut + 1 ;
}
else {
AutoReversMinut = mn + reversMinut ;
}
if ( AutoReversMinut > 59 ) {
AutoReversMinut = AutoReversMinut - 60 ;
}
}
}
else { //если в ручном режиме реверса ,то стираем АВТО и секунды
lcd.setCursor(11, 2);
lcd.print(" ");
}
if ( reversOut == LOW ) { // если реверс "вперед" то печатаем >>>
lcd.setCursor(7, 2);
lcd.print(">>>");
}
else { // если реверс "назад" то печатаем <<<
lcd.setCursor(7, 2);
lcd.print("<<<");
}
lcd.setCursor(0, 2);
lcd.print("PeBepc:");
//отработка пуска
if (Stop == HIGH && Start == LOW) { //если была нажата "пуск" и не нажата "стоп" то...
digitalWrite(5, HIGH); // выдаем на выход пуск
Rabota = LOW ; //признак работы = 0 - "работа"
Start = HIGH ; //сбрасываем признак прерывания (начала работы)
StopSecond = timeSecond + s ; //вычисляем минуты и секунды остановки
if ( StopSecond > 59 ) {
StopSecond = StopSecond - 60 ;
StopMinut = mn + timeMinut + 1 ;
}
else {
StopMinut = mn + timeMinut ;
}
if ( StopMinut > 59 ) {
StopMinut = StopMinut - 60 ;
}
}
if ( Rabota == LOW ) { //если признак работы 0, то печатаем "Работа"
lcd.setCursor(0, 3);
if ( s % 2 == 0 ) {
lcd.print("PA6OTA"); // моргаем словом "Работа" через 1 сек
}
else {
lcd.setCursor(0, 3);
lcd.print(" ");
}
detachInterrupt(13) ; //на время работы запрещаем прерывания по кнопке "пуск"
}
else {
attachInterrupt(13, pusk, FALLING); // иначе разрешаем прерывание при нажатии кнопки Пуск. 1-0 пуск
}
//Автоматический (по таймеру) или ручной режим
Auto = digitalRead(4); //читаем вход ручное упр.1, - автомат 0
if ( Rabota == LOW && Auto == LOW) { //если режим "Работа"+"Автомат"
timeSecond = StopSecond - s; // вычисляем оставшиеся секунды до остановки
if ( timeSecond < 0 ) { //если текущие секунды больше секунд останова,
timeSecond = timeSecond + 60 ; //то занимаем 1 минуту
timeMinut = StopMinut - mn - 1;
} // вычисляем минуты
else {
timeMinut = StopMinut - mn ;
}
if ( timeMinut < 0 ) { //если текущие минуты больше минут останова, то...
timeMinut = timeMinut + 60;
} //то занимаем 1 час (60 минут), часы нас не интересуют
if ( timeSecond == 0 && timeMinut == 0 ) //если оставшееся время равно 0, то...
{
Stop = LOW ; //идем останавливаться
}
//если до окончания работы осталось менее 8 с, то начинаем пищать на 8, 6, 4 и 2й секундах
if ( ((timeSecond == 8 ) || (timeSecond == 6 ) || (timeSecond == 4 )) && timeMinut == 0 ) {
tone(2, 20);
}
if ( timeSecond == 2 && timeMinut == 0 ) {
digitalWrite(2, HIGH); // в конце выдаем непрерывный сигнал 2 сек
}
if ( ((timeSecond == 7 ) || (timeSecond == 5 ) || (timeSecond == 3 )) && timeMinut == 0 ) { //снимаем звук на 7, 5 и 3й секундах
noTone(2) ;
digitalWrite(2, LOW);
}
}
else { //если не "Работа" или не "Автомат" ХЗ ЧТО ДЕЛАТЬ ДАЛЬШЕ...
sensorTime = analogRead(A1); //читаем задание времени работы
time = map(sensorTime, 0, 1023, 10, 595); // масштабируем из 0-1023 в диапазон 10-595 сек
timeMinut = time / 60; // вычисляем минуты
timeSecond = 10 * ((time - (timeMinut * 60)) / 10); // вычисляем секунды (кратно 10)
time = 60 * timeMinut + timeSecond;
}
if ( Auto == HIGH ) { //если 1, то ручное управление
lcd.setCursor(7, 1);
lcd.print(" -----");
}
else { // если 0 то автомат
lcd.setCursor(15, 1);
lcd.print(" ");
lcd.setCursor(15, 1); // печатаем время работы, минут
if ( timeMinut < 10 ) {
lcd.print(" ");
}
lcd.print(timeMinut);
lcd.setCursor(17, 1); // печатаем время работы, секунд
lcd.print(":");
lcd.setCursor(18, 1);
if ( timeSecond < 10 ) {
lcd.print("0");
}
lcd.print(timeSecond);
}
//остановка
if (Stop == LOW ) { //если нажата "стоп" то...
digitalWrite(5, LOW); // выдаем на выход стоп
noTone(2) ;
digitalWrite(2, LOW); //снимаем звук
Rabota = HIGH; //признак работы = 1 - остановка
lcd.setCursor(0, 3); // печатаем "стоп"
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print("CTOn ");
}
Stop = digitalRead(12); //читаем вход кнопки стоп
}
//обработка прерывания по кнопке Пуск
void pusk()
{
Start = LOW ;
}
//обработка прерывания при изменении переключателя ручной\автомат - вызывает остановку.
void avtomat ()
{
Stop = LOW;
}
и 2-я
#include <AccelStepper.h>
#include <MultiStepper.h>
const int stepsPerRevolution = 200; //кол-во шагов на оборот
const int reversPin = 13; //вход реверс
const int startPin = 12; //вход пуск-стоп
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 7,6,5,4);
int stepCount = 0; // number of steps the motor has taken
int reversState = 0; //состояние кнопки реверса
int startState = 0; //состояние кнопки пуск-стоп
void setup() {
pinMode(reversPin, INPUT_PULLUP);// вход кнопки реверса
pinMode(startPin, INPUT_PULLUP);// вход кнопки старт
}
void loop() {
reversState = digitalRead(reversPin); //читаем вход кнопки направления вращения
startState = digitalRead(startPin); //читаем вход кнопки старт
int sensorReading = analogRead(A0); //читаем задание скорости
int motorSpeed = map(sensorReading, 0, 1023, 20, 150); // масштабируем из 0-1023 в диапазон 20-150
if (startState == HIGH) { //если на входе старт=1, то запускаем программу ШД, если =0 то на выходы ШД пишем 0
myStepper.setSpeed(motorSpeed);
if (reversState == HIGH) { // если реверс =1, тогда крутим в одну сторону
myStepper.step(stepsPerRevolution/200);
}
else {
myStepper.step(-stepsPerRevolution/200); //направление вращения - // иначе крутим в другую сторону
}
}
else {
digitalWrite(7, LOW);
digitalWrite(6, LOW);
digitalWrite(5, LOW);
digitalWrite(4, LOW);
}
}