/*
Controlling a servo position using a potentiometer (variable resistor)
by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>
modified on 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Knob
*/
/*
Структура ЕП
0 - Текущая передача.
1 - Левое
2 - правое
...
19,20 - Левое (Заскок на Предыдущую - 1), правое (Соскок на следующую+1)
21 - Левая мёртвая точка
22 - Правая мёртвая точка
Режимы (Res)
0 - Обычный режим(переключение скоростей)
1 - Режим настройки крайней точки "H"
2 - Режим настройки крайней точки "L"
3 - Режим настройки скоростей по очереди "P"
*/
#include <Servo.h>
#include <EEPROM.h>
#include <Tachometer.h>
#define TACH_PIN 2
#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
#define bit(b) (1UL << (b))
byte Res=10;
byte Speed=0;
Tachometer tacho;
Servo myservo; // create servo object to control a servo
bool Movement=true;
byte GearData[24];
byte num_array[23] = {
B10011111, // 1.
B00100101, // 2.
B00001101, // 3.
B10011001, // 4.
B01001001, // 5.
B01000001, // 6.
B00011111, // 7.
B00000001, // 8.
B00001001, // 9.
B00000011, // 0.
B00010001, // A. 10
B11000001, // b. 11
B01100011, // C. 12
B10000101, // d. 13
B01100001, // E. 14
B01110001, // F. 15
B01000011, // G. 16
B10010001, // H. 17
B00110001, // P. 18
B10000011, // U. 19
B11100011, // L. 20
B11111111, // All Off 21
B00000000 // All On 22
}; //
byte pin_array[8]= { 4, // A распиновка экрана
5, // B распиновка экрана
6, // C распиновка экрана
7, // D распиновка экрана
9, // E распиновка экрана
12, // F распиновка экрана
13, // G распиновка экрана
8}; // DP распиновка экрана
// объявление функции
//byte counter = 0;
void Num_Write(byte number,bool DP);
void SpeedUp();
void SpeedDown();
void SetSpeed(); // доводит шифтер до актуальной передачи
void SpeedSetup(byte Sp);
void MinMaxSetup();
void AllSetup();
void isr();
bool flag = false;
void setup() {
Serial.begin(9600);
pinMode(TACH_PIN, INPUT_PULLUP);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(A0, INPUT);//P
pinMode(A1, INPUT);//P
pinMode(A2, INPUT);//P
pinMode(A3, INPUT);//P
// настраиваем прерывание
attachInterrupt(0, isr, FALLING);
//tacho.setWindow(20); // установка количества тиков для счёта времени (по умолч 10)
tacho.setTimeout(2000); // таймаут прерываний (мс), после которого считается что вращение прекратилось
//for (int i=0; i<24; i++) GearData[i]=EEPROM[i];// Чтение настроек из энергонезависимой памяти
GearData[0]=5;
for (int i=1; i<=10; i++) {
GearData[i*2]=20+i*15+5;
GearData[i*2-1]=20+i*15;
}
GearData[21]=35;
GearData[22]=175;
myservo.attach(3); // attaches the servo on pin 9 to the servo object
myservo.write(179);
SetSpeed();
Num_Write(GearData[0]-1,Movement);
}
////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
bool btnState2 = digitalRead(A3);
bool btnState = digitalRead(A0);
//SpeedSet(byte Sp);
if (btnState) { // обработчик нажатия A0(выбор режима)
btnState2=false;
Serial.println(btnState2);
while(!btnState2){
if(Res<=20&& btnState) Res++; else if(btnState) Res=10;
Num_Write(Res,!Movement);
btnState = digitalRead(A0);
btnState2 = digitalRead(A3);
delay(100);
}
Serial.println(btnState2);
}
//Serial.println("!");
btnState = digitalRead(A1);
if (btnState ) { // обработчик нажатия
Serial.println("D");
SpeedDown();
}
btnState = digitalRead(A2);
if (btnState) { // обработчик нажатия
SpeedUp();
}
// btnState = digitalRead(A3); // обработчик нажатия "👌"
}
////////////////////////////////////////////////////////////////////////////////////////////////
void Num_Write(byte number,bool DP)
// эта функция записывает значения в выводы, подключенные к индикатору. DP-значение точки.
{
for (int j=0; j <7; j++)
{
digitalWrite(pin_array[j], bitRead(num_array[number],7-j));
}
digitalWrite(pin_array[7],DP);
}
void waiting(){
int i=0;
while (!Movement){
Num_Write(9,true);
digitalWrite(pin_array[i],1);
if (i<5) i++; else i=0;
delay(200);
}
}
void SpeedDown()
{
if (Speed == 0){
if(GearData[0]<10) GearData[0]++;
waiting();
myservo.write(GearData[GearData[0]*2]); //Переводим шифтер в крайнее правое положение
delay(1000); //Ждём пол секунды на переход цепи
myservo.write(GearData[GearData[0]*2-1]+int((GearData[GearData[0]*2-1]-GearData[GearData[0]*2])/2));
//Ставим шифтер в середину звезды
Num_Write(GearData[0]-1,Movement);
}
}
void SpeedUp(){
if (Speed == 0){
if(GearData[0]>1) GearData[0]--;
waiting();
myservo.write(GearData[GearData[0]*2-1]); //Переводим шифтер в крайнее правое положение
delay(1000); //Ждём пол секунды на переход цепи
myservo.write(GearData[GearData[0]*2-1]-int((GearData[GearData[0]*2-1]-GearData[GearData[0]*2])/2));
//Ставим шифтер в середину звезды
Num_Write(GearData[0]-1,Movement);
}
}
void SetSpeed(){
byte pos=myservo.read();
if (pos<GearData[21]){myservo.write(GearData[21]); pos=GearData[21];}
if (pos>GearData[22]){myservo.write(GearData[22]); pos=GearData[22];}
for (int i=1;i<11;i++){
if(pos>=GearData[i*2-1]&&pos<=GearData[i*2]){
if(GearData[0]==i) myservo.write(GearData[GearData[0]*2-1]+int((GearData[GearData[0]*2-1]-GearData[GearData[0]*2])/2));
if(GearData[0]>i){
for(int a=i;a<=GearData[0];a++) {
Serial.println(a);
waiting();
myservo.write(GearData[a*2]); //Переводим шифтер в крайнее правое положение
delay(500); //Ждём пол секунды на переход цепи
myservo.write(GearData[a*2-1]+int((GearData[a*2-1]-GearData[a*2])/2));
delay(500); //Ждём пол секунды на переход цепи
//Ставим шифтер в середину звезды
Num_Write(a-1,Movement);
}
}
else{
for(int a=i;a>=GearData[0];a--) {
waiting();
myservo.write(GearData[a*2-1]); //Переводим шифтер в крайнее правое положение
delay(500); //Ждём пол секунды на переход цепи
myservo.write(GearData[a*2-1]-int((GearData[a*2-1]-GearData[a*2])/2));
delay(500);
//Ставим шифтер в середину звезды
Num_Write(a-1,Movement);
}
}
}
}
}
// обработчик прерывания
void isr() {
tacho.tick(); // дёргаем тик
}
/*
void SpeedSet(byte Sp);
void SetMinMax();
void SetupAll();
*/