#include <EEPROM.h>
#define INIT_ADDR 20 // номер резервной ячейки
#define INIT_KEY 50 // ключ первого запуска. 0-254, на выбор
#include <LiquidCrystal.h>
LiquidCrystal 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 2000 // максимальная задержка сработки
#define min_Boktime 20 //минимальная задержка сработки боковой фиксатор
#define max_Verttime 2000 // лимиты время закрутки
#define min_Verttime 20
#define max_Bokdelay 120 //максимальное время задержки сработки фиксатора крышки
#define min_Bokdelay 20 // минимальное время задержки сработки фиксатора крышки
#define max_Vertdelay 90 // лимиты задержки отпускания продукта
#define min_Vertdelay 20
#define max_Spindelay 90 // лимиты задержки закрутки после фиксатора крышки
#define min_Spindelay 20
#define max_length 990 // лимиты задержки длины продукта
#define min_length 110
// двигатель лимиты
#define strong_max 90
#define strong_min 20
#define osr_max 130 // пересчет на регистр OCR2
#define osr_min 30
// датчик
#define debonce_max 1000 //лимиты времени блокировки от сработки датчика
#define debonce_min 10
// лимиты обнаружения строб сигнала от сети
#define T_det_max 98
#define T_det_min 70
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 = 700; // задержка сработки бокового прижима пневмоцилиндра
volatile uint16_t time_vert = 200; // время закрутки
volatile uint8_t delay_bok =50; // задержка сработки фиксатора крышки
volatile uint8_t delay_vert = 10; // задержка отпускания продукта
volatile uint8_t delay_spin = 10;// задержка сработки закрутки после фиксатора крышки
volatile uint16_t length_product=150;// задержка длительности продукта
// двигатель закрутки
volatile bool dvig_on = 1; // переменная включения двигателя dvig_on=1 если двигатель включен
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 = 100; // блокировка следующей сработки после сработки датчика
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 = 1;
EIMSK &= ~(1 << INT0); // блокировка сработки прерывания на время delay_block
TCNT1 = 65535 - delay_block;
TCCR1B = (1 << CS12) | (1 << CS10); // старт Т1
process_status = 1;
// digitalWrite(pin_bok2, 1);// открываем тиристор
// }
}
ISR (TIMER1_OVF_vect)//блокировка повторной сработки
// уходим из зоны видимости датчика
{
//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;
}
// включаем закрутку
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 ;
}
// выключаем закрутку
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;
//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);
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
}
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 активный уровень фронт иначе спад
}
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; break;
case 33: pointer = pointer - 31; ukasatel = 0; break;
case 34: pointer = pointer - 32; ukasatel = 0; break;
case 35: pointer = pointer - 33; ukasatel = 0; break;
case 36: pointer = pointer - 34; ukasatel = 0; 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; 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);
}
break;
case 123: if (delay_block < debonce_max) 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; // обнуляем значение
//digitalWrite(pin_vert, prigimV_status); // выход в статус
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; // обнуляем значение
//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: {
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 < 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("Status ->")) ;
lcd.setCursor(1, 1);
lcd.print(F("Settings "));
break;
}
case 1: {
lcd.setCursor(0, 0);
lcd.print(F(" Status ")); // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(">"));
lcd.print(F("Settings ->"));
break;
}
case 2: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Diagnostics ->")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(" Save changes "));
break;
}
case 3: {
lcd.setCursor(0, 0);
lcd.print(F(" Diagnostics ")); // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(">"));
lcd.print(F("Save changes ->"));
break;
}
case 10: {
lcd.setCursor(0, 0);
//lcd.print(F(">"));
lcd.print(F("Sensor:")) ; // Вывод всех пунктов
print_bool(datchik_status);
lcd.print(F(" "));
lcd.setCursor(0, 1);
lcd.print(F("Bottle clamp:"));
print_bool(prigimG_status);
lcd.print(F(" "));
break;
}
case 11: {
lcd.setCursor(0, 0);
// lcd.print(F(">"));
lcd.print(F("Lid clamp:")) ; // Вывод всех пунктов
print_bool(prigimV_status);
lcd.print(F(" "));
lcd.setCursor(0, 1);
lcd.print(F("Curling:"));
print_bool(prigimZ_status);
lcd.print(F(" "));
break;
}
case 12: {
lcd.setCursor(0, 0);
// lcd.print(F(">"));
lcd.print(F("Cutter:")) ;
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);
lcd.print(F(" OCR:"));
lcd.print(uint8_t(OCR2A));
break;
}
case 21: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Sensor ->")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(" Fix product "));
is_redakt = false;
break;
}
case 22: {
lcd.setCursor(0, 0);
lcd.print(F(" Sensor ")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(">"));
lcd.print(F("Fix product ->"));
is_redakt = false;
break;
}
case 23: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Release ->")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(" Curling "));
//lcd.print((uint8_t)strong_zakr);
lcd.print(F(" "));
is_redakt = false;
break;
}
case 24: {
lcd.setCursor(0, 0);
lcd.print(F(" Release ")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(">"));
lcd.print(F("Curling ->"));
//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("Cutter ->")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(" Motor "));
//lcd.print((uint8_t)strong_zakr);
lcd.print(F(" "));
is_redakt = false;
break;
}
case 26: {
lcd.setCursor(0, 0);
lcd.print(F(" Cutter ")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(">"));
lcd.print(F("Motor ->"));
//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("Bottle clamp ->")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(" Lid clamp ")) ;
TIMSK1 = (1 << OCIE1A) | (1 << OCIE1B) | (1 << TOIE1);
break;
}
case 33: {
lcd.setCursor(0, 0);
lcd.print(F(" Bottle clamp ")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(">"));
lcd.print(F("Lid clamp ->")) ;
TIMSK1 = (1 << OCIE1A) | (1 << OCIE1B) | (1 << TOIE1);
break;
}
case 34: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Curling ->")) ; // Вывод всех пунктов
// print_bool(dvig_on);
lcd.setCursor(0, 1);
lcd.print(F(" Motor")) ;
//lcd.print(strong_zakr);
lcd.print(F(" "));
// is_redakt = true;
break;
}
case 35: {
lcd.setCursor(0, 0);
lcd.print(F(" Curling")) ; // Вывод всех пунктов
//print_bool(dvig_on);
lcd.setCursor(0, 1);
lcd.print(F(">"));
lcd.print(F("Motor ->")) ;
// lcd.print(strong_zakr);
lcd.print(F(" "));
// is_redakt = true;
break;
}
case 36: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Cutter ->")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(" ")) ;
break;
}
case 43: {
lcd.setCursor(0, 0);
lcd.print(F(" Are you sure:")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(">"));
print_bool(save_redakt);
is_redakt = true;
break;
}
case 44: {
lcd.setCursor(0, 0);
lcd.print(F(" Are you sure:")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(">Syccessfully"));
is_redakt = false;
break;
}
case 121: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Type:")) ; // Вывод всех пунктов
if (set_pedal == 0) lcd.print(F("foto ")) ; else lcd.print(F("pedal")) ;
lcd.setCursor(0, 1);
lcd.print(F(" Level:")) ;
if (akt_level == 0) lcd.print(F("rising ")) ; else lcd.print(F("falling")) ;
is_redakt = true;
break;
}
case 122: {
lcd.setCursor(0, 0);
lcd.print(F(" Type:")) ; // Вывод всех пунктов
if (set_pedal == 0) lcd.print(F("foto ")) ; else lcd.print(F("pedal")) ;
lcd.setCursor(0, 1);
lcd.print(F(">"));
lcd.print(F("Level:")) ;
if (akt_level == 0) lcd.print(F("rising ")) ; else lcd.print(F("falling")) ;
is_redakt = true;
break;
}
case 123: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Debonce:")) ; // Вывод всех пунктов
lcd.print((uint16_t)delay_block);
lcd.print(F(" ")) ;
lcd.setCursor(0, 1);
lcd.print(F(" "));
is_redakt = true;
break;
}
case 132: {
lcd.setCursor(1, 0);
lcd.print(F("Bottle clamp ")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(">"));
print_bool(prigimG_status);
is_redakt = true;
break;
}
case 133: {
lcd.setCursor(1, 0);
lcd.print(F("Lid clamp ")) ; // Вывод всех пунктов
lcd.setCursor(0, 1);
lcd.print(F(">"));
print_bool(prigimV_status);
is_redakt = true;
break;
}
case 134: {
lcd.setCursor(1, 0);
lcd.print(F("Curling clamp ")) ; // Вывод всех пунктов
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("Engine:")) ; // Вывод всех пунктов
print_bool(dvig_on);
lcd.setCursor(0, 1);
lcd.print(F(" "));
lcd.print(F(" Strong:")) ;
lcd.print(strong_zakr);
lcd.print(F(" "));
is_redakt = true;
break;
}
case 136: {
lcd.setCursor(0, 0);
//lcd.print(F(">"));
lcd.print(F(" Engine:")) ; // Вывод всех пунктов
print_bool(dvig_on);
lcd.setCursor(0, 1);
lcd.print(F(" "));
lcd.print(F(">"));
lcd.print(F("Strong:")) ;
lcd.print(strong_zakr);
lcd.print(F(" "));
is_redakt = true;
break;
}
case 137: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Cutter:")) ; // Вывод всех пунктов
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("Tri_del:")) ; // Вывод всех пунктов
lcd.print(time_bok);
lcd.print(F(" "));
lcd.setCursor(0, 1);
lcd.print(F(" Rel_del:"));
lcd.print(delay_bok);
lcd.print(F(" "));
is_redakt = true;
break;
}
case 222: {
lcd.setCursor(0, 0);
lcd.print(F(" Tri_del:")) ; // Вывод всех пунктов
lcd.print(time_bok);
lcd.print(F(" "));
lcd.setCursor(0, 1);
lcd.print(F(">"));
lcd.print(F("Rel_del:"));
lcd.print(delay_bok);
lcd.print(F(" "));
is_redakt = true;
break;
}
case 225: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Lid del:"));
lcd.print(delay_vert);
lcd.print(F(" "));
is_redakt = true;
break;
}
case 230: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Spi del:")) ; // Вывод всех пунктов
lcd.print(delay_spin);
lcd.print(F(" "));
// lcd.print(pointer);
lcd.setCursor(0, 1);
lcd.print(F(" Spi tim:"));
lcd.print(time_vert);
lcd.print(F(" "));
is_redakt = true;
break;
}
case 231: {
lcd.setCursor(0, 0);
lcd.print(F(" Spi del:")) ; // Вывод всех пунктов
lcd.print(delay_spin);
lcd.print(F(" "));
// lcd.print(pointer);
lcd.setCursor(0, 1);
lcd.print(F(">"));
lcd.print(F("Spi tim:"));
lcd.print(time_vert);
lcd.print(F(" "));
is_redakt = true;
break;
}
case 235: {
lcd.setCursor(0, 0);
lcd.print(F(">"));
lcd.print(F("Length:")) ; // Вывод всех пунктов
lcd.print(length_product);
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("Strong:")) ; // Вывод всех пунктов
lcd.print(strong_zakr);
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"));
}