#include <EEPROM.h>
#define INIT_ADDR 20 // номер резервной ячейки
#define INIT_KEY 50 // ключ первого запуска. 0-254, на выбор
#include "LiquidCrystal_1602_RUS.h"
LiquidCrystal_1602_RUS lcd(12, 13, 5, 4, 7, 6);
// rs(12) e(13) d4(5) d5(4) d6(7) d7(6)
//пины датчика и клапанов
#define pin_isr 2 //номер пина датчика
#define pin_bok1 10 // прижим фиксация продукта
#define pin_zakr 9 //распределитель закрутки
#define pin_vert 8 // вертикальный фиксация крышки
#define pin_ots A2 // отсекатель
// пины кнопок
#define pin_vlevo A0 // кнопка влево
#define pin_vpravo A1// кнопка вправо
#define pin_vverh A3 // кнопка вверх
#define pin_vniz A4 // кнопка вниз
#define pin_enter A5// кнопка ввод
// пин двигателя
#define pin_shim 11 // шим для управления двигателем OC2A
// пин zero
#define pin_zero 3 // детектор прохода полуволны через 0
volatile bool first_start = 0 ; // если 0 то признак 1 старта откуда читать данные из EEPROM или инициализация
// при сработке прерывания от датчика запоминаем значение счетчика в переменных
// прижимы лимиты
#define max_Boktime 2500 // максимальная задержка сработки
#define min_Boktime 20 //минимальная задержка сработки боковой фиксатор
#define max_Verttime 2000 // лимиты время закрутки
#define min_Verttime 20
#define max_Bokdelay 244 //максимальное время задержки сработки фиксатора крышки
#define min_Bokdelay 20 // минимальное время задержки сработки фиксатора крышки
#define max_Vertdelay 90 // лимиты задержки отпускания продукта
#define min_Vertdelay 20
#define max_Spindelay 190 // лимиты задержки закрутки после фиксатора крышки
#define min_Spindelay 20
#define max_length 990 // лимиты задержки длины продукта
#define min_length 110
// двигатель лимиты
#define strong_max 90
#define strong_min 20
#define osr_max 100 // пересчет на регистр OCR2
#define osr_min 10
// датчик
#define debonce_max 1000 //лимиты времени блокировки от сработки датчика
#define debonce_min 10
// лимиты обнаружения строб сигнала от сети
#define T_det_max 180
#define T_det_min 140
volatile bool ready_klap = 1; // переменная разрешения включения прижимов
bool flag = 0; // переменная для определения обьекта изменения (что меняем pointer или сам параметр)
bool is_redakt = 0 ; // переменная для включение возможности редактирования параметра
volatile bool save_redakt = 0; // сохранение переменных в памяти устройства
#include "button.h"
button btn_vlevo(pin_vlevo); // кнопка влево
button btn_vpravo(pin_vpravo);// кнопка вправо
button btn_vverh(pin_vverh); // кнопка вверх
button btn_vniz(pin_vniz);// кнопка вниз
button btn_enter(pin_enter);// кнопка enter " сохранить значение"
bool btn_speed = 0; // переменная включения скоростной перемотки значений
uint8_t kolvo_btn; // количество сработок одной и той же кнопки за время t
uint32_t btn_tmr;// засекаем время входа в ту же самую функцию
#define min_Kolvo_btn 3 // минимальное количесво повторных сработок для включения режима ускоренной перемотки
#define btn_lim_tmr 510 // время сигнализирующее что кнопка была нажата повторно***завязано с botton.h
// не может быть меньше времени повторной сработки
//клапана горизонтальных и вертикальных зажимов
bool prigimG_status = 0; //переменная включения клапана прижима горизонтального prigimG_on=1 если боковые прижимы держат продукт
bool prigimV_status = 0; // переменная включения клапана вертикального prigimV_on=1 если продукт зажат сверху
bool prigimZ_status = 0; // переменная включения клапана закрутки
bool prigimO_status =0; // переменная включения отсекателя
//#include "timer.h"
volatile uint16_t time_bok =1300; // задержка сработки бокового прижима пневмоцилиндра
volatile uint16_t time_vert = 140; // время закрутки
volatile uint8_t delay_bok =120; // задержка сработки фиксатора крышки
volatile uint8_t delay_vert = 10; // задержка отпускания продукта
volatile uint8_t delay_spin = 37;// задержка сработки закрутки после фиксатора крышки
volatile uint16_t length_product=420;// задержка длительности продукта
// двигатель закрутки
volatile bool dvig_on = 1; // переменная включения двигателя dvig_on=1 если двигатель включен
volatile uint8_t strong_zakr = 60; // усилие закрутки
// детектирование сигнала строб от сети
volatile uint8_t t_detect = 0; // время между импульсами детектирования
volatile uint8_t N_strob = 0;
volatile uint8_t mass[5] = {0, 0, 0, 0, 0};
// датчик
volatile bool datchik_status = 0; // переменная сработки датчика datchik_on=1 если датчик сработал
volatile uint8_t process_status = 0; // статус процесса 0-готов 1 - блокировка 2- блокировка снята 3- сработка бок. прижим 3 сработка верт. прижим
//volatile uint32_t debounce; // переменная для замера времени дребезга
//volatile uint32_t time_start; // переменная для сохранения метки начала отсчета времени
bool akt_level = 0; // активный уровень сигнала фронт-0 или спад-1
bool set_pedal = 0; // подключение сработки от педали 0-выкл 1 -вкл
volatile uint16_t delay_block = 500; // блокировка следующей сработки после сработки датчика
uint8_t pointer = 0; // Переменная указатель для движения по пунктам меню
uint8_t ukasatel = 0 ; // указывант курсору куда встать 0- 1строка 1-2 строка дисплея
// при сработке прерывания от датчика запоминаем значение счетчика в переменных
ISR (INT0_vect)
{
// if ((millis() - debounce >= value_deb) && digitalRead(pin_isr))
// {
// debounce = millis();
//datchik_status =0;
if (!digitalRead(pin_isr)) {datchik_status = 1;
EIMSK &= ~(1 << INT0); // блокировка сработки прерывания на время delay_block
TCNT1 = 65535 -(length_product<<4);
TCCR1B = (1 << CS12) | (1 << CS10); // старт Т1
process_status = 1;
digitalWrite(pin_ots, 0);// открываем отсекатель
prigimO_status = 1;
}
// digitalWrite(pin_bok2, 1);// открываем тиристор
// }
}
ISR (TIMER1_OVF_vect)//закрываем отсекатель
{ digitalWrite(pin_ots, 1);// закрываем тиристор
prigimO_status = 0;
//datchik_status = 0;
process_status = 2;
//EIMSK |= (1 << INT0); // снимаем блокировку от повторной сработки
TCCR1B = 0; // тормозим счетчик
TCNT1 = 0;
OCR1A = (time_bok<<4);// все значения умножены на 16
OCR1B = (time_bok<<4) + (delay_bok<<5);
TCCR1B = (1 << CS12) | (1 << CS10); // один тик (1/16)*1024=64 мкс
datchik_status = 0;
}
ISR (TIMER1_COMPA_vect)//прерывание по совпадению TCNT1 c OCR1А
{
// отпускаем продукт
if (ready_klap && (process_status == 4)) {
digitalWrite(pin_bok1, 1);// закрываем тиристор
prigimG_status = 0;
// digitalWrite(pin_ots, 0);// открываем отсекатель
//prigimO_status = 1;
TCCR1B = 0;
TCNT1 = 0;
TIMSK1|= (1 << OCIE1B);//разрешаем прерывание Т1В
process_status = 0 ;
EIMSK |= (1 << INT0); // снимаем блокировку от повторной сработки
}
// включаем закрутку
if (ready_klap && (process_status == 3)) {
// process_status = 4;
digitalWrite(pin_zakr, 0);// открываем тиристор закрутки
prigimZ_status = 1;
}
// захват продукта
if (ready_klap && (process_status == 2)) {
digitalWrite(pin_bok1, 0);// фиксация бутылки
//digitalWrite(pin_bok2, 0);// открываем тиристор
prigimG_status = 1;
}
}
ISR (TIMER1_COMPB_vect)//прерывание по совпадению TCNT1 c OCR1А
{
// отпускаем продукт
//if (ready_klap && (process_status == 4)) {
// digitalWrite(pin_ots, 1);// закрываем тиристор
//prigimO_status = 0;
//TCCR1B = 0;
// TCNT1 = 0;
//process_status = 0 ;
//EIMSK |= (1 << INT0); // снимаем блокировку от повторной сработки датчика
// }
// выключаем закрутку
if (ready_klap && (process_status == 3)) {
digitalWrite(pin_vert, 1);// выключаем прижим крышки
// digitalWrite(pin_ots, 0);// открываем отсекатель
digitalWrite(pin_zakr, 1);// выключаем закрутку
// prigimO_status = 1;
prigimV_status = 0;
prigimZ_status = 0;
//process_status = 0 ;
TCCR1B = 0;
TCNT1 = 0;
process_status = 4;
OCR1A =delay_vert<<5;
TIMSK1&= ~ (1 << OCIE1B); // запрет прерывания от Т 1 b
//OCR1A =length_product<<5;
//OCR1B =OCR1A+(length_product<<4);
TCCR1B = (1 << CS12) | (1 << CS10);
}
// сработка фиксатора крышки
if (ready_klap && (process_status == 2)) {
digitalWrite(pin_vert, 0);// открываем тиристор верт. прижима
prigimV_status = 1;
process_status = 3;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = (delay_spin<<5);
OCR1B = OCR1A + (time_vert<<4);
TCCR1B = (1 << CS12) | (1 << CS10);
}
}
ISR (INT1_vect)// прошли через 0 стартуем счетчиком
{ // еще раз проверяем точно через 0 прошли
if (!digitalRead(pin_zero))
{if (first_start ) {TCCR2B = 0;// останавливаем счетчик
t_detect = TCNT2;
mass[N_strob] = t_detect;
N_strob++;
if (N_strob >= 5) N_strob = 0;
TCNT2 = 0;
OCR2A = map(strong_zakr, strong_min, strong_max, osr_max, osr_min);
OCR2B =osr_max;
TCCR2B = (1 << CS22) | (1 << CS21) | (1 << CS20); //коэфициент деления 1024 1/16*1024=64 мкс
//if (dvig_on) digitalWrite(pin_shim, 1); //закрываем тиристор
digitalWrite(pin_shim, 1);
//OCR2A = map(strong_zakr, strong_min, strong_max, osr_max, osr_min);
}
else { TCCR2B = 0; // первый замер ничего не делаем
TCNT2 = 0;
TCCR2B = (1 << CS22) | (1 << CS21) | (1 << CS20); //коэфициент деления 1024 1/16*1024=64 мк
first_start=1;
}
}
}
ISR (TIMER2_COMPA_vect)//прерывание по совпадению TCNT2 c OCR2
{// чем раньше откроем тиристор тем действующее значение полуволны будет больше
if (dvig_on) digitalWrite(pin_shim, 0);// открываем тиристор
}
ISR (TIMER2_COMPB_vect)//защита прерывание по совпадению TCNT2 c OCR2B
{ //TCCR2B = 0; // если вышли за пределы измерения строба
//t_detect = 0;
//mass[N_strob] = t_detect;
// N_strob++;
// if (N_strob >= 5) N_strob = 0;
//if (dvig_on) digitalWrite(pin_shim, 1); //закрываем тиристор
// TCNT2 = 0;
//TCCR2B = (1 << CS22) | (1 << CS21) | (1 << CS20); //коэфициент деления 1024
digitalWrite(pin_shim, 1);// закрываем тиристор
}
void setup()
// put your setup code here, to run once:
{ pinMode(pin_isr, INPUT_PULLUP);
pinMode(pin_shim, OUTPUT);
pinMode(pin_bok1, OUTPUT);
pinMode(pin_zakr, OUTPUT);
pinMode(pin_vert, OUTPUT);
pinMode(pin_ots, OUTPUT);
digitalWrite(pin_bok1, 1);// все прижимы отключены
digitalWrite(pin_zakr, 1);
digitalWrite(pin_vert, 1);
digitalWrite(pin_ots, 1);
digitalWrite(pin_shim, 1);// шим отключен
lcd.begin(16, 2);
// attachInterrupt(0, isr, FALLING); // прерывание на D 2 (int0)
// Serial.begin(9600);
EICRA = (1 << ISC11); //детектор нуля спадающий фронт
EIMSK = (1 << INT1) | (1 << INT0); //разрешаем прерывания int0- int1
TIMSK2 = (1 << OCIE2A) | (1 << OCIE2B); //разрешаем прерывание по сравнению OCR2
TCCR2A = 0;
TCCR2B = 0;
TCNT2 = 0; //обнуляем счетчик 2
// настройка Т1 задержка старта фиксации продукта
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 0;
OCR1B = 0;
TIMSK1 = (1 << OCIE1A) | (1 << OCIE1B) | (1 << TOIE1);
process_status = 0;
OCR2A = map(strong_zakr, strong_min, strong_max, osr_max, osr_min);
OCR2B = T_det_max;// лимит выхода за пределы измерения строба
sei();
lcd.clear();
if (EEPROM.read(INIT_ADDR) != INIT_KEY) { // первый запуск
EEPROM.write(INIT_ADDR, INIT_KEY); // записали ключ
// записали стандартное значение яркости
// в данном случае это значение переменной, объявленное выше
EEPROM.put(0, time_bok); // инициализация значений
EEPROM.put(2, delay_bok);
EEPROM.put(3, time_vert);
EEPROM.put(5,delay_spin);
EEPROM.put(6, delay_vert);
EEPROM.put(7, strong_zakr);
EEPROM.put(8, delay_block);
EEPROM.put(10, first_start);
EEPROM.put(11, akt_level);
EEPROM.put(12, length_product);
}
EEPROM.get(0, time_bok); // читаем из памяти
EEPROM.get(2, delay_bok);
EEPROM.get(3, time_vert);
EEPROM.get(5,delay_spin);
EEPROM.get(6, delay_vert);
EEPROM.get(7, strong_zakr);
EEPROM.get(8, delay_block);
EEPROM.get(10, first_start);
EEPROM.get(11, akt_level);
EEPROM.get(12, length_product);
// first_start = 1; // переводим в статус не первого старта
//R_eprom(); //считываем настройки задержек
// if (akt_level) EICRA |= (1 << ISC01) | (1 << ISC00); else EICRA |= (1 << ISC01); // если akt_level =1 активный уровень фронт иначе спад
//EICRA |= (1 << ISC01);// активный фронт спад для датчика продукта
}
void loop() {
// put your main code here, to run repeatedly:
if (btn_vlevo.click())// нажата кнопка влево
{
if (flag == 0) switch (pointer) { // описаны алгоритмы движения по меню при нажатии кнопки влево
case 10: pointer = pointer - 10; ukasatel = 0; break;
case 11: pointer = pointer - 11; ukasatel = 0; break;
case 12: pointer = pointer - 12; ukasatel = 0; break;
case 13: pointer = pointer - 13; ukasatel = 0; break;
case 21: pointer = pointer - 20; ukasatel = 1; break;
case 22: pointer = pointer - 21; ukasatel = 1; break;
case 23: pointer = pointer - 22; ukasatel = 1; break;
case 24: pointer = pointer - 23; ukasatel = 1; break;
case 25: pointer = pointer - 24; ukasatel = 1; break;
case 26: pointer = pointer - 25; ukasatel = 1; break;
case 32:{ pointer = pointer - 30;// выход из диагностики
ukasatel = 0;
ready_klap=true;// разрешаем работу прижимов от прерываний
dvig_on=true; // включаем двигатель
prigimG_status = 0;// все прижимы выключаем
digitalWrite(pin_bok1, !prigimG_status);
prigimV_status = 0;
digitalWrite(pin_vert, !prigimV_status);
prigimZ_status = 0;
digitalWrite(pin_zakr, !prigimZ_status);
prigimO_status = 0;
digitalWrite(pin_ots, !prigimO_status);
break;
}
case 33: {pointer = pointer - 31;
ukasatel = 0;
ready_klap=true;
dvig_on=true;
prigimG_status = 0;
digitalWrite(pin_bok1, !prigimG_status);
prigimV_status = 0;
digitalWrite(pin_vert, !prigimV_status);
prigimZ_status = 0;
digitalWrite(pin_zakr, !prigimZ_status);
prigimO_status = 0;
digitalWrite(pin_ots, !prigimO_status);
break;
}
case 34: {pointer = pointer - 32;
ukasatel = 0;
ready_klap=true;
dvig_on=true;
prigimG_status = 0;
digitalWrite(pin_bok1, !prigimG_status);
prigimV_status = 0;
digitalWrite(pin_vert, !prigimV_status);
prigimZ_status = 0;
digitalWrite(pin_zakr, !prigimZ_status);
prigimO_status = 0;
digitalWrite(pin_ots, !prigimO_status);
break;
}
case 35: {pointer = pointer - 33;
ukasatel = 0;
ready_klap=true;
dvig_on=true;
prigimG_status = 0;
digitalWrite(pin_bok1, !prigimG_status);
prigimV_status = 0;
digitalWrite(pin_vert, !prigimV_status);
prigimZ_status = 0;
digitalWrite(pin_zakr, !prigimZ_status);
prigimO_status = 0;
digitalWrite(pin_ots, !prigimO_status);
break;
}
case 36: {pointer = pointer - 34;
ukasatel = 0;
ready_klap=true;
dvig_on=true;
prigimG_status = 0;
digitalWrite(pin_bok1, !prigimG_status);
prigimV_status = 0;
digitalWrite(pin_vert, !prigimV_status);
prigimZ_status = 0;
digitalWrite(pin_zakr, !prigimZ_status);
prigimO_status = 0;
digitalWrite(pin_ots, !prigimO_status);
break;
}
case 43: pointer = 3; ukasatel = 1; break;
case 44: pointer = 3; ukasatel = 1; break;
case 121: pointer = pointer - 100; ukasatel = 0; break;
case 122: pointer = pointer - 101; ukasatel = 0; break;
case 123: pointer = pointer - 102; ukasatel = 0; break;
case 132: pointer = pointer - 100; ukasatel = 0; break;
case 133: pointer = pointer - 100; ukasatel = 1; break;
case 134: pointer = pointer - 100; ukasatel = 1; break;
case 135: pointer = pointer - 100; ukasatel = 1; break;
case 136: pointer = pointer - 101; ukasatel = 1; break;
case 137: pointer = pointer - 101; ukasatel = 0; break;
case 221: pointer = pointer - 199; ukasatel = 1; break;
case 222: pointer = pointer - 200; ukasatel = 1; break;
case 225: pointer = pointer - 202; ukasatel = 0; break;
case 230: pointer = pointer - 206; ukasatel = 1; break;
case 231: pointer = pointer - 207; ukasatel = 1; break;
case 232: pointer = pointer - 208; ukasatel = 1; break;
case 235: pointer = pointer - 210; ukasatel = 1; break;
case 241: pointer = pointer - 215; ukasatel = 0; break;
default: break;
}
print_clr();
flag = 0;
is_redakt = false;
}
if (btn_vpravo.click())// нажата кнопка вправо
{
if (flag == 0) switch (pointer) { // описаны алгоритмы движения по меню при нажатии кнопки вправо
case 0: pointer = pointer + 10; ukasatel = 0; break;
case 1: pointer = pointer + 20; ukasatel = 0; break;
case 2: {pointer = pointer + 30;// вход в режим диагностики
ukasatel = 0;
ready_klap=false;// запрещаем работу от прерываний
dvig_on=false; // двигатель выключаем
break;
}
case 3: pointer = pointer + 40; ukasatel = 1; break;
case 21: pointer = pointer + 100; ukasatel = 0; break;
case 22: pointer = pointer + 199; ukasatel = 0; break;
case 23: pointer = pointer + 202; ukasatel = 0; break;
case 24: pointer = pointer + 206; ukasatel = 0; break;
case 25: pointer = pointer + 210; ukasatel = 0; break;
case 26: pointer = pointer + 215; ukasatel = 0; break;
case 32: pointer = pointer + 100; ukasatel = 1; break;
case 33: pointer = pointer + 100; ukasatel = 1; break;
case 34: pointer = pointer + 100; ukasatel = 1; break;
case 35: pointer = pointer + 100; ukasatel = 0; break;
case 36: pointer = pointer + 101; ukasatel = 0; break;
default: break;
flag = 0;
is_redakt = false;
}
print_clr();
}
if (btn_vverh.click())// нажата кнопка вверх
{ // Двигаем указатель в пределах дисплея;
if ((millis() - btn_tmr) < btn_lim_tmr ) kolvo_btn++; else kolvo_btn = 0;
if (kolvo_btn > min_Kolvo_btn) btn_speed = 1; else btn_speed = 0;
btn_tmr = millis();
if (flag == 0) switch (pointer) {
// описаны алгоритмы движения по меню при нажатии кнопки вверх
case 0: pointer = 0; ukasatel = 0; break;
case 1: pointer = pointer - 1; ukasatel = 0; break;
case 2: pointer = pointer - 1; ukasatel = 1; break;
case 3: pointer = pointer - 1; ukasatel = 0; break;
case 10: pointer = 10; ukasatel = 0; break;
case 11: pointer = pointer - 1; ukasatel = 0; break;
case 12: pointer = pointer - 1; ukasatel = 0; break;
// case 13: pointer = pointer - 1; ukasatel = 0; break;
case 21: pointer = 21; ukasatel = 0; break;
case 22: pointer = pointer - 1; ukasatel = 0; break;
case 23: pointer = pointer - 1; ukasatel = 1; break;
case 24: pointer = pointer - 1; ukasatel = 0; break;
case 25: pointer = pointer - 1; ukasatel = 1; break;
case 26: pointer = pointer - 1; ukasatel = 0; break;
case 32: pointer = 32; ukasatel = 0; break;
case 33: pointer = pointer - 1; ukasatel = 0; break;
case 34: pointer = pointer - 1; ukasatel = 1; break;
case 35: pointer = pointer - 1; ukasatel = 0; break;
case 36: pointer = pointer - 1; ukasatel = 1; break;
case 43: pointer = 3; ukasatel = 1; break;
case 121: pointer = 121; ukasatel = 0; break;
case 122: pointer = pointer - 1; ukasatel = 0; break;
case 123: pointer = pointer - 1; ukasatel = 1; break;
case 135: pointer = 135; ukasatel = 0; break;
case 136: pointer = pointer - 1; ukasatel = 0; break;
case 221: pointer = 221; ukasatel = 0; break;
case 222: pointer = pointer - 1; ukasatel = 0; break;
case 225: pointer = 225; ukasatel = 0; break;
case 230: pointer = 230; ukasatel = 0; break;
case 231: pointer = pointer - 1; ukasatel = 0; break;
case 232: pointer = pointer - 1; ukasatel = 1; break;
default: break;
}
if (flag == 1) switch (pointer) {
// описаны алгоритмы движения по меню при нажатии кнопки вверх
case 43: if ( save_redakt == 0) save_redakt = 1;else save_redakt = 1; break;
case 121: if ( set_pedal == 0) set_pedal = 1; else set_pedal = 0; break;
case 122: if ( akt_level == 0) {
akt_level = 1;
// EICRA = (1 << ISC11) | (1 << ISC01) | (1 << ISC00);
}
else {
akt_level = 0;
// EICRA = (1 << ISC11) | (1 << ISC01);
}
case 123: if (delay_block < debonce_max) delay_block ++; break;
case 132: {// управляем прижимами прямое включение без разрешения
if ( prigimG_status == 0) {
prigimG_status = 1;
digitalWrite(pin_bok1, !prigimG_status); // выход в статус
}
else {
prigimG_status = 0;
digitalWrite(pin_bok1, !prigimG_status); // выход в статус
}
break;
}
case 133: {
if ( prigimV_status == 0) {
prigimV_status = 1;
digitalWrite(pin_vert, !prigimV_status); // выход в статус
}
else {
prigimV_status = 0;
digitalWrite(pin_vert, !prigimV_status); // выход в статус
}
break;
}
case 134: {
//digitalWrite(pin_vert, prigimV_status); // выход в статус
if ( prigimZ_status == 0) {
prigimZ_status = 1;
digitalWrite(pin_zakr, !prigimZ_status); // выход в статус
}
else {
prigimZ_status = 0;
digitalWrite(pin_zakr, !prigimZ_status); // выход в статус
}
break;
}
case 135: if ( dvig_on == 0) {
// TIMSK2 |= (1 << OCIE2A);
dvig_on = 1;
}
else {
// TIMSK2 &= ~(1 << OCIE2A);
dvig_on = 0;
digitalWrite(pin_shim, 0);
}
break;
case 136: if (strong_zakr < strong_max) {
if (btn_speed) strong_zakr = strong_zakr + 5;
else strong_zakr++;
}
break;
case 137: {
if ( prigimO_status == 0) {
prigimO_status = 1;
digitalWrite(pin_ots, !prigimO_status); // выход в статус
// digitalWrite(pin_bok2, !prigimG_status);
}
else {
prigimO_status = 0;
digitalWrite(pin_ots, !prigimO_status); // выход в статус
// digitalWrite(pin_bok2, !prigimG_status);
}
break;
}
case 221: if (time_bok < max_Boktime) {
if (btn_speed) time_bok = time_bok + 10;
else time_bok++;
}
break;
case 222: if (delay_bok < max_Bokdelay) {
if (btn_speed) delay_bok = delay_bok + 10;
else delay_bok++;
}
break;
case 225: if (delay_vert < max_Vertdelay) {
if (btn_speed) delay_vert = delay_vert + 10;
else delay_vert++;
}
break;
case 230: if (delay_spin < max_Spindelay) {
if (btn_speed) delay_spin = delay_spin + 10;
else
delay_spin ++;
}
break;
case 231: if (time_vert < max_Verttime) {
if (btn_speed) time_vert = time_vert + 10;
else
time_vert++;
}
break;
case 235: if (length_product < max_length) {
if (btn_speed) length_product = length_product + 10;
else
length_product++;
}
break;
//length_product
case 241: if (strong_zakr < strong_max) {
if (btn_speed) strong_zakr = strong_zakr + 5;
else strong_zakr++;
// OCR2A = map(strong_zakr, strong_min, strong_max, osr_max, osr_min);
}
break;
default: break;
}
// flag = 0;
// is_redakt = false;
if (flag == 0) print_clr();
}
if (btn_vniz.click())// нажата кнопка вниз
{ if ((millis() - btn_tmr) < btn_lim_tmr ) kolvo_btn++; else kolvo_btn = 0;
if (kolvo_btn > min_Kolvo_btn) btn_speed = 1; else btn_speed = 0;
btn_tmr = millis();
if (flag == 0) switch (pointer) {
// описаны алгоритмы движения по меню при нажатии кнопки вниз
case 0: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 1: {
pointer = pointer + 1;
ukasatel = 0;
break;
}
case 2: {
pointer = pointer + 1;
ukasatel = 0;
break;
}
case 3: {
pointer = 3;
ukasatel = 1;
break;
}
case 10: {
pointer = pointer + 1;
ukasatel = 0;
break;
}
case 11: {
pointer = pointer + 1;
ukasatel = 0;
break;
}
case 12: {
pointer = 12;
ukasatel = 0;
break;
}
case 21: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 22: {
pointer = pointer + 1;
ukasatel = 0;
break;
}
case 23: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 24: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 25: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 26: {
pointer = 26;
ukasatel = 0;
break;
}
case 32: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 33: {
pointer = pointer + 1;
ukasatel = 0;
break;
}
case 34: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 35: {
pointer = pointer + 1;;
ukasatel = 1;
break;
}
case 36: {
pointer = 36;
ukasatel = 0;
break;
}
case 121: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 122: {
pointer = pointer + 1;
ukasatel = 0;
break;
}
case 123: {
pointer = 123;
ukasatel = 0;
break;
}
case 135: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 136: {
pointer = 136;
ukasatel = 1;
break;
}
case 221: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 222: {
pointer = 222;
ukasatel = 1;
break;
}
case 225: {
pointer = 225;
ukasatel = 0;
break;
}
case 230: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 231: {
pointer = 231;
ukasatel = 0;
break;
}
default: break;
}
if (flag == 1) switch (pointer) {
// описаны алгоритмы движения по меню при нажатии кнопки вверх
case 43: if ( save_redakt == 0) save_redakt = 1; else save_redakt = 0; break;
case 121: if ( set_pedal == 0) set_pedal = 1; else set_pedal = 0; break;
case 122: if ( akt_level == 0) {
akt_level = 1;
// EICRA = (1 << ISC11) | (1 << ISC01) | (1 << ISC00);
}
else {
akt_level = 0;
// EICRA = (1 << ISC11) | (1 << ISC01);
}
break;
case 123: if (delay_block > debonce_min) delay_block --; break;
case 132: {
// TIMSK1 = 0; // запрещаем все прерывания от таймера Т1
// TCCR1B = 0; // останавливаем счетчик
// TCNT1 = 0; // обнуляем значение
if ( prigimG_status == 0) {
prigimG_status = 1;
digitalWrite(pin_bok1, !prigimG_status); // выход в статус
// digitalWrite(pin_bok2, !prigimG_status);
}
else
{ prigimG_status = 0;
digitalWrite(pin_bok1, !prigimG_status); // выход в статус
// digitalWrite(pin_bok2, !prigimG_status);
}
break;
}
case 133: {
// TIMSK1 = 0; // запрещаем все прерывания от таймера Т1
// TCCR1B = 0; // останавливаем счетчик
// TCNT1 = 0; // обнуляем значение
if ( prigimV_status == 0) {
prigimV_status = 1;
digitalWrite(pin_vert, !prigimV_status); // выход в статус
}
else {
prigimV_status = 0;
digitalWrite(pin_vert, !prigimV_status); // выход в статус
}
break;
}
case 134: {
// TIMSK1 = 0; // запрещаем все прерывания от таймера Т1
// TCCR1B = 0; // останавливаем счетчик
// TCNT1 = 0; // обнуляем значение
if ( prigimZ_status == 0) {
prigimZ_status = 1;
digitalWrite(pin_zakr, !prigimZ_status); // выход в статус
}
else {
prigimZ_status = 0;
digitalWrite(pin_zakr, !prigimZ_status); // выход в статус
}
break;
}
case 135: if ( dvig_on == 0) {
// TIMSK2 |= (1 << OCIE2A);
dvig_on = 1;
}
else {
// TIMSK2 &= ~(1 << OCIE2A);
dvig_on = 0;
digitalWrite(pin_shim, 0);
}
break;
case 136: if (strong_zakr > strong_min) {
if (btn_speed) strong_zakr = strong_zakr - 5;
else strong_zakr--;
}
break;
case 137: {
// TIMSK1 = 0; // запрещаем все прерывания от таймера Т1
// TCCR1B = 0; // останавливаем счетчик
// TCNT1 = 0; // обнуляем значение
if ( prigimO_status == 0) {
prigimO_status = 1;
digitalWrite(pin_ots, !prigimO_status); // выход в статус
// digitalWrite(pin_bok2, !prigimG_status);
}
else {
prigimO_status = 0;
digitalWrite(pin_ots, !prigimO_status); // выход в статус
// digitalWrite(pin_bok2, !prigimG_status);
}
break;
}
case 221: if (time_bok > min_Boktime) {
if (btn_speed) time_bok = time_bok - 10;
else time_bok--;
}
break;
case 222: if (delay_bok > min_Bokdelay) {
if (btn_speed) delay_bok = delay_bok - 10;
else delay_bok--;
}
break;
case 225: if (delay_vert > min_Vertdelay) {
if (btn_speed) delay_vert = delay_vert - 10;
else delay_vert--;
}
break;
case 230: if (delay_spin> min_Spindelay) {
if (btn_speed) delay_spin= delay_spin- 10;
else delay_spin--;
}
break;
case 231: if (time_vert> min_Verttime) {
if (btn_speed) time_vert= time_vert- 10;
else time_vert--;
}
break;
case 235: if (length_product> min_length) {
if (btn_speed) length_product= length_product- 10;
else length_product--;
}
break;
case 241: if (strong_zakr > strong_min) {
if (btn_speed) strong_zakr = strong_zakr - 5;
else strong_zakr--;
// OCR2A = map(strong_zakr, strong_min, strong_max, osr_max, osr_min);
}
break;
default: break;
}
//flag = 0;
//is_redakt = false;
if (flag == 0) print_clr();
}
if (btn_enter.click())// открываем пункт
{
if (ukasatel == 0 && is_redakt) {
lcd.setCursor(15, 0);
lcd.print("<");
flag = true;
}
if (ukasatel == 1 && is_redakt) {
lcd.setCursor(15, 1);
lcd.print("<");
flag = true;
}
// if ((is_redakt== true)&&(flag == 0)) {flag =false;
//
// is_redakt = false;
// lcd.setCursor(15, 0);
// lcd.print(" ");
// }
// if ((flag ==true)&&(ukasatel == 1)) {flag =false;
// lcd.setCursor(15, 1);
// lcd.print(" ");
// }
// flag =false;
}// открываем пункт
switch (pointer) { // По номеру указателей располагаем вложенные функции (можно вложенные меню)
case 0: {
lcd.setCursor(0, 0);
lcd.print(F(">")); // Вывод указателя
lcd.print(F("Статус ->")) ;
lcd.setCursor(1, 1);
lcd.print(F("Настройки "));
break;
}
case 1: {
lcd.setCursor(0, 0);
lcd.print(F(" Статус ")); // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(">"));
lcd.print(F("Настройки ->"));
break;
}
case 2: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Диагностика ->")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(" Сохранить "));
break;
}
case 3: {
lcd.setCursor(0, 0);
lcd.print(F(" Диагностика ")); // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(">"));
lcd.print(F("Сохранить ->"));
break;
}
case 10: {
lcd.setCursor(0, 0);
//lcd.print(F(">"));
lcd.print(F("Датчик:")) ; // Вывод всех пунктов
print_bool(datchik_status);
lcd.print(F(" "));
lcd.setCursor(0, 1);
lcd.print(F("Гориз фикс:"));
print_bool(prigimG_status);
lcd.print(F(" "));
break;
}
case 11: {
lcd.setCursor(0, 0);
// lcd.print(F(">"));
lcd.print(F("Верт фикс:")) ; // Вывод всех пунктов
print_bool(prigimV_status);
lcd.print(F(" "));
lcd.setCursor(0, 1);
lcd.print(F("Ролики:"));
print_bool(prigimZ_status);
lcd.print(F(" "));
break;
}
case 12: {
lcd.setCursor(0, 0);
// lcd.print(F(">"));
lcd.print(F("Отсекатель:")) ;
print_bool(prigimO_status);
lcd.print(F(" "));
lcd.setCursor(0, 1);
lcd.print(F("T_d:"));
uint16_t summ = 0;
for (int i = 0; i < 5; i++)
{
summ = summ + mass[i];
}
lcd.print(summ / 5, DEC);
lcd.print(F(" OCR:"));
lcd.print(uint8_t(OCR2A), DEC);
break;
}
case 21: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Продукт ->")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(" Фикс продукта "));
is_redakt = false;
break;
}
case 22: {
lcd.setCursor(0, 0);
lcd.print(F(" Продукт ")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(">"));
lcd.print(F("Фикс продукта->"));
is_redakt = false;
break;
}
case 23: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Отпус-ие пр-та>")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(" Ролики "));
//lcd.print((uint8_t)strong_zakr);
lcd.print(F(" "));
is_redakt = false;
break;
}
case 24: {
lcd.setCursor(0, 0);
lcd.print(F(" Отпус-ие пр-та ")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(">"));
lcd.print(F("Ролики ->"));
//lcd.print((uint8_t)strong_zakr);
lcd.print(F(" "));
is_redakt = false;
break;
}
case 25: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Отсекатель ->")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(" Мотор "));
//lcd.print((uint8_t)strong_zakr);
lcd.print(F(" "));
is_redakt = false;
break;
}
case 26: {
lcd.setCursor(0, 0);
lcd.print(F(" Отсекатель ")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(">"));
lcd.print(F("Мотор ->"));
//lcd.print((uint8_t)strong_zakr);
lcd.print(F(" "));
is_redakt = false;
break;
}
case 32: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Гориз фикс-р ->")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(" Вертик фикс-р ")) ;
// TIMSK1 = (1 << OCIE1A) | (1 << OCIE1B) | (1 << TOIE1);
break;
}
case 33: {
lcd.setCursor(0, 0);
lcd.print(F(" Гориз фикс-р ")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(">"));
lcd.print(F("Вертик фикс-р->")) ;
//TIMSK1 = (1 << OCIE1A) | (1 << OCIE1B) | (1 << TOIE1);
break;
}
case 34: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Ролики ->")) ; // Вывод всех пунктов
// print_bool(dvig_on);
lcd.setCursor(0, 1);
lcd.print(F(" Мотор")) ;
//lcd.print(strong_zakr);
lcd.print(F(" "));
// is_redakt = true;
break;
}
case 35: {
lcd.setCursor(0, 0);
lcd.print(F(" Ролики ")) ; // Вывод всех пунктов
//print_bool(dvig_on);
lcd.setCursor(0, 1);
lcd.print(F(">"));
lcd.print(F("Мотор ->")) ;
// lcd.print(strong_zakr);
lcd.print(F(" "));
// is_redakt = true;
break;
}
case 36: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Отсекатель ->")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(" ")) ;
break;
}
case 43: {
lcd.setCursor(0, 0);
lcd.print(F(" Вы уверены:")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(">"));
print_bool(save_redakt);
is_redakt = true;
break;
}
case 44: {
lcd.setCursor(0, 0);
lcd.print(F(" Вы уверены:")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(">Успешно"));
is_redakt = false;
break;
}
case 121: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Номер:")) ; // Вывод всех пунктов
if (set_pedal == 0) lcd.print(F("1 ")) ; else lcd.print(F("2 ")) ;
lcd.setCursor(0, 1);
lcd.print(F(" Название:")) ;
if (akt_level == 0) lcd.print(F("Мицелярка")) ; else lcd.print(F("Крем ")) ;
is_redakt = true;
break;
}
case 122: {
lcd.setCursor(0, 0);
lcd.print(F(" Номер:")) ; // Вывод всех пунктов
if (set_pedal == 0) lcd.print(F("1 ")) ; else lcd.print(F("2")) ;
lcd.setCursor(0, 1);
lcd.print(F(">Название:")) ;
if (akt_level == 0) lcd.print(F("Мицелярка")) ; else lcd.print(F("Крем ")) ;
is_redakt = true;
break;
}
case 123: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Детект:")) ; // Вывод всех пунктов
lcd.print(delay_block,DEC);
lcd.print(F(" ")) ;
lcd.setCursor(0, 1);
lcd.print(F(" "));
is_redakt = true;
break;
}
case 132: {
lcd.setCursor(1, 0);
lcd.print(F("Горизонт фиксатор ")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(">"));
print_bool(prigimG_status);
is_redakt = true;
break;
}
case 133: {
lcd.setCursor(1, 0);
lcd.print(F("Верт фиксатор ")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(">"));
print_bool(prigimV_status);
is_redakt = true;
break;
}
case 134: {
lcd.setCursor(1, 0);
lcd.print(F("Ролики ")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(">"));
print_bool(prigimZ_status);
is_redakt = true;
break;
}
case 135: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Двигатель:")) ; // Вывод всех пунктов
print_bool(dvig_on);
lcd.setCursor(0, 1);
// lcd.print(F(" "));
lcd.print(F(" Усилие:")) ;
lcd.print(strong_zakr,DEC);
lcd.print(F(" "));
is_redakt = true;
break;
}
case 136: {
lcd.setCursor(0, 0);
//lcd.print(F(">"));
lcd.print(F(" Двигатель:")) ; // Вывод всех пунктов
print_bool(dvig_on);
lcd.setCursor(0, 1);
// lcd.print(F(" "));
lcd.print(F(">"));
lcd.print(F("Усилие:")) ;
lcd.print(strong_zakr,DEC);
lcd.print(F(" "));
is_redakt = true;
break;
}
case 137: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Отсекатель:")) ; // Вывод всех пунктов
print_bool(prigimO_status);
lcd.setCursor(0, 1);
// lcd.print(F(" "));
// lcd.print(F(">"));
lcd.print(F(" ")) ;
is_redakt = true;
break;
}
case 221: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Горизон:")) ; // Вывод всех пунктов
lcd.print(time_bok,DEC);
lcd.print(F(" "));
lcd.setCursor(0, 1);
lcd.print(F(" Вертикал:"));
lcd.print(delay_bok,DEC);
lcd.print(F(" "));
is_redakt = true;
break;
}
case 222: {
lcd.setCursor(0, 0);
lcd.print(F(" Горизон:")) ; // Вывод всех пунктов
lcd.print(time_bok,DEC);
lcd.print(F(" "));
lcd.setCursor(0, 1);
lcd.print(F(">"));
lcd.print(F("Вертикал:"));
lcd.print(delay_bok,DEC);
lcd.print(F(" "));
is_redakt = true;
break;
}
case 225: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Задержка:"));
lcd.print(delay_vert,DEC);
lcd.print(F(" "));
is_redakt = true;
break;
}
case 230: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Задержка:")) ; // Вывод всех пунктов
lcd.print(delay_spin,DEC);
lcd.print(F(" "));
// lcd.print(pointer);
lcd.setCursor(0, 1);
lcd.print(F(" Время:"));
lcd.print(time_vert,DEC);
lcd.print(F(" "));
is_redakt = true;
break;
}
case 231: {
lcd.setCursor(0, 0);
lcd.print(F(" Задержка:")) ; // Вывод всех пунктов
lcd.print(delay_spin,DEC);
lcd.print(F(" "));
// lcd.print(pointer);
lcd.setCursor(0, 1);
lcd.print(F(">"));
lcd.print(F("Время:"));
lcd.print(time_vert,DEC);
lcd.print(F(" "));
is_redakt = true;
break;
}
case 235: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Длина:")) ; // Вывод всех пунктов
lcd.print(length_product,DEC);
lcd.print(F(" ")) ;
lcd.setCursor(0, 1);
lcd.print(F(" ")) ;
is_redakt = true;
break;
}
case 241: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Усилие:")) ; // Вывод всех пунктов
lcd.print(strong_zakr,DEC);
lcd.print(F(" "));
is_redakt = true;
break;
}
default: break;
}
if ((save_redakt == 1)&&(flag == 0)&&(pointer==43)) //сохранение изменений настроек
{ pointer++;
EEPROM.put(0, time_bok); // пишем в память
EEPROM.put(2, delay_bok);
EEPROM.put(3, time_vert);
EEPROM.put(5,delay_spin);
EEPROM.put(6, delay_vert);
EEPROM.put(7, strong_zakr);
EEPROM.put(8, delay_block);
EEPROM.put(10, first_start);
EEPROM.put(11, akt_level);
EEPROM.put(12, length_product);
save_redakt = 0;
}
}
void print_clr(void) {
lcd.setCursor(0, 0);
lcd.print(" ") ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(" ");
}
void print_int(uint16_t value) {
char str;
ultoa(value, str, DEC);
lcd.print(str);
}
void print_long(uint32_t pause) {
// показываем настройки
uint16_t p = pause & 0xFFFF;
char str;
ultoa(p, str, DEC);
lcd.print(str);
}
void print_bool(bool i) {
if (i) lcd.print(F("on ")); else lcd.print(F("off"));
}