PHP код:
#include <MFRC522.h>
#include <OneWire.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "RTClib.h"
#include <TimerOne.h>
#include <EEPROM.h>
#define INTERRUPT__INT 0 // 0 Внешнее прерывание
//#define Spare // 1
#define TEMP_DS18B20__DIGITAL_PIN 2 // 2 Цифровой датчик температуры
//#define Scl // 3
#define GEAR_NEITRAL__DIGITAL_PIN 10 // 4 Минус при включении нейтрали
#define FAN_CONTROL_RUN__DIGITAL_PIN 5 // 5 Минус при включении вентилятора
#define FUELPOMP_CONTROL_RUN__DIGITAL_PIN 6 // 6 Минус при включении насоса
//#define Spare // 7
//#define Spare // 8
#define RST_PIN 9 // 9 RFID
#define SS_PIN 10 // 10 RFID
#define FUELPOMP_RELAY__DIGITAL_PIN 11 // 11 Включение реле топливного насоса
#define FAN_RELAY__DIGITAL_PIN 12 // 12 Включение реле вентилятора охлаждения
#define LED_ERROR__DIGITAL_PIN 13 // 13 Светодиод неисправности
#define FUEL_LEVEL__ANALOG_PIN 0 // 0 Датчик уровня топлива
#define TEMP_RESISTOR__ANALOG_PIN 1 // 1 Датчик температуры охлаждающей жидкости
//#define Spare // 2
//#define Spare // 3
#define GEAR_SWITCH__ANALOG_PIN 4 // 4 Номер передачи
#define IGN_ON__ANALOG_PIN 5 // 5 Плюс при включении зажигания
//FAN ==========================================================================================================
// Глобальные переменные
int RELAY_CURENT; // Текущее состояние реле
int TEMP_CURENT_ANALOG; // Показания с АЦП
byte flag_FAN_CYRENT = 0;
// Константы
#define LOW_COLING_FAN 2
#define HIGH_COLING_FAN 3
#define ERROR_COLING_FAN 4
//_Timer()
int Timer = LOW;
unsigned long currentTime;
unsigned long loopTime;
int TEMP_ARRAY_FAN[4] = {88,110,120, 25}; // напряжение [отключение, включение, перегрев, по температуре окр. воздуха]
//SVITCH GEAR====================================================================================================
// Константы
#define UP_GEAR 300 // Делитель напряжения GEAR_SWITCH__ANALOG_PIN
#define DOWN_GEAR 550 // Делитель напряжения GEAR_SWITCH__ANALOG_PIN
// Глобальные переменные
int GEAR_CURENT;
//
int gear, neital;
int u, g;
boolean flag_gearH = false, flag_gearL = false;
//OUT_TEMP=======================================================================================================
OneWire ds(TEMP_DS18B20__DIGITAL_PIN);
// Глобальные переменные
int OUT_TEMP_CORECTION = 10; // 0 - 20
int OUT_TEMP_CURENT =+ (OUT_TEMP_CORECTION - 10);
//DS1307 RTC =======================================================================================================
RTC_DS1307 RTC;
char ch_time[11];
int time_one = 70, timer_go;
//RFID=======================================================================================================
// Константы
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
// Глобальные переменные
unsigned long KEY1 = 2910087621;
unsigned long KEY2 = 4124219933;
unsigned long uidDec, uidDecTemp; // Для отображения номера карточки в десятичном формате.
int KEY_OK;
//OLED Display=======================================================================================================
Adafruit_SSD1306 display(4); //OLED_RESET
#define LINE 20 // отступ линии от левого края
#define W_PRBAR 15 // ширина элемента прогресс бара
static const unsigned char PROGMEM logo16_glcd_bmp[] =
{B11111111, B11111111,
B11111111, B11111111,
B11111111, B11111111,
B11111111, B11111111,
B11111111, B11111111};
// Константы
#define M_SERVIS 1
#define SUB_TO2 10
#define SUB_TO3 11
#define SUB_OIL 12
#define SUB_CHAIN 13
#define M_OPTION_FAN 2
#define SUB_ERROR 21
#define SUB_SET_TEMP 22
#define SUB_T_OUT 23
#define SUB_FAN_OFF 24
#define M_FAN 3
#define SUB_STATUS 30
#define SUB_AKTIV 31
#define SUB_CORECT_OUT 32
#define SUB_CORECT_ENGIN 33
#define M_SPEED 4
#define SUB_CORECT 40
#define SUB_SPEED 41
#define M_ERROR1 5
#define M_RROR2 6
#define MAIN_MENU_MAIN 111
#define MAIN_MENU_ERROR 222
#define MAIN_MENU_TAIM 333
#define MAIN_MENU_KEY 444
int servis_Limit[4] = {12000, 6000, 3000, 1000};
//_______________________________________________________________________________________________________________
void setup()
{
//Serial.begin(9600);
/*
pinMode(FAN_RELAY__DIGITAL_PIN, OUTPUT);
pinMode(GEAR_NEITRAL__DIGITAL_PIN, INPUT);
digitalWrite(GEAR_NEITRAL__DIGITAL_PIN, HIGH);
attachInterrupt(INTERRUPT__INT, blnk, FALLING); // 0 Внешнее прерывание
pinMode(GEAR_NEITRAL__DIGITAL_PIN, INPUT); // 4 Минус при включении нейтрали
digitalWrite(GEAR_NEITRAL__DIGITAL_PIN, HIGH);
pinMode(FAN_CONTROL_RUN__DIGITAL_PIN, INPUT); // 5 Минус при включении вентилятора
digitalWrite(FAN_CONTROL_RUN__DIGITAL_PIN, HIGH);
pinMode(FUELPOMP_CONTROL_RUN__DIGITAL_PIN, INPUT); // 6 Минус при включении насоса
digitalWrite(FUELPOMP_CONTROL_RUN__DIGITAL_PIN, HIGH);
pinMode(FUELPOMP_RELAY__DIGITAL_PIN, OUTPUT); // 11 Включение реле топливного насоса
pinMode(FAN_RELAY__DIGITAL_PIN, OUTPUT); // 12 Включение реле вентилятора охлаждения
pinMode(LED_ERROR__DIGITAL_PIN, OUTPUT); // 13 Светодиод неисправности
*/
Wire.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.setTextColor(WHITE);
SPI.begin();
mfrc522.PCD_Init(); // Init MFRC522 card
RTC.begin();
display.clearDisplay();
_DispleyAddMenu(MAIN_MENU_KEY,0); // Надпись на дисплее "KEY ?"
display.display();
}
void loop()
{
if (_Timer(100, 5000) == 10) // Считываем температуру каждые 5 сек
{
TEMP_CURENT_ANALOG = analogRead(TEMP_RESISTOR__ANALOG_PIN); // Температуру двигателя
_Out_Temp(); // Температуру наружного воздуха
}
_TempMonitoring(TEMP_CURENT_ANALOG);
_Gear_Switch_Neutral();
DateTime now = RTC.now();// Определяем время
if (time_one == 70) time_one = now.second() - 2;
if (now.second() > time_one){timer_go = now.second() - time_one;}
else {timer_go ++;}
sprintf (ch_time,"%02i:%02i:%02i",now.hour(),now.minute(), timer_go);
if (KEY_OK == 0){
unsigned long tk = _ReadKeyRFID();
if (tk == KEY1 || tk == KEY2) KEY_OK = 1;
display.clearDisplay();
}
if (KEY_OK == 1){
_DispleyAddMenu(MAIN_MENU_MAIN,0);
display.display();
display.clearDisplay();
delay(1000);
}
}
//________________________________________________________________________________________________________________
//FUNC ***********************************************************************************************************
unsigned long _ReadKeyRFID(){
if ( !mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) return 0;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
uidDecTemp = mfrc522.uid.uidByte[i];
uidDec = uidDec*256+uidDecTemp;
}
return uidDec;
}
int _DispleyAddMenu(int fun, int str){ // номер функции, строка функции
char* myStrings[]={"TO2", "TO3", "Oil","Chain", "Err Temp", "Temp On", "t out>30", "Temp Off"};
char charBufVar[50];
String stringVar;
int iii;
switch (fun)
{
case M_SERVIS: // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
__dis(0, 0, 2, WHITE, 0);
display.println(fun + String(">Servis"));
if (str == SUB_TO2){ iii = servis_Limit[0]; stringVar = myStrings[0];}
if (str == SUB_TO3){ iii = servis_Limit[1]; stringVar = myStrings[1];}
if (str == SUB_OIL){ iii = servis_Limit[2]; stringVar = myStrings[2];}
if (str == SUB_CHAIN){ iii = servis_Limit[3]; stringVar = myStrings[3];}
__dis(0, 20, 2, WHITE, 0);
stringVar.toCharArray(charBufVar, 50);
display.println(charBufVar);
__dis(0, 42, 3, WHITE, 1);
display.println(iii);
break; // --- >
case M_OPTION_FAN: // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
__dis(0, 0, 2, WHITE, 0);
display.println(fun + String(">Opt Fan"));
if (str == SUB_ERROR){ iii = TEMP_ARRAY_FAN[2]; stringVar = myStrings[4];}
if (str == SUB_SET_TEMP){ iii = TEMP_ARRAY_FAN[1]; stringVar = myStrings[5];}
if (str == SUB_T_OUT){ iii = TEMP_ARRAY_FAN[3]; stringVar = myStrings[6];}
if (str == SUB_FAN_OFF){ iii = TEMP_ARRAY_FAN[0]; stringVar = myStrings[7];}
__dis(0, 20, 2, WHITE, 0);
stringVar.toCharArray(charBufVar, 50);
display.println(charBufVar);
__dis(0, 42, 3, WHITE, 1);
display.println(iii);
break; // --- >
case M_FAN: // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
__dis(0, 0, 2, WHITE, 0);
display.println(fun + String(">Fan"));
switch (str)
{
case SUB_STATUS:
__dis(0, 20, 2, WHITE, 0);
display.println("Status");
__dis(0, 42, 3, WHITE, 0);
if (flag_FAN_CYRENT == 1) display.println("ON");
else display.println("OFF");
break; // --- >
case SUB_AKTIV:
__dis(0, 20, 2, WHITE, 0);
display.println("Activation");
__dis(0, 42, 3, WHITE, 1);
display.println("---");
break; // --- >
case SUB_CORECT_OUT:
__dis(0, 20, 2, WHITE, 0);
display.println("Out tem +-");
__dis(0, 42, 3, WHITE, 1);
display.println(OUT_TEMP_CORECTION + String("c"));
break; // --- >
case SUB_CORECT_ENGIN:
__dis(0, 20, 2, WHITE, 0);
display.println("Eng tem +-");
__dis(0, 42, 3, WHITE, 1);
display.println(OUT_TEMP_CORECTION + String("c"));
break; // --- >
}
break; // --- >MAIN_MENU_TAIM
case MAIN_MENU_TAIM: // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
__dis(0, 0, 2, WHITE, 0);
display.println("Time");
__dis(0, 20, 2, WHITE, 0);
display.println(ch_time);
break; // --- >
case MAIN_MENU_MAIN: // Главный экран
__dis(0, 0, 8, WHITE, 0); // Номер передачи
if (GEAR_CURENT == 0) display.println("N");
display.println(GEAR_CURENT);
__dis(50, 0, 2, WHITE, 0); // Температура за бортом
display.println( String(OUT_TEMP_CURENT, DEC));
for (int f=0; f< random(0, 65); f+=5) {
display.drawBitmap(128 - W_PRBAR, 64 - f , logo16_glcd_bmp, W_PRBAR, 4, WHITE);
}
display.drawLine(128 - LINE, 64,128 - LINE , 0, WHITE); // линия
break; // --- >
case MAIN_MENU_KEY: // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
__dis(0, 0, 4, WHITE, 0);
display.println("NOKEY");
__dis(0, 40, 1, WHITE, 0);
display.println("Honda Varadero");
__dis(0, 50, 1, WHITE, 0);
display.println("computer v15.02.15");
break; // --- >
}
display.display();
}
int __dis(int pos_s, int pos, int siz, int color, int flag){ // 1 позиция с лева, 2 с верху, 3 размер шрифта, 4 цвет
display.setTextSize(siz);
display.setCursor(pos_s,pos);
display.setTextColor(color);
if (flag == 1)display.setTextColor(BLACK, WHITE); //Инверсия
}
int _Out_Temp() // Температура наружного воздуха
{
byte i,present = 0,type_s,data[12],addr[8];
float celsius;
if ( !ds.search(addr)) ds.reset_search();
ds.reset();
ds.select(addr);
ds.write(0x44, 1);
present = ds.reset();
ds.select(addr);
ds.write(0xBE);
for ( i = 0; i < 9; i++) data[i] = ds.read();
int16_t raw = (data[1] << 8) | data[0];
if (type_s){raw = raw << 3;if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6];}
OUT_TEMP_CURENT = (float)raw / 16.0;
}
int _Timer(int l, int h) // Возвращет 5 после времени 'l' и 10 после времени 'h'
{
currentTime = millis();
if(currentTime >= (loopTime + l) && (Timer != HIGH)){loopTime = currentTime;Timer = HIGH;return 5;}
if(currentTime >= (loopTime + h) && (Timer = HIGH)){loopTime = currentTime;Timer = LOW;return 10;}
}
int _TempMonitoring(int adc) // Считываем ацп указанного вывода, включаем или выключаем реле.
{
if (adc > 150 ){_RelayColingFan(ERROR_COLING_FAN);return ERROR_COLING_FAN;} // Перегрев
if (adc > 130){_RelayColingFan(HIGH_COLING_FAN);return HIGH_COLING_FAN;} // Включаем
if (adc < 80){_RelayColingFan(LOW_COLING_FAN);return LOW_COLING_FAN;} // Выключаем
}
int _RelayColingFan(int atr) // Включение реле согласно принятому значению температуры
{
switch (atr)
{
case LOW_COLING_FAN: // 80C
digitalWrite(FAN_RELAY__DIGITAL_PIN, HIGH); // Выключено
RELAY_CURENT = digitalRead(FAN_RELAY__DIGITAL_PIN);
break;
case HIGH_COLING_FAN: // 100C
digitalWrite(FAN_RELAY__DIGITAL_PIN, LOW); // Включено
RELAY_CURENT = digitalRead(FAN_RELAY__DIGITAL_PIN);
break;
case ERROR_COLING_FAN: // Перегрев
break;
default: //
//
break;
}
}
int _Gear_Switch_Neutral()
{
int anread = analogRead(GEAR_SWITCH__ANALOG_PIN);
if (anread > DOWN_GEAR) {_Gear_Set(anread,DOWN_GEAR);gear = DOWN_GEAR;} // Если напряжение на делителе "равно" константе (замкнут геркон DOWN) то передаём в функцию напряжение и константу
else if (anread > UP_GEAR) {_Gear_Set(anread,UP_GEAR);gear = UP_GEAR;} // Замкнут геркон UP
if (anread == 0 && gear == DOWN_GEAR) {_Gear_Set(0,DOWN_GEAR);gear = 0;} // Передам в функцию ноль, геркон отключен
if (anread == 0 && gear == UP_GEAR) {_Gear_Set(0,UP_GEAR);gear = 0;} //
//if ( digitalRead(GEAR_NEITRAL__DIGITAL_PIN)== LOW ) {lcd.setCursor(0, 0); lcd.print("Neitral "); GEAR_CURENT = 1;} //Если нейтраль то номер передачи равен одному
}
int _Gear_Set(int abc, int gear1)// Счётчик скоростей в переменной GEAR_CURENT / напряжение ацп, up или down.
{
u = abc, g = gear1;
if (u > g) {flag_gearL = true;}
if (u == 0 && flag_gearL == true) {flag_gearH = true;}
if (flag_gearH == true && flag_gearL == true)
{
flag_gearH = false;
flag_gearL = false;
if (g == UP_GEAR && GEAR_CURENT < 5) GEAR_CURENT++; //Ограничиваем наивысшую пердачу на 5
if (g == DOWN_GEAR && GEAR_CURENT > 1) GEAR_CURENT--;//Ограничиваем низшую пердачу на 1
}
}