#include <Wire.h>
//#include <Adafruit_SH110X.h>
#include "stepper.h"
#include "tacho.h"
#include <EEPROM.h>
#define PIN_1 4
#define PIN_2 5
#define PIN_3 13
#define PIN_4 14
#define BUTTON 15
#define TACHO_PIN 34
#define SLEEP_PIN 35 //пин от ключа зажигания для отправки в сон и включения
#define EEPROM_SIZE 4 //EEPROM 4 байтовых ячеек(float=4byte)
#define TRIP_C_DEFAULT 0.0 //Значение общего пробега по умолчанию
struct Trips{ //структура для памяти РТС
volatile float rtcTripA;
volatile float rtcTripB;
};
RTC_DATA_ATTR struct Trips mytrips; //выделяем память под трипы в памяти РТС
Stepper mystepper(PIN_1, PIN_2, PIN_3, PIN_4, 0, 12000, 12); //Инициалицируем класс шаговика
Tacho mytacho(BUTTON); //Инициалицируем класс таходатчика
//Adafruit_SH1107 display = Adafruit_SH1107(64, 128, &Wire);
int ODO = 0;
void setup()
{
Serial.begin(115200);
//Конфигурируем вход SLEEP_PIN на пробуждение по высокому уровню
esp_sleep_enable_ext0_wakeup((gpio_num_t)SLEEP_PIN,HIGH);
// инициализировать EEPROM с предопределенным размером
EEPROM.begin(EEPROM_SIZE);
// прочитать сохраненное значение общего трипа из флеш памяти
float tripC = EEPROM.readFloat(0);
if(tripC != tripC){ //если в памяти пусто, записать значение по умолчанию
EEPROM.writeFloat(0, TRIP_C_DEFAULT); //использовать для первого запуска чтобы записать пробег в память
EEPROM.commit(); //подтверждение записи в память
mytacho.setODO(TRIP_C_DEFAULT); //перезаписываем значение по умолчанию в тахометр
ODO = TRIP_C_DEFAULT; //пишем в глоб. переменную нач. значения одометра
}
else {
mytacho.setODO(tripC); //если все ок, перезаписываем сохраненное значение в тахометр
ODO = tripC; //пишем в глоб. переменную нач. значения одометра
}
mytacho.setTripA(mytrips.rtcTripA); //восстанавливаем значение трипА из памяти RTC
mytacho.setTripB(mytrips.rtcTripB); //восстанавливаем значение трипБ из памяти RTC
/*Serial.println("128x64 OLED FeatherWing test");
display.begin(0x3C, true); // Address 0x3C default
Serial.println("OLED begun");
display.clearDisplay();
display.setRotation(1);
display.setTextColor(SH110X_WHITE);
display.display(); */
pinMode(TACHO_PIN, INPUT_PULLUP); // тахо пин тянем к VCC
attachInterrupt(TACHO_PIN, isr, RISING); // настраиваем прерывание
mystepper.init(); //включаем процедуру инициализации мотора(прогон по упорам)
}
// обработчик прерывания
IRAM_ATTR void isr() { //IRAM_ATTR заставляет хранить скомпил. код прерывания в оперативке, а не во FLASH. Ускоряет обработку кода прерывания
mytacho.isr(); // дёргаем тик
}
void loop()
{
if(!digitalRead(SLEEP_PIN)) {
int LAST_ODO = mytacho.getODO();
if(ODO < LAST_ODO || mytacho.getOverflow()){ //если данные одометра изменились с последней загрузки, или был переход через миллион км пробега, сохраняем во флэш
EEPROM.writeFloat(0, mytacho.getODO()); //использовать для первого запуска чтобы записать пробег в память
EEPROM.commit(); //подтверждение записи в память
Serial.println("ODO FLASH write");
}
mytrips.rtcTripA = mytacho.getTripA(); //сохраняем трипА в памяти РТС
mytrips.rtcTripB = mytacho.getTripB(); //сохраняем трипБ в памяти РТС
Serial.println("Going to sleep");
Serial.println("tripA= ");
Serial.println(mytrips.rtcTripA);
Serial.println("tripB= ");
Serial.println(mytrips.rtcTripB);
esp_deep_sleep_start(); //Уходим спать по низкому уровню на SLEEP_PIN
}
mystepper.tick(mytacho.getSpeed());
mytacho.buttonControl();
}