Рефакторинг кода - код рабочий
- Войдите на сайт для отправки комментариев
Пнд, 11/07/2022 - 23:40
Всем привет. Есть код - рабочий, но повторяющиеся конструкции прям бесят. В с++ знаний не хватает написать лучше. Может сможете помочь немного его укоротить. СПАСИБО
#include "Wire.h" #define DS1307_I2C_ADDRESS 0x68 #include "OasisLED.h" #include <Arduino.h> #include <IRremote.h> #include <RCSwitch.h> #define KEY_1 0x0800 #define KEY_2 0x0100 #define KEY_3 0x0008 #define KEY_4 0x0001 static uint16_t keys = 0; uint16_t newKeys; // 2 байта unsigned long last_time500; unsigned long last_time1000; int RECV_PIN = 11; uint8_t DOUT = 5; //button uint8_t dataPin = 4;//DIN uint8_t clockPin = 3;//CLK uint8_t strobePin = 2; //CS byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; OasisLED ledDisplay = OasisLED(clockPin, strobePin, dataPin); IRrecv irrecv(RECV_PIN); decode_results results; RCSwitch mySwitch = RCSwitch(); int n = 0; // переключение режимов работы byte decToBcd(byte val) { return ( (val / 10 * 16) + (val % 10) ); } byte bcdToDec(byte val) { return ( (val / 16 * 10) + (val % 16) ); } void setDateDs1307(byte second, // 0-59 byte minute, // 0-59 byte hour, // 1-23 byte dayOfWeek, // 1-7 byte dayOfMonth, // 1-28/29/30/31 byte month, // 1-12 byte year) // 0-99 { Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.write(decToBcd(second)); Wire.write(decToBcd(minute)); Wire.write(decToBcd(hour)); Wire.write(decToBcd(dayOfWeek)); Wire.write(decToBcd(dayOfMonth)); Wire.write(decToBcd(month)); Wire.write(decToBcd(year)); Wire.endTransmission(); } void getDateDs1307(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) { Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS, 7); *second = bcdToDec(Wire.read() & 0x7f); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *month = bcdToDec(Wire.read()); *year = bcdToDec(Wire.read()); } void receiveData() { if (irrecv.decode(&results)) { //Serial.println(results.value, HEX); if ((results.value == 0x37) || (results.value == 0x10037)) { // Serial.println(results.value, HEX); ++n; // Serial.println(n); if (n >= 7) n = 0; } switch (n) { case 1: if ((results.value == 0x37) || (results.value == 0x10037)) { // переключение режимов работы mySwitch.send(7652288, 24); } break; case 2: if ((results.value == 0x37) || (results.value == 0x10037)) { // переключение режимов работы mySwitch.send(7652288, 24); } break; case 3: if ((results.value == 0x37) || (results.value == 0x10037)) { // переключение режимов работы mySwitch.send(7652144, 24); } break; case 4: if ((results.value == 0x37) || (results.value == 0x10037)) { // переключение режимов работы mySwitch.send(7652144, 24); } break; case 5: if ((results.value == 0x37) || (results.value == 0x10037)) { // переключение режимов работы mySwitch.send(7652288, 24); delay(100); mySwitch.send(7652144, 24); } break; case 6: if ((results.value == 0x37) || (results.value == 0x10037)) { // переключение режимов работы mySwitch.send(7652288, 24); delay(100); mySwitch.send(7652144, 24); } break; } if ((results.value == 0x6E) || (results.value == 0x1006E)) { mySwitch.send(7652288, 24); } if ((results.value == 0x70) || (results.value == 0x10070)) { mySwitch.send(7652144, 24); } if (millis() - last_time500 > 500) { //delay(500); last_time500 = millis(); irrecv.resume(); } } } void printTime() { if (millis() - last_time1000 > 1000) { //delay(1000); last_time1000 = millis(); getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); ledDisplay.setValue(hour * 100 + minute); ledDisplay.toggleColon(); } } void readKeyData(uint16_t * data) { digitalWrite(strobePin, LOW); // digitalWrite(clockPin, LOW); digitalWrite(dataPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, 0x42); // чтение данных delayMicroseconds(1); *data = shiftIn(DOUT, clockPin, LSBFIRST) + (shiftIn(DOUT, clockPin, LSBFIRST) << 8); digitalWrite(strobePin, HIGH); // digitalWrite(clockPin, HIGH); digitalWrite(dataPin, HIGH); } void hourUP() { getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS, 7); second = bcdToDec(Wire.read() & 0x7f); minute = bcdToDec(Wire.read()); hour = bcdToDec(Wire.read() & 0x3f); dayOfWeek = bcdToDec(Wire.read()); dayOfMonth = bcdToDec(Wire.read()); month = bcdToDec(Wire.read()); year = bcdToDec(Wire.read()); hour = hour + 1; if (hour > 23) { hour = 0; } setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); } void minuteUP() { getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS, 7); second = bcdToDec(Wire.read() & 0x7f); minute = bcdToDec(Wire.read()); hour = bcdToDec(Wire.read() & 0x3f); dayOfWeek = bcdToDec(Wire.read()); dayOfMonth = bcdToDec(Wire.read()); month = bcdToDec(Wire.read()); year = bcdToDec(Wire.read()); minute = minute + 1; if (minute > 59) { minute = 0; } setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); } void setup() { Wire.begin(); ledDisplay.initialize(); irrecv.enableIRIn(); // Start the receiver mySwitch.enableTransmit(10); mySwitch.setPulseLength(237); pinMode(DOUT, INPUT); pinMode(DOUT, INPUT_PULLUP); //кнопка getDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); } void loop() { printTime(); receiveData(); readKeyData(& newKeys);` if (keys != newKeys) { keys = newKeys; if (keys & KEY_1) { hourUP(); } if (keys & KEY_2) { minuteUP(); } } }
Switch на 111 запихать в if() после 106.
Запихать в массив структур код отсылаемый, паузу и второй отсылаемый. Но, скорее всего, этот короткий свитч будет скорострельней.
В функцию nnnnUp() передавать параметр и по его значению спать или час или минуту.
Если код Ваш //то есть два варианта
Или учитесь и обрящите.
В противном случае закажите платную услугу
Если код не ваш //то есть три варианта
Или учитесь и обращите
Или просите автора
В противном случае закажите платную услугу
//платные услуги оказываются ленивым или нессобразительным в разделе «Ищу исполнителя».
в любом случае, если в память влезает и работает трогать не надо.
представте например стоимость услуги 50тыр оно того стоит? А 20?
Есть вполне себе нормально работающая библиотека DS1307RTC.h, которая включает в себя TimeLib.h , в которой уже встроены все нужные структуры времени и функции работы с модулем.
Раза в три код бы сократился, думаю , при ее использовании.
Код полностью мой, собран из разных источников. Используется для отображения часов + управление люстрой. Ардуино + лицевая панель от ТВ приставки.
Спасибо, полистаю. Т.к. именно с моей библиотекой - часы отстают.
Спасибо. Я пока просто не очень понял как в функцию передать тоже один параметр измененый, а остальные оставить как есть.
Вот уж не из-за библиотеки они отстают. Они по жизни такие "точные".
сменить модуль на DS3231
Или добавить коррекцию хода.
Или добавить коррекцию хода.
ход плывёт даже на DS3231, по NTP разве что
Или добавить коррекцию хода.
ход плывёт даже на DS3231, по NTP разве что
Две минуты в год в самом худшем случае.