///////////// СТАНОК ДЛЯ РИСОВАНИЯ ВРЕМЕНИ ПО КНОПКЕ СБРОСА //////////////////////////////
/////////////////////////// ARDUINO UNO //////////////////////////////////////////////////
#include <Servo.h>
#include <iarduino_RTC.h>
iarduino_RTC time(RTC_DS3231);
#define motor_Y_f1 8
#define motor_Y_f2 9
#define motor_Y_f3 10
#define motor_Y_f4 11
#define motor_X_f1 4
#define motor_X_f2 5
#define motor_X_f3 6
#define motor_X_f4 7
byte a0=140;byte a=a0;// угол исходного положения пера - поднято
int n=10;//переменная единицы временного интервала
int i=0;// счётчик
int i1=0;// счётчик
float X=0;float Y=0;//переменные учёта положения пера относительно начала координат
String inputString;// строка данных
byte tablY[16]={0,1,1,1,
1,1,0,1,
1,0,1,1,
1,1,1,0};// ТАКТЫ ВКЛЮЧЕНИЯ - полношаговый режим в одну обмотку питанием (биполярный)
byte tablX[16]={1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1};// ТАКТЫ ВКЛЮЧЕНИЯ - полношаговый режим в одну обмотку питанием (униполярный)
int K;
String cmd = "";
Servo servo1;
void setup() {
time.begin();
//time.settime(0,43,14,15,8,18,3); // 0 сек, 43 мин, 14 час, 15, АВГУСТА, 2018 года, СРЕДА
Serial.begin(9600);
servo1.attach(12);
servo1.write(a0);delay(10*n);servo1.write(a0-5);//начальный подъём пера
pinMode(motor_Y_f1, OUTPUT); // определение вывода как ВЫХОД
pinMode(motor_Y_f2, OUTPUT);
pinMode(motor_Y_f3, OUTPUT);
pinMode(motor_Y_f4, OUTPUT);
digitalWrite(motor_Y_f1, HIGH); digitalWrite(motor_Y_f2, HIGH); digitalWrite(motor_Y_f3, HIGH); digitalWrite(motor_Y_f4, HIGH);// исходное состояние - обмотки обесточены
pinMode(motor_X_f1, OUTPUT); // определение вывода как ВЫХОД
pinMode(motor_X_f2, OUTPUT);
pinMode(motor_X_f3, OUTPUT);
pinMode(motor_X_f4, OUTPUT);
digitalWrite(motor_X_f1, LOW); digitalWrite(motor_X_f2, LOW); digitalWrite(motor_X_f3, LOW); digitalWrite(motor_X_f4, LOW);// исходное состояние - обмотки обесточены
}
void loop()
{
Vektor(5,150);// постановка пера на положение первой цифры
cmd=time.gettime("H"); K =cmd.substring(0,1).toInt();Cifra (K);K =cmd.substring(1).toInt();Cifra (K);//рисуем количество часов
Dvoetoschie();//рисуем двоеточие
cmd=time.gettime("i"); K =cmd.substring(0,1).toInt();Cifra (K);K =cmd.substring(1).toInt();Cifra (K);//рисуем количество минут
VozvratPera ();
me:goto me;
}
////////////////////////////////////////////////////////
//////////////функция рисования двоеточия
///////////////////////////////////////////////////////
void Dvoetoschie ()
{
byte R=14;//единица размера сегмента в мм
Vektor(R/2,90);up_down_pen(true); Vektor(R/2,90);up_down_pen(false); Vektor(R/2,90);up_down_pen(true);Vektor(R/2,90);
up_down_pen(false);Vektor(2*R,270); Vektor(4,180);
}
/////////////////////////////////////////////////////////
///////// функция рисования цифры заданной /////////////
////////////////////////////////////////////////////////
void Cifra (int kk)
{
byte R=14;//единица размера сегмента в мм
up_down_pen(true);
switch (kk)
{
case 0:
Vektor(2*R,90);Vektor(R,180);Vektor(2*R,270);Vektor(R,0);
break;
case 1:
up_down_pen(false); Vektor(R,90); up_down_pen(true);Vektor(R*1.4,135);Vektor(2*R,270);up_down_pen(false); Vektor(R,0);
break;
case 2:
up_down_pen(false); Vektor(2*R,90);up_down_pen(true);Vektor(R,180);Vektor(R,270);Vektor(R*1.4,315);Vektor(R,180);up_down_pen(false);Vektor(R,0);
break;
case 3:
Vektor(R*1.4,135);Vektor(R,0);Vektor(R*1.4,135);Vektor(R,0);up_down_pen(false);Vektor(2*R,270);
break;
case 4:
up_down_pen(false); Vektor(2*R,90);up_down_pen(true);Vektor(R,270);Vektor(R,180);Vektor(R,90);up_down_pen(false);Vektor(R,270);
up_down_pen(true);Vektor(R,270);up_down_pen(false);Vektor(R,0);
break;
case 5:
Vektor(R,180);Vektor(R,90);Vektor(R,0);Vektor(R,90);Vektor(R,180); up_down_pen(false);Vektor(R*1.4,315);Vektor(R,270);
break;
case 6:
up_down_pen(false);Vektor(R,90);Vektor(R*1.4,135);up_down_pen(true);Vektor(R*1.4,315);Vektor(R,270);Vektor(R,180);Vektor(R,90);Vektor(R-1,0);up_down_pen(false);
Vektor(R,270);
break;
case 7:
up_down_pen(false);Vektor(2*R,90);up_down_pen(true); Vektor(R,180); Vektor(R*1.4,315);Vektor(R,270);
break;
case 8:
Vektor(2*R,90);Vektor(R,180);Vektor(2*R,270);Vektor(R+1,0);up_down_pen(false); Vektor(R,90); up_down_pen(true);Vektor(R+1,180);up_down_pen(false);Vektor(R*1.4,315);
break;
case 9:
Vektor(R*1.4,135);Vektor(R,90);Vektor(R,0);Vektor(R,270);Vektor(R,180);up_down_pen(false);Vektor(R*1.4,315);
break;
}
up_down_pen(false); Vektor(R+3,180);// подъём-перемещение пера на следующую цифру
}
/////////////////////////////////////////////////////////////
////// функция рисования отрезка длиной d под углом a
////////////////////////////////////////////////////////////
void Vektor(float d,int a)
{
float x=d*cos(PI*a/180); float y=d*sin(PI*a/180);
Otrezok(x,y);
}
////////////////////////////////////////////////////////////////
////функция рисования отрезка по конечным координатам x и y
////////////////////////////////////////////////////////////////
void Otrezok(float x, float y)
{
int nx;
int ny=10;//принимаем как постоянную для задания скорости
if (x!=0&&y!=0){nx=ny*2.35*abs(y)/abs(x);if (nx<3){nx=5;}}else {nx=50;}// вычисляем вторую постоянную для отрезка с учётом крайних недопустимых значений - 0 и бесконечность
long tx=millis();long ty=millis();
Y=Y+y;//текущий учёт положения пера относительно начала отсчёта
y=4.7*y;//переводной множитель из миллиметров в число шагов двигателя
X=X+x;//текущий учёт положения пера относительно начала отсчёта
x=2*x;//переводной множитель из миллиметров в число шагов двигателя
int j1=0;int k1;if (y>=0){k1=1;}else {k1=-1;}
int j2=0;int k2;if (x>=0){k2=1;}else {k2=-1;}
while ((j1<=(int)abs(y)-1)||(j2<=(int)abs(x)-1))
{
if(j1!=(int)abs(y)&&(millis()-ty>ny))//условие совершения шага
{ty=millis();
if(i<0){i=12;}if(i>12){i=0;}////условия зацикливания тактов по кругу
digitalWrite(motor_Y_f1, tablY[i]);digitalWrite(motor_Y_f2, tablY[i+1]);digitalWrite(motor_Y_f3, tablY[i+2]);digitalWrite(motor_Y_f4, tablY[i+3]);
i=i+4*k1;j1=j1+1;//условия перехода на следующий такт
}
if(j2!=(int)abs(x)&&(millis()-tx>nx))//условие совершения шага
{tx=millis();
if(i1<0){i1=12;}if(i1>12){i1=0;}//условия зацикливания тактов по кругу
digitalWrite(motor_X_f1, tablX[i1]);digitalWrite(motor_X_f2, tablX[i1+1]);digitalWrite(motor_X_f3, tablX[i1+2]);digitalWrite(motor_X_f4, tablX[i1+3]);
i1=i1+4*k2;j2=j2+1;//условия перехода на следующий такт
}
}
digitalWrite(motor_Y_f1, HIGH); digitalWrite(motor_Y_f2, HIGH); digitalWrite(motor_Y_f3, HIGH); digitalWrite(motor_Y_f4, HIGH);// исходное состояние - обмотки обесточены
digitalWrite(motor_X_f1, LOW); digitalWrite(motor_X_f2, LOW); digitalWrite(motor_X_f3, LOW); digitalWrite(motor_X_f4, LOW);// исходное состояние - обмотки обесточены
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////функция возврата пера в исходное положение на начало отсчёта
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void VozvratPera ()
{
up_down_pen(false);
Otrezok (-X,-Y);
X=0;Y=0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////функция поднимания-опускания пера (значения аргумента false и true соответственно)/////
void up_down_pen(boolean k)
{
while (a>87&&k==1)
{servo1.write(a);a=a-1;delay(n);}if(k== true ){a=87;}
while (a<a0&&k==0)
{servo1.write(a);a=a+1;delay(n);}if (k==false){a=a0;delay(10*n);servo1.write(a0-5);}
}
/////////////////////////////////////////////////////////////////////////////////////////////////