#include "U8glib.h"
#include "4x6.h"
//#include "U8g2lib.h"
//U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0 | U8G_I2C_OPT_NO_ACK | U8G_I2C_OPT_FAST); // Fast I2C / TWI
int angle = 0; // угол
int direction[60]; // массив для угла
int gX[60]; // массив для секунд
unsigned long timer;
int current_sec = 0;
char Sbuffer[10] = ""; // буфер для строк
void draw(void) {
u8g.setColorIndex(1);
int r = 21;
int x = 4, y = 6;
// x = 28, y = 31 ------ центр | вместо: 28 = x + 24; 31 = y + 25
// u8g.drawCircle (28, 31, r + 4);
// u8g.drawCircle (28, 31, r);
u8g.drawDisc (x + 24, y + 25, 25);
u8g.setColorIndex(0);
u8g.drawDisc (x + 24, y + 25, 21);
u8g.setColorIndex(0);
u8g.drawDisc (x + 24 - 21 - 2, y + 25, 5);
u8g.drawDisc (x + 24, y + 25 - 21 - 2, 5);
u8g.drawDisc (x + 24 + 21 + 2, y + 25, 5);
u8g.drawDisc (x + 24, y + 25 + 21 + 2, 5);
u8g.setColorIndex(1);
u8g.setFont(rus4x6);
u8g.drawStr(x + 24 - 1, y + 25 - 21 + 2, "С");
u8g.drawStr(x + 24 + 21 + 1, y + 25 + 3, "В");
u8g.drawStr(x + 24 - 1, y + 25 + 21 + 4, "Ю");
u8g.drawStr(x + 24 - 21 - 2, y + 25 + 3, "З");
int compAngle = angle + 180;
///////////////////////////// Стрелка /////////////////////////////////////////////////
int x_0 = round(-sin(radians(compAngle)) * (21 - 3));
int y_0 = round(cos(radians(compAngle)) * (21 - 3));
int x_1 = round(-sin(radians(compAngle - 160)) * (21 - 3));
int y_1 = round(cos(radians(compAngle - 160)) * (21 - 3));
int x_2 = round(-sin(radians(compAngle + 160)) * (21 - 3));
int y_2 = round(cos(radians(compAngle + 160)) * (21 - 3));
int x_3 = round(-sin(radians(compAngle + 180)) * (21 - 10));
int y_3 = round(cos(radians(compAngle + 180)) * (21 - 10));
x_0 = x + 24 + x_0;
y_0 = y + 25 + y_0;
x_1 = x + 24 + x_1;
y_1 = y + 25 + y_1;
x_2 = x + 24 + x_2;
y_2 = y + 25 + y_2;
x_3 = x + 24 + x_3;
y_3 = y + 25 + y_3;
u8g.drawLine(x_0, y_0, x_1, y_1); // Стрелка
u8g.drawLine(x_0, y_0, x_2, y_2);
u8g.drawLine(x_3, y_3, x_1, y_1);
u8g.drawLine(x_3, y_3, x_2, y_2);
u8g.drawLine(x_3, y_3, x_0, y_0);
// цифры угла
// u8g.setFont(u8g_font_micro);
u8g.setFont(u8g_font_4x6);
int Swidth = u8g.getStrWidth(Sbuffer);
u8g.setColorIndex(0);
u8g.drawRBox(x + 25 - Swidth / 2 - 2, y + 25 + 3 - 7, Swidth + 3, 9, 1);
u8g.setColorIndex(1);
u8g.drawRFrame(x + 25 - Swidth / 2 - 2, y + 25 + 3 - 7, Swidth + 3, 9, 1);
u8g.drawStr(x + 25 - Swidth / 2, y + 25 + 3, Sbuffer);
// u8g.drawFrame(4,6,50,50);
//////////////////////////// График //////////////////////////////////////////////
drawGraph(58, 11);
}
void rotate_array(void) {
int e = gX [0];
for (int i = 0; i <= 58; i++) {
gX[i] = gX[i + 1];
}
gX[59] = e;
}
void setup(void) {
u8g.begin();
timer = millis();
Serial.begin(9600);
for (int i = 0; i < 60; i++) gX[i] = i;
}
void loop(void) {
int sensorValue = analogRead(A2);
angle = map(sensorValue, 0, 1023, 0, 359); // remap значение потенциометра из 0-670 в 45-315° для эмуляции энкодера
if (millis() - timer >= 1000) {
timer = millis(); // "сбросить" таймер
current_sec++;
if (current_sec > 59) current_sec = 0;
for (int i = 0; i <= 58; i++) {
direction[i] = direction[i + 1];
}
rotate_array();
direction[59] = map(angle, 0, 359, 0, 40);
// Serial.println(String(current_sec) + " " + String(direction[59]) + " " + String(sensorValue) + " " + String(angle));
}
// memset(&Sbuffer[0], 0, sizeof(Sbuffer)); // очистка буфера
snprintf(Sbuffer, sizeof(Sbuffer), "%d\xB0", round(angle));
u8g.firstPage();
do {
draw();
} while (u8g.nextPage());
}
void drawGraph(int x, int y) {
// x = 49 y = 11
u8g.setFont(rus4x6);
u8g.drawStr(x, y + 3, "С");
u8g.drawStr(x, y + 13, "В");
u8g.drawStr(x, y + 23, "Ю");
u8g.drawStr(x, y + 33, "З");
u8g.drawStr(x, y + 43, "С");
u8g.drawVLine (x + 8, y, 40);
u8g.drawVLine (x + 69, 11, 41);
u8g.drawHLine (x + 6, y, 2);
u8g.drawHLine (x + 6, y + 10, 2);
u8g.drawHLine (x + 6, y + 20, 2);
u8g.drawHLine (x + 6, y + 30, 2);
u8g.drawHLine (x + 6, y + 40, 2);
for (int i = 0; i <= 59; i ++ ) {
if (gX[i] % 5 == 0) {
u8g.drawPixel (x + 3 + 6 + i, y);
u8g.drawPixel (x + 3 + 6 + i, y + 10);
u8g.drawPixel (x + 3 + 6 + i, y + 20);
u8g.drawPixel (x + 3 + 6 + i, y + 30);
u8g.drawPixel (x + 3 + 6 + i, y + 40);
}
if (gX[i] % 10 == 0) {
for (int j = 0; j < 40; j += 5) u8g.drawPixel(x + 3 + 6 + i, y + j);
}
}
for (int i = 0; i <= 58; i++) {
u8g.drawLine(x + 3 + 6 + i, y + direction[i], x + 6 + 4 + i + 1, y + direction[i + 1]);
}
}