#include <EEPROM.h> //библиотека для памяти в ардуино
#include <OneWire.h> //библиотека для iButton
#define IrAdr 0x00FF // адрес пульта IR
#define IR_IN 2 // прием IR
#define IR_OUT 3 // передача IR
#define BUTTON_1 4 // кнопка белая
#define BUTTON_2 5 // кнопка красная
#define BUTTON_3 A7 // кнопки аналоговые
#define data_pin 6 // DS 74HC595 сдвиговый регистр
#define latch_pin 7 // STCP 74HC595 сдвиговый регистр
#define clock_pin 8 // SHCP 74HC595 сдвиговый регистр
#define iB_pin 12 // пин для подлючения iButton
OneWire iButton (iB_pin); // пин для подлючения iButton
unsigned long IR_buffer; // буфер для IR
unsigned int IR_sig[32]; // массив для IR
unsigned int Adr; // адрес
unsigned int Com; // команда
unsigned int _Com; // команда
byte BUTTON_Time; // переменная для хранения времени удержания кнопки
byte Slot; // переменная для хранения номера ячейки
byte Case; // переменная для хранения кейса
byte iB_buffer[8] = {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F}; // массив буфера iButton
byte DigitM[4] = {128, 64, 32, 16}; // массив для разряда
byte SegmentM[10] = {3, 159, 37, 13, 153, 73, 65, 31, 1, 9}; // массив для чисел
void setup() {
Serial.begin(9600);
Serial.setTimeout(100);
pinMode(IR_IN, INPUT);
pinMode(IR_OUT, OUTPUT);
pinMode(BUTTON_1, INPUT);
pinMode(BUTTON_2, INPUT);
pinMode(BUTTON_3, INPUT);
pinMode(data_pin, OUTPUT);
pinMode(clock_pin, OUTPUT);
pinMode(latch_pin, OUTPUT);
EEPROM.get(60, Slot);
EEPROM.get(61, Case);
EEPROM.get(Slot * 4, IR_buffer);
// for (byte i = 0; i < 8; i++)
// EEPROM.get(Slot * 8 + i, iB_buffer[i]);
Shift(DigitM[Case], SegmentM[Slot]);
Show_var();
Bip(100, 1);
}
void loop() {
switch (Case) {
case 0: // переключение ячейки Slot
break;
case 1: // чтение IR команд
IR_REC();
break;
case 2: // чтение iButton
break;
}
Button();
Settings();
}
void Bip(byte Hz, byte N) { // сигнал
for (int i = 0; i < N; i++) {
tone(13, Hz); delay(30);
noTone(13); delay(50);
}
}
void Show_var() { // Отправить все данные в сериал
delay(500);
Serial.print("Case: "); Serial.print(Case);
Serial.print(", Slot: "); Serial.println(Slot);
Serial.print("IR_buffer: "); Serial.println(IR_buffer, HEX);
Serial.print("iB_buffer: ");
for (int i = 0; i < 8; i++) {
Serial.print(iB_buffer[i], HEX);
Serial.print(" ");
}
for (int i = 0; i < 62; i++) {
if (i % 4 == 0) {
Serial.println();
Serial.print(i);
Serial.print("\t");
}
Serial.print(EEPROM[i], HEX);
Serial.print(" ");
}
Serial.println();
}
void Shift(byte Digit, byte Segment) { // управление сдвиговым регистром
digitalWrite(latch_pin, LOW);
shiftOut(data_pin, clock_pin, LSBFIRST, Segment);
shiftOut(data_pin, clock_pin, LSBFIRST, Digit);
digitalWrite(latch_pin, HIGH);
delay(10);
}
void Button() { // выполняем действия по кнопке
if (digitalRead(BUTTON_1) == HIGH) {
delay(300);
Case++;
if (Case > 2) Case = 0;
EEPROM.put(61, Case);
Serial.print("Case: "); Serial.println(Case);
Shift(DigitM[Case], SegmentM[Slot]);
Bip(100, Case + 1);
}
while (digitalRead(BUTTON_2) && BUTTON_Time < 10) { // Если кнопка 2 нажата, то ...
delay(100);
BUTTON_Time++;
}
if (0 < BUTTON_Time && BUTTON_Time < 10) { // Если значение счётчика меньше 10
BUTTON_Time = 0;
switch (Case) { // действия при коротком нажатии
case 0: // в режиме переключение ячейки Slot
Slot++;
if (Slot > 4) Slot = 0;
EEPROM.put(60, Slot);
Serial.print("Slot: "); Serial.println(Slot);
Shift(DigitM[Case], SegmentM[Slot]);
break;
case 1: // в режиме IR команд
EEPROM.get(Slot * 4, IR_buffer);
IR_send(IR_buffer);
break;
case 2: // в режиме iButton
iB_read();
break;
}
Bip(100, 1);
delay(200);
}
if (BUTTON_Time >= 10) { // Если значение счётчика больше 10
BUTTON_Time = 0;
switch (Case) { // действия при длительном нажатии
case 0: // в режиме переключение ячейки Slot
break;
case 1: // в режиме IR команд
EEPROM.put(Slot * 4, IR_buffer);
Serial.print(IR_buffer, HEX);
Serial.print(" REC IR Slot: ");
Serial.println(Slot);
break;
case 2: // в режиме iButton
/*
for (int i = 0; i < 8; i++) {
EEPROM.put(Slot * 8 + 20 + i, iB_buffer[i]);
Serial.print(iB_buffer[i], HEX);
}
Serial.print(" REC iButton Slot: ");
Serial.println(Slot);
*/
iB_write();
break;
}
Bip(250, 1);
delay(500);
}
switch (analogRead(BUTTON_3) / 205) {
case 1:
break;
case 2:
break;
Bip(100, 1);
}
}
void IR_REC() { // запись IR
if (digitalRead(IR_IN) == LOW) {
int s = pulseIn(IR_IN, HIGH);
if (s > 4000) { //запись значений с датчика
for (int i = 0; i < 32; i++)
IR_sig[i] = pulseIn(IR_IN, HIGH);
IR_buffer = 0;
for (int i = 0; i < 32; i++) { //перевод массива в бинарный код
if (IR_sig[i] > 1000)
bitWrite(IR_buffer, 31 - i, 1);
}
Adr = (IR_buffer >> 16);
Com = IR_buffer;
}
if (((~IR_buffer >> 8) & 0xFF) != (IR_buffer & 0xFF)) return;
Serial.print("IR_buffer: "); Serial.println(IR_buffer, HEX);
/* byte Com1 = 0;
for (int i = 0; i < 8; i++) //извлечение из сигнала команды
Com1 |= (IR_buffer] << i);
Serial.print(" Com: "); Serial.println(Com1);
*/
IRUse(); //выполняем действия если получена команда
Bip(100, 1);
}
}
void IRUse() { // выполняем действия от IR
if (Adr == IrAdr)
switch (Com) {
case 0x2FD: //зеленая кнопка 64
break;
case 0x9867: //красная кнопка 25
break;
Bip(100, 1);
}
}
void IR_send(unsigned long Adr_Com) { // отправляем команду IR
Serial.print("Send IR_buffer: "); Serial.print(Adr_Com, HEX);
Serial.print(" Slot: "); Serial.println(Slot);
tone(IR_OUT, 38000); delayMicroseconds(7530);
noTone(IR_OUT); delayMicroseconds(4380);
for (int i = 31; i >= 0; i --) { // передача сигнала
tone(IR_OUT, 38000); delayMicroseconds(520);
noTone(IR_OUT);
if ( bitRead(Adr_Com, i) == 1)
delayMicroseconds(1580);
else
delayMicroseconds(500);
}
tone(IR_OUT, 38000); delayMicroseconds(520);
noTone(IR_OUT); delay(40);
tone(IR_OUT, 38000); delayMicroseconds(7530);
noTone(IR_OUT); delayMicroseconds(1580);
tone(IR_OUT, 38000); delayMicroseconds(520);
noTone(IR_OUT);
}
void Settings() { // настройки
if (Serial.available() > 0) {
char key = Serial.read(); //ключ первый символ
byte seting = Serial.parseInt(); //значение после ключа
Serial.read();
switch (key) {
case 'R': //читать iButton
iB_read();
Bip(100, 1);
break;
case 'W': //записать iButton
iB_write();
Bip(100, 1);
break;
case 'M': //показать память
Show_var();
break;
case 'C': //очистить память
for (int i = 0; i < 60; i++) EEPROM.put(i, 255);
Serial.println("Memory clean");
break;
}
}
}
void iB_read() { // чтение кнопки iButton
Serial.print("Read iButton: ");
if (!iButton.search(iB_buffer)) {
Serial.println("Error");
return;
}
delay (300);
for (byte i = 0; i < 8; i++) {
Serial.print(iB_buffer[i], HEX);
Serial.print(" ");
}
Serial.println();
iButton.reset_search();
}
void iB_write() { // запись кнопки iButton
Serial.print("Write iButton: ");
for (byte x = 0; x < 8; x++) {
Serial.print(iB_buffer[x], HEX);
Serial.print(' ');
}
iButton.skip(); //пропуск выбора конкретного устройства, поскольку мы работаем с единственным устройством
iButton.reset(); //команда сброса линии связи, чтобы начать обмен данными заново
iButton.write(0xD1); // используется для инициализации процесса записи данных в память устройства
digitalWrite(iB_pin, LOW); pinMode(iB_pin, OUTPUT); delayMicroseconds(60);
pinMode(iB_pin, INPUT); digitalWrite(iB_pin, HIGH); delay(10);
iButton.skip(); //пропуск выбора конкретного устройства, поскольку мы работаем с единственным устройством
iButton.reset(); //команда сброса линии связи, чтобы начать обмен данными заново
iButton.write(0xD5); //инициирует запись восьми байт данных в память
for (byte x = 0; x < 8; x++) {
byte data = iB_buffer[x];
for (int data_bit = 0; data_bit < 8; data_bit++) {
if (data & 1) {
digitalWrite(iB_pin, LOW); pinMode(iB_pin, OUTPUT); delayMicroseconds(60);
pinMode(iB_pin, INPUT); digitalWrite(iB_pin, HIGH); delay(10);
} else {
digitalWrite(iB_pin, LOW); pinMode(iB_pin, OUTPUT);
pinMode(iB_pin, INPUT); digitalWrite(iB_pin, HIGH); delay(10);
}
data = data >> 1;
}
}
iButton.reset(); //команда сброса линии связи, чтобы начать обмен данными заново
iButton.write(0xD1);
digitalWrite(iB_pin, LOW); pinMode(iB_pin, OUTPUT); delayMicroseconds(10);
pinMode(iB_pin, INPUT); digitalWrite(iB_pin, HIGH); delay(10);
Serial.println(" OK");
}
void iB_send() { // эмуляция iButton
}Loading
ds18b20
ds18b20