Рефакторинг кода - код рабочий

maksmkv
Offline
Зарегистрирован: 07.04.2013

Всем привет. Есть код - рабочий, но повторяющиеся конструкции прям бесят. В с++ знаний не  хватает написать лучше. Может сможете помочь немного его укоротить. СПАСИБО

 

#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();
    }
  }
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Switch на 111 запихать в if() после 106.

Запихать в массив структур код отсылаемый, паузу и второй отсылаемый. Но, скорее всего, этот короткий свитч будет скорострельней.

В функцию nnnnUp() передавать параметр и по его значению спать или час или минуту.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Если код Ваш //то есть два варианта

     Или учитесь и обрящите.

     В противном случае закажите платную услугу

Если код не ваш //то есть три варианта

     Или учитесь и обращите

     Или просите автора

     В противном случае закажите платную услугу

//платные услуги оказываются ленивым или нессобразительным в разделе «Ищу исполнителя».

в любом случае, если в память влезает и работает трогать не надо.

представте например стоимость услуги 50тыр оно того стоит? А 20?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Есть вполне себе нормально работающая библиотека DS1307RTC.h, которая включает в себя TimeLib.h , в которой уже встроены все нужные структуры времени и функции работы с модулем.
Раза в три код бы сократился, думаю , при ее использовании.

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Код полностью мой, собран из разных источников. Используется для отображения часов + управление люстрой. Ардуино + лицевая панель от ТВ приставки.

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Спасибо, полистаю. Т.к. именно с моей библиотекой - часы отстают.

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Спасибо. Я пока просто не очень понял как в функцию передать тоже один параметр измененый, а остальные оставить как есть.

kalapanga
Offline
Зарегистрирован: 23.10.2016

mkvmaks пишет:
Спасибо, полистаю. Т.к. именно с моей библиотекой - часы отстают.

Вот уж не из-за библиотеки они отстают. Они по жизни такие "точные".

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

mkvmaks пишет:
Спасибо, полистаю. Т.к. именно с моей библиотекой - часы отстают.

сменить модуль на DS3231

Green
Offline
Зарегистрирован: 01.10.2015

Или добавить коррекцию хода.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

Или добавить коррекцию хода.

ход плывёт даже на DS3231, по NTP разве что

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

ua6em пишет:

Green пишет:

Или добавить коррекцию хода.

ход плывёт даже на DS3231, по NTP разве что


Две минуты в год в самом худшем случае.