Библиотека чтения ID брелков сигнализациий HCS301 KEELOQ

slider
Offline
Зарегистрирован: 17.06.2014

maksim пишет:

vlkam пишет:

Код формируется из кода производителя + серийный номер. Алгоритм KEELOQ вроде взломан, но настолько глубоко я не копал

Получается что даже если "подслушать" посылку и передать её это ничего не даст, второй раз эта посылка не пройдет
А для генерации корректной посылки нужно воспроизводить алгоритм Keeloq

На самом деле никто не взламывал KEELOQ и любой другой шифр не взламывают, да этого и не нужно, плюс ко всему что бы взломать надо тыкать на брелок N сотен раз.

Да, ладно! http://pult-brelok.ru/ дублирует с пары нажатий, не только ворота шлагбаумы с плавающим кодом DOORHAN, CAME,.... но и автосиги , чтоб не быть голословным TOMAHAWK____ ,.... Вроде изделия с 2012 года под вопросом, толи там какуюто лицензию KEELOQ они проплатили, толи ещё что , и на полную катушку его возможности используют, а ранние модели не так заумны,   дублируются (ток надо кнопку долго жать , и используется лазейка в  KEELOQ ).   Раньше с год назад на ебае можно было много найти по словам copy clone rolling code, сейчас там практически нет уже клонирующих брелков

 

std
Offline
Зарегистрирован: 05.01.2012

Ну, там же заодно есть статьи о правовых последствиях, с чем это едят и как разваливают дело. Может до кучи УК, УПК и учебник по криминалистике найдётся, тоже полезное чтиво. Пущай satai самообразовывается.

4ishops
Offline
Зарегистрирован: 06.10.2012

Еще вариант, взято здесь

 

#include "math.h" 


#define txPin 8
#define rxPin 7
#define signalPin 6

int lastRxValue = 0;
int tempRxValue = 0;
unsigned long lastRxTime = 0;
unsigned long tempTime = 0;
unsigned long difTime = 0;
boolean bValidPacket = false;
int decodeMethod = 1; //0 real - as in manual, 1 inver as Oleg do


//Global vars end
void send_meander(int time){
  digitalWrite(txPin, HIGH);
  delayMicroseconds(time);
  digitalWrite(txPin, LOW);
  delayMicroseconds(time);
}
//keelog start
int keelog_state = 0;
int keelogCounter = 0;
byte keelog_code[9];

void keelog_vardump(){
  if(decodeMethod == 0){
    Serial.println(" - keelog origin - ");
  }
  else{
    Serial.println(" - keelog invert - ");
  }
  Serial.print(keelog_code[0], HEX);
  Serial.print(keelog_code[1], HEX);
  Serial.print(keelog_code[2], HEX);
  Serial.print(keelog_code[3], HEX);
  Serial.println("-hop");
  Serial.print(keelog_code[4], HEX);
  Serial.print(keelog_code[5], HEX);
  Serial.print(keelog_code[6], HEX);
  Serial.println("-fix");
  Serial.print(keelog_code[7], HEX);
  Serial.println("-btn");
  Serial.print(keelog_code[8], HEX);
  Serial.println("-dop");
  
  /*for(int i = 0; i<9; i++){
    Serial.print(keelog_code[i], HEX);
    Serial.print(" - ");
  }*/
  keelog_send(keelog_code);
  digitalWrite(signalPin, HIGH);
  delay(100);
  digitalWrite(signalPin, LOW);
  keelog_state = 0;
  for(int i = 0; i<9; i++){
    keelog_code[i]=0;
  }
}
void keelog_send(byte* keelog_code){
  Serial.println("- sending keelog -");
  for(int i = 0; i<9; i++){
    Serial.print(keelog_code[i], HEX);
    Serial.print(" - ");
  }
  for(int i = 0; i<11; i++){//посылаем преамблу
    send_meander(400);
  }
  digitalWrite(txPin, HIGH);
  delayMicroseconds(400);
  digitalWrite(txPin, LOW);
  delayMicroseconds(4000);//посылаем хедер
  
  for( int i = 0; i<9; i++){
    if(decodeMethod==1){
      for(int i2 = 7;i2>=0;i2--){
        if(bitRead(keelog_code[i], i2)){
          digitalWrite(txPin, HIGH);
          delayMicroseconds(400);
          digitalWrite(txPin, LOW);
          delayMicroseconds(2*400);
        }
        else{
          digitalWrite(txPin, HIGH);
          delayMicroseconds(2*400);
          digitalWrite(txPin, LOW);
          delayMicroseconds(400);
        }
      }
    }
    else{
        for(int i2 = 0;i2<8;i2++){
          if(!bitRead(keelog_code[i], i2)){
            digitalWrite(txPin, HIGH);
            delayMicroseconds(400);
            digitalWrite(txPin, LOW);
            delayMicroseconds(2*400);
          }
          else{
            digitalWrite(txPin, HIGH);
            delayMicroseconds(2*400);
            digitalWrite(txPin, LOW);
            delayMicroseconds(400);
          }
       } 
    }
    
  }
}
void keelog_get(){
    bValidPacket = false;
    if(keelog_state==0){//ждем преамбулу и хедер
      if(difTime > 280 && difTime < 620 && lastRxValue != tempRxValue){
        keelogCounter ++;
      }
      else{
        if(keelogCounter==23){
          if(difTime>2800 && difTime<6200 && lastRxValue == 0){
            keelog_state=1;
          }
        }
       keelogCounter = 0;
      }
    }
    else if(keelog_state==1){// получаем биты
      if(difTime > 560 && difTime < 1240 && lastRxValue == 1){// получили 1
        if(decodeMethod==0){
          keelog_code[round(keelogCounter/8)] = (keelog_code[round(keelogCounter/8)]>>1)|B10000000;
        }
        else{
          keelog_code[round(keelogCounter/8)] = (keelog_code[round(keelogCounter/8)]<<1)|B00000000;
        }
        bValidPacket = true;
      }
      else if(difTime > 280 && difTime < 620 && lastRxValue == 1){
        if(decodeMethod==0){
          keelog_code[round(keelogCounter/8)] = (keelog_code[round(keelogCounter/8)]>>1)|B00000000;
        }
        else{
          keelog_code[round(keelogCounter/8)] = (keelog_code[round(keelogCounter/8)]<<1)|B00000001;
        }
        bValidPacket = true;
      }
      else if(lastRxValue == 0){
      }
      else{
        keelog_state=1;
        keelogCounter = 0;
      }
      
      if(bValidPacket){
        keelogCounter++;
        if(keelogCounter==66){
          keelog_vardump();
          keelogCounter = 0;
          keelog_state = 0;
        }
      }
    }
}
//keelog end


void setup() {                
  pinMode(txPin, OUTPUT);
  pinMode(rxPin, INPUT);
  pinMode(signalPin, OUTPUT);
  //
  Serial.begin(9600);
  Serial.println("start");
  lastRxValue = digitalRead(rxPin);
  lastRxTime = micros();
  
  //attachInterrupt(0, grab, CHANGE);
}

void loop() {
  tempRxValue = digitalRead(rxPin);
  
  if(tempRxValue != lastRxValue){
    tempTime = micros();
    difTime = tempTime - lastRxTime;
    keelog_get();  
    lastRxTime = tempTime;
    lastRxValue = tempRxValue;
  }
}

 

defezit
Offline
Зарегистрирован: 14.12.2014

Народ, а подскажите, нужен именно такой приемник как на картинке?  Или можно штатный для ардуинки?

 

vlkam
Offline
Зарегистрирован: 17.02.2013

defezit пишет:
Народ, а подскажите, нужен именно такой приемник как на картинке?  Или можно штатный для ардуинки?

Можно любой. Главное чтобы частота совпадала с частотой брелка.

defezit
Offline
Зарегистрирован: 14.12.2014

Огроменное спасибо, а то я уж думал придётся раскошелиться. На алиэкспрессе лот с такимже приемником, но с 4 белками стоит 30 бакинских

 

vlkam
Offline
Зарегистрирован: 17.02.2013

defezit пишет:
Огроменное спасибо, а то я уж думал придётся раскошелиться. На алиэкспрессе лот с такимже приемником, но с 4 белками стоит 30 бакинских

Но есть одно НО. У меня брелоки с алиэкспресса хуже работают чем ибеевские. Например ибеевский с 30 метров, а алишный только с 5-7

И приемники алишные вроде бы тоже хуже работают, но это не точно, в работе не проверял, просто потестил

art100
Offline
Зарегистрирован: 09.03.2014

Круто. От надписи на заборе зависит дальность.

vlkam
Offline
Зарегистрирован: 17.02.2013

art100 пишет:
Круто. От надписи на заборе зависит дальность.

Не понял. Подробнее можешь ?

art100
Offline
Зарегистрирован: 09.03.2014

vlkam пишет:

art100 пишет:
Круто. От надписи на заборе зависит дальность.

Не понял. Подробнее можешь ?

 брелоки с алиэкспресса хуже работают чем ибеевские

Задорнов прав.

defezit
Offline
Зарегистрирован: 14.12.2014

 

Человек поделился своими наблюдениями а не слухами. Хотя я подозреваю что он прав. На ибее покупают пиндосы и Европа, для них по качественнее товар делают. Да и дороже там, что уже наводит на мысль про качество. Хотя может я и не прав:-) 

vlkam
Offline
Зарегистрирован: 17.02.2013

art100 пишет:
брелоки с алиэкспресса хуже работают чем ибеевские Задорнов прав.

Вообще то Задорнов не очень умный человек. А уж те, кто аппелирует к его юмористическим выступлениям - так просто идиоты.  Ничего личного, без обид.

Покупал совершенно одинаковые брелки на Ибее и Али.
На вид - не отличишь. На Ибее они по 5$ на Али оптом 100 штук по 2$
Соответственно они и работают. Ибеевский на 5, а Алишные на 2$
Потому что снаружи одинаковые, а внутри разные

Кстати, кому нужно, могу брелков отсыпать по 2$. У меня их штук 70 еще осталось.
 

art100
Offline
Зарегистрирован: 09.03.2014

vlkam пишет:

art100 пишет:
брелоки с алиэкспресса хуже работают чем ибеевские Задорнов прав.

Вообще то Задорнов не очень умный человек. А уж те, кто аппелирует к его юмористическим выступлениям - так просто идиоты.  Ничего личного, без обид.

Покупал совершенно одинаковые брелки на Ибее и Али.
На вид - не отличишь. На Ибее они по 5$ на Али оптом 100 штук по 2$
Соответственно они и работают. Ибеевский на 5, а Алишные на 2$
Потому что снаружи одинаковые, а внутри разные

Кстати, кому нужно, могу брелков отсыпать по 2$. У меня их штук 70 еще осталось.
 

много бУкАв ни о чем. Столько не осилю. Фото не вижу ни одного.

 

vlkam
Offline
Зарегистрирован: 17.02.2013

art100 пишет:
много бУкАв ни о чем. Столько не осилю. Фото не вижу ни одного.

Как ты вообще сюда попал то ? 
Я думал такие кадры только по сайтам приколов лазят
 

defezit
Offline
Зарегистрирован: 14.12.2014

Насчет отсыпать - далеко от Иваново?

art100
Offline
Зарегистрирован: 09.03.2014

vlkam пишет:

art100 пишет:
много бУкАв ни о чем. Столько не осилю. Фото не вижу ни одного.

Как ты вообще сюда попал то ? 
Я думал такие кадры только по сайтам приколов лазят
 

Библиотечку написал. Молодца. А фоточки платок с али или ебея нет . Это флуд ни о чем. Буду надеятся в библиотечке не прийдется порядок наводить.

 

vlkam
Offline
Зарегистрирован: 17.02.2013

defezit пишет:
Насчет отсыпать - далеко от Иваново?

Не, недалеко, Тула. Единственная проблема - как подумаю, что нужно для этого на почту идти, так сразу плохо становится. Меньше чем часом в очереди не отделаешься

vlkam
Offline
Зарегистрирован: 17.02.2013

art100 пишет:
А фоточки платок с али или ебея нет

Смотри начало топика

defezit
Offline
Зарегистрирован: 14.12.2014

Ну и ладно, была бы своя машина, я бы заехал по пути в Беларусь. Летом с женой поеду по золотому кольцу, похвалюсь своим бусом. Планирую ему мозги вставить ардуиновские :-)

vlkam
Offline
Зарегистрирован: 17.02.2013

defezit пишет:
Ну и ладно, была бы своя машина, я бы заехал по пути в Беларусь. Летом с женой поеду по золотому кольцу, похвалюсь своим бусом. Планирую ему мозги вставить ардуиновские :-)

Ну тогда свисни и заезжай, так тебе отсыплю.

inhelp
inhelp аватар
Offline
Зарегистрирован: 23.09.2012

Все работает )))

ludmila_off
Offline
Зарегистрирован: 29.01.2015

Здравствуйте! 
Подскажите, пожалуйста, можно ли запрограммировать HCS410 от MSP430F4618 на языке C(code composer)?
Если найдётся пару кусков кода, буду очень признательна.

Огромное спасибо.

 

4ishops
Offline
Зарегистрирован: 06.10.2012

inhelp пишет:

 

Все работает )))

 

Забавная железка, что это?

PS скетч расшарите?))

vlkam
Offline
Зарегистрирован: 17.02.2013

4ishops пишет:
Забавная железка, что это?

Присоединяюсь к вопросу, где это можно нарыть такой прикольный примопередатчик ?

gil_andrei
Offline
Зарегистрирован: 05.02.2015

Кто пробывал скеч с 1 поста! Загружаю на ардуино нану подключяю 2 пин на дата приемника открывае окно связи на ноуте! И нечиво перепробывал разные брелки! приемник 100% рабочий может чтото не так понял?

vlkam
Offline
Зарегистрирован: 17.02.2013

gil_andrei пишет:

Кто пробывал скеч с 1 поста! Загружаю на ардуино нану подключяю 2 пин на дата приемника открывае окно связи на ноуте! И нечиво перепробывал разные брелки! приемник 100% рабочий может чтото не так понял?

Дальше есть обновленный скетч, на прерываниях, возьми лучше его. В первом посте капризный

gil_andrei
Offline
Зарегистрирован: 05.02.2015

Пробывал чтото не как! а на окне манитора должно при включении чтото светится (каки ето надписи)

gil_andrei
Offline
Зарегистрирован: 05.02.2015

а подключяется на 2 не оналоговый пин?

gil_andrei
Offline
Зарегистрирован: 05.02.2015

а на какой плате вы пробывали этот скейч?

vlkam
Offline
Зарегистрирован: 17.02.2013

gil_andrei пишет:
а на какой плате вы пробывали этот скейч?

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

vlkam
Offline
Зарегистрирован: 17.02.2013

А скорость порта у тебя какая установлена ?

В примере скетча по умолчанию 9600 ставится

gil_andrei
Offline
Зарегистрирован: 05.02.2015

да 9600

 

 

gil_andrei
Offline
Зарегистрирован: 05.02.2015

Скинте пожалуйста ктото сылку на библиотеку HCS301 ато не грузится с 1 поста! Или сюда зарание блогадарен

dparhonin
Offline
Зарегистрирован: 19.02.2015

-удалено

Diman_NSK
Offline
Зарегистрирован: 07.04.2015

_

Diman_NSK
Offline
Зарегистрирован: 07.04.2015

Уважаемый vlkam, подскажите пожалуйста, а скейтч на прерываниях - ему же библиотека никакая не требуется? По меньшей мере в тексте include не увидел. Если можно ещё библиотеку hcs301.rar - скиньте плиз на почту 0111@mail.ru
Спасибо.

SilverS
Offline
Зарегистрирован: 08.05.2015

Уважаемый Vlkam, очень нужна ваша консультация о реальности воплощения одного проекта, связанного со сканированием и записью динамического кода. Отправьте мне, пожалуйста, сообщение на почту ODenisova собака mail.ru, я опишу идею. Буду признательна за критику и комментарии. Заранее спасибо!

fuckduino
Offline
Зарегистрирован: 02.11.2015

Переписал этот код под экранчик Nokia и запоминание в EEPROM.

Много полезного, менюшка например.



/*
 * ATMEGA 328P
 * Соединить ноги
 * 7-20-21
 * 8-22
 * 
 * Дисплей NOKIA  –  328P
 * 1 RST             13
 * 2 CE              14
 * 3 DC              15
 * 4 DIN             17
 * 5 CLK             19 
 * 6 VCC             7 
 * 7 LIGHT           2
 * 8 GND             8
 * 
 * КНОПКИ           328P
 * GND              8
 * buttonpin1       4
 * buttonpin2       5
 * 
 * ПРИЕМНИК SRX882  328P
 * GND              8
 * DATA             12
 * CS               7  
 * VCC              7
 * 
 * ПЕРЕДАТЧИКSTX882 2328P
 * DATA             11
 * VCC              7
 * GND              8
 * 
 * ПИЩАЛКА          328P
 * -                8
 * -                16
 * 
 * USBASP           328P
 * GND              8
 * VCC              7
 * MOSI             17  
 * RST              1
 * SCK              19
 * MISO             18
 * 
 * СВЕТОДИОДЫ       328P
 * GND              8
 * СИНИЙ            6
 * КРАСНЫЙ          3
 * ЗЕЛЕНЫЙ          12         //ОТКЛЮЧАТЬ ПРИ ПРОШИВКЕ
 * 
 * Правильные Фьюзы по программе AVRFuses, которые должны быть включены. Остальные выключены!
 * Brown-Out Detector trigger level : Brown-out detection disabled 
 * Serial program downloading (SPI) enabled
 * Preserve EEPROM through Chip Erase cycle
 * Select boot size: Boot Flash size = 256 words start address=$S3F00
 * Boot Reset vector Enabled
 * Select clock Source: Int RC Osc 8 MHz; Start-up time PWRDWN/RESET: 6CK/14CK + 0 ms
 * 
 * В ардуино добавить репозитории плат: https://raw.githubusercontent.com/carlosefr/atmega/master/package_carlos...,
 * Библиотеки:
 * https://github.com/adafruit/Adafruit-GFX-Library
 * https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library
 * 
 */

#include <EEPROM.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
//Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);  //software spi
Adafruit_PCD8544 display = Adafruit_PCD8544(9, 8, 7); //harware spi

#define txPin 5       //передатчик
#define rxPin 6       //приемник
#define signalPin 10  //пищалка
#define buttonPin1 2
#define buttonPin2 3
#define lightPin 0    //подсветка, выкл - HIGH, вкл - LOW
#define greenLight 12 //Светодиоды
#define redLight 1
#define blueLight 4
int lightState;       //состояние подсветки
int lastRxValue = 0;
int tempRxValue = 0;
unsigned long lastRxTime = 0;
unsigned long tempTime = 0;
unsigned long difTime = 0;
unsigned long lastJoyTime = 0;
unsigned long tempJoyTime = 0;
unsigned long difJoyTime = 0;
boolean bValidPacket = false;
int keelog_state = 0;
int keelogCounter = 0;
byte keelog_code[9];  //последний пойманный код или код для передачи

const int chipSelect = 4;  //дисплей
int kpress;                //управление меню
int kpress2;

int decodeMethod = EEPROM.read(1023);   //считывает метод передачи, прямой или инвертированный
int currentMemory = EEPROM.read(1022);
int address = 0;  //eeprom
byte value;       //eeprom
int slots = 50;

void toggleDecodeMethod() {         //переключатель метода декодирования
  if (decodeMethod == 1) {          //прямой
    decodeMethod = 0;
    display.setCursor(5, 40);
    display.print("Straight");
    display.display();
  } else if (decodeMethod == 0) {   //обратный
    decodeMethod = 1;
    display.setCursor(5, 40);
    display.print("Reverse");
    display.display();
  } else
  { decodeMethod = 0;               //в eeprom был неправильный и переключаем на обратный
    display.setCursor(0, 40);
    display.print("Was wrong, Reverse");
    display.display();
  }
  EEPROM.update(1023, decodeMethod);//записать в eeprom
}
void displayDecodeMethod() {        //отобразить метод декодирования
  display.setTextColor(WHITE, BLACK);
  display.print("Dec:");
  if (decodeMethod == 1) {
    display.print("Rev");
  }
  else if (decodeMethod == 0) {
    display.print("Fro");
  }
  else {
    display.print("Wro");
  }
  display.display();
}
void send_meander(int time) {       //посылка преамбулы
  digitalWrite(txPin, HIGH);
  delayMicroseconds(time);
  digitalWrite(txPin, LOW);
  delayMicroseconds(time);
}
void showCode() {                   //показать код на экране с комментариями
  display.clearDisplay();
  display.setCursor(0, 0);
  for (int i = 0; i < 9; i++) {
    display.print(keelog_code[i], HEX);
    if (i == 3) {
      display.println("-hop");
    }
    if (i == 6) {
      display.println("-fix");
    }
    if (i == 7) {
      display.print("-btn ");
    }
    if (i == 8) {
      display.println("-dop");
    }
  }
  display.display();
}
void eepromread(int address) {      //считать код из памяти
  display.clearDisplay();
  display.print("Cell:");
  display.println(address);         //какой код сейчас считываем
  display.print( "Mem:");
  display.println(currentMemory);   //сколько всего кодов в памяти записано
  for (int i = 0; i < 10; i++) {
    value = EEPROM.read(address * 10 + i);
    display.print(value, HEX);
    if (i == 3) {
      display.println("-hop");
    }
    if (i == 6) {
      display.println("-fix");
    }
    if (i == 7) {
      display.print("-btn ");
    }
    if (i == 8) {
      display.println("-dop");
    }
    if (i == 9) {
      display.println("-flag");
    }
  }
  display.display();                //дисплей выводит информацию, которая сформирована выше по этой команде
  for (int i = 0; i < 9; i++) {
    keelog_code[i] = EEPROM.read(address * 10 + i); //записать в переменную считанный код, чтобы его можно было отправить
  }
}
void manageMemory(byte gotCode[8]) { //записываем новый код в новую ячейку
  for (int i = 0; i < 9; i++) {
    EEPROM.update(currentMemory * 10 + i, gotCode[i]);
  }
  currentMemory++;
  EEPROM.update(1022, currentMemory); //записываем количество кодов в память
  //  }
}

void keelog_vardump() {             //старая функция для записи и отображения полученного кода
  manageMemory(keelog_code);
  showCode();
  alarm();
  keelog_state = 0;
}

void keelog_send(byte* keelog_code) {     //отправка
  showCode();
  for (int i = 0; i < 11; i++) {          //посылаем преамблу
    send_meander(400);
  }
  //посылаем хедер
  digitalWrite(txPin, HIGH);              //включает передатчик
  delayMicroseconds(400);
  digitalWrite(txPin, LOW);               //выключает передатчик
  delayMicroseconds(4000);

  for ( int i = 0; i < 9; i++) {          //посылает код
    if (decodeMethod == 1) {              //обратное декодирование
      for (int i2 = 7; i2 >= 0; i2--) {   //считывает в бинарном виде код, начиная справа
        if (bitRead(keelog_code[i], i2)) {//если 1
          digitalWrite(txPin, HIGH);
          delayMicroseconds(400);
          digitalWrite(txPin, LOW);
          delayMicroseconds(2 * 400);
        }
        else {                            //если 0
          digitalWrite(txPin, HIGH);
          delayMicroseconds(2 * 400);
          digitalWrite(txPin, LOW);
          delayMicroseconds(400);
        }
      }
    }
    else {
      for (int i2 = 0; i2 < 8; i2++) {    //прямое декодирование
        if (!bitRead(keelog_code[i], i2)) {//если 0 !!! проверить, почему здесь наоборот!!!
          digitalWrite(txPin, HIGH);
          delayMicroseconds(400);
          digitalWrite(txPin, LOW);
          delayMicroseconds(2 * 400);
        }
        else {                            //если 1
          digitalWrite(txPin, HIGH);
          delayMicroseconds(2 * 400);
          digitalWrite(txPin, LOW);
          delayMicroseconds(400);
        }
      }
    }
  }
  display.setCursor(0, 40);              //написать сообщение, что отправлено
  display.setTextColor(WHITE, BLACK);    //белый текст на черном фоне 
  display.print("Sent");
  display.display();
  alarm();                               //пикнуть
}
void keelog_get() {                       //ловит код
  bValidPacket = false;
  if (keelog_state == 0) { //ждем преамбулу и хедер
    if (difTime > 280 && difTime < 620 && lastRxValue != tempRxValue) {
      keelogCounter ++;
    }
    else {
      if (keelogCounter == 23) {
        digitalWrite(blueLight, HIGH);
        if (difTime > 2800 && difTime < 6200 && lastRxValue == 0) {
          keelog_state = 1;
        }
      }
      keelogCounter = 0;
      digitalWrite(blueLight, LOW);
    }
  }
  else if (keelog_state == 1) { // получаем биты
    if (difTime > 560 && difTime < 1240 && lastRxValue == 1) { // получили 1
      if (decodeMethod == 0) {
        keelog_code[round(keelogCounter / 8)] = (keelog_code[round(keelogCounter / 8)] >> 1) | B10000000;
      }
      else {
        keelog_code[round(keelogCounter / 8)] = (keelog_code[round(keelogCounter / 8)] << 1) | B00000000;
      }
      bValidPacket = true;
    }
    else if (difTime > 280 && difTime < 620 && lastRxValue == 1) {
      if (decodeMethod == 0) {
        keelog_code[round(keelogCounter / 8)] = (keelog_code[round(keelogCounter / 8)] >> 1) | B00000000;
      }
      else {
        keelog_code[round(keelogCounter / 8)] = (keelog_code[round(keelogCounter / 8)] << 1) | B00000001;
      }
      bValidPacket = true;
    }
    else if (lastRxValue == 0) {
    }
    else {
      keelog_state = 1;
      keelogCounter = 0;
    }

    if (bValidPacket) {
      keelogCounter++;
      if (keelogCounter == 66) {
        keelog_vardump();
        keelogCounter = 0;
        keelog_state = 0;
        alarm();
      }
    }
  }
}

void displayvcc() {                             //показать напряжение
  display.setTextColor(BLACK, WHITE);
  display.print( readVcc(), DEC );
  display.print("mV");
  display.display();
}
long readVcc() {                                 //считать напряжение
  long result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA, ADSC));
  result = ADCL;
  result |= ADCH << 8;
  result = 1126400L / result; // Back-calculate AVcc in mV
  return result;
}

void buttons() {                                 //меню
  String menuitems[] = {"Last", "Decode", "Read_eeprom", "Flag/Unflag", "Light", "Exit"};
  static unsigned long last_interrupt_time = 0;  //устранение дребезжания кнопок
  unsigned long interrupt_time = millis();
  if (interrupt_time - last_interrupt_time > 150)
  {
    if (!digitalRead(buttonPin1)) {               //при нажатии кнопки вывести меню
      //    alarm();
      kpress = (kpress + 1) % 6;                  //считает, какой пункт меню выбран
      display.clearDisplay();
      display.setCursor(60, 0);
      display.setTextColor(WHITE, BLACK);
      display.print("MENU");
      display.display();
      display.setCursor(0, 0);
      display.setTextColor(BLACK, WHITE);
      for (int i; i < 7; i++)
      {
        if (i == kpress)                            
        {
          display.setTextColor(WHITE, BLACK);   //если выбран данный пункт меню, сделать белый текст на черном фоне
        }
        display.println(menuitems[i]);              
        display.setTextColor(BLACK, WHITE);
      }
      display.setCursor(42, 8);
      displayDecodeMethod();
      display.display();
    }

    if (!digitalRead(buttonPin2)) {           //кнопка2, выполнит выбранный пункт меню
      alarm();
      if (kpress == 0) {                      //послать
        keelog_send(keelog_code);
      }
      if (kpress == 1) {                      //переключить декодер
        toggleDecodeMethod();
      }
      if (kpress == 2) {                      //считать из памяти
        eepromread(kpress2);                  //в памяти записано, на чем мы остановились
        kpress2 = (kpress2 + 1) % 100;        
      }
      if (kpress == 3) {                      //поставить флаг
        flagUnflag();
      }
      if (kpress == 4) {                      //вкл/выкл подсветки
        toggleLight();
      }
      if (kpress == 5) {                      //сбросить

        kpress2 = 0;                    
      }
    }
    display.setCursor(43, 0);
    display.println(kpress);
    if (kpress2 < 10) {
      display.setCursor(79, 16);
    } else {
      display.setCursor(72, 16);
    }
    display.println(kpress2);
    display.setCursor(48, 40);
    displayvcc();                             //показать напряжение
    display.display();
    /*                                        //если подключен трехцветный светодиод, показать пункт меню цветом
    if (kpress == 0) {digitalWrite(redLight, HIGH);digitalWrite(blueLight, LOW);digitalWrite(greenLight, LOW);}
    if (kpress == 1) {digitalWrite(redLight, HIGH);digitalWrite(blueLight, HIGH);digitalWrite(greenLight, LOW);}
    if (kpress == 2) {digitalWrite(redLight, HIGH);digitalWrite(blueLight, HIGH);digitalWrite(greenLight, HIGH);}
    if (kpress == 3) {digitalWrite(redLight, LOW);digitalWrite(blueLight, HIGH);digitalWrite(greenLight, HIGH);}
    if (kpress == 4) {digitalWrite(redLight, LOW);digitalWrite(blueLight, LOW);digitalWrite(greenLight, HIGH);}
    if (kpress == 5) {digitalWrite(redLight, HIGH);digitalWrite(blueLight, LOW);digitalWrite(greenLight, HIGH);}
    */
  }
  last_interrupt_time = interrupt_time;
}


void alarm() {                              //пищалка
  tone(signalPin, 3500, 50);
  //noTone(signalPin);                    
  //noTone(redLight);
  //noTone(blueLight);
  //noTone(greenLight);
  //  tone(redLight, 2, 500);               //мигалка
}
void blueAlarm() {                          //еще одна мигалка
  noTone(signalPin);
  noTone(redLight);
  noTone(blueLight);
  noTone(greenLight);
  tone(blueLight, 2, 1000);
}

void toggleLight() {                        //переключатель подсветки
  if (lightState == 0) {
    digitalWrite(lightPin, HIGH);
    lightState = 1;
  } else {
    digitalWrite(lightPin, LOW);
    lightState = 0;
  }
}
void flagUnflag() {                         //пометить флагом
  int flagValue = EEPROM.read(kpress2 * 10 + 9);
  if (flagValue == 0)
  {
    flagValue = 1;
    display.setCursor(77, 24);
    display.setTextColor(WHITE, BLACK);
    display.print("0");
    display.display();
  } else if (flagValue == 1) {
    flagValue = 0;
    display.setCursor(77, 24);
    display.setTextColor(WHITE, BLACK);
    display.print("1");
    display.display();
  } else
  {
    flagValue = 0;
    display.setCursor(77, 24);
    display.setTextColor(WHITE, BLACK);
    display.print("0");
    display.display();
  }
  EEPROM.update(kpress2 * 10 + 9, flagValue);
}

void loop() {                         //основной луп, ничего тут менят не нужно, перестанет ловить
  tempRxValue = digitalRead(rxPin);
  if (tempRxValue != lastRxValue) {
    tempTime = micros();
    difTime = tempTime - lastRxTime;
    keelog_get();
    lastRxTime = tempTime;
    lastRxValue = tempRxValue;
  }
}
void setup() { 
  display.begin();                          //инициализация дисплея
  pinMode(buttonPin1, INPUT_PULLUP);        //внутренний резистор для кнопок
  pinMode(buttonPin2, INPUT_PULLUP);
  pinMode(lightPin, OUTPUT);                //подсветка
  digitalWrite(lightPin, HIGH);             //выключить подсветку при включении схемы
  attachInterrupt(0, buttons, FALLING);     //прерывание для кнопок, чтобы меню работало вне зависимости от того, что сейчас происходит
  attachInterrupt(1, buttons, FALLING);
  display.setContrast(60);                  //контрастность (настраивайте в зависимости от батарейки
  display.clearDisplay();                 
  display.setTextSize(1);
  display.setTextColor(BLACK);
  pinMode(txPin, OUTPUT);                   //передатчик
  pinMode(rxPin, INPUT);                    //приемник
  pinMode(signalPin, OUTPUT);               //пищалка
  pinMode(blueLight, OUTPUT);               //светодиоды
  pinMode(redLight, OUTPUT);
  pinMode(greenLight, OUTPUT);
  lastRxValue = digitalRead(rxPin);       
  lastRxTime = micros();
  blueAlarm();
  displayvcc();
  displayDecodeMethod();
  EEPROM.update(1022, 0);                   //при первом запуске выставить 0 ячейку памяти. один раз прошьете с этим параметром, потом закомментируйте и прошейте еще раз
}

 

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Вот в протезе 

victorv
Offline
Зарегистрирован: 31.07.2015

не работает скетч, и дисплей вроде как не правильно подключен на рисунке, или я что то не понимаю ?

victorv
Offline
Зарегистрирован: 31.07.2015

может дисплей я не так подключил - у меня так

 Дисплей NOKIA  –  328P
 * pin 7 - Serial clock out (SCLK)
* pin 6 - Serial data out (DIN)
* pin 5 - Data/Command select (D/C)
* pin 4 - LCD chip select (CS)
* pin 3 - LCD reset (RST)

 

Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);  //software spi

 

кнопками не работает но когда еле дотрагиваюсь до пинов аурдиновских с выводом на дисплей -само открывается меню

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

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

Я менял пины в этой строке :

Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);  //software spi  

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

У автора в начале скетча есть коментарий в котором описаны выводы экрана-единственное он ставил номера не цифровых портов ардуино,а номера ног процессора

* Дисплей NOKIA  –  328P
008  * 1 RST             13
009  * 2 CE              14
010  * 3 DC              15
011  * 4 DIN             17
012  * 5 CLK             19
013  * 6 VCC             7
014  * 7 LIGHT           2
015  * 8 GND             8

Вот строка автора Adafruit_PCD8544 display = Adafruit_PCD8544(9, 8, 7); //harware spi

victorv
Offline
Зарегистрирован: 31.07.2015

[цитата = fly245]

У автора в начале скетча есть коментарий в котором описаны выводы экрана-единственное он ставил номера не цифровых портов ардуино, а номера ног процессора

* Дисплей NOKIA - 328P
008  * 1 RST 13
009  * 2 CE 14
010  * 3 постоянного тока 15
011  * 4 DIN 17
012  * 5 CLK 19
013  * 6 VCC 7
014  * 7 СВЕТ 2
015  * 8 GND 8

Вот строка автора  Adafruit_PCD8544 дисплей = Adafruit_PCD8544 (9, 8, 7);  // Harware SPI

[/ цитата]

 

да все работает, эт я не разобрался . Проблема - при наведении в меню на exit - не выходит из меню .

BigVan
Offline
Зарегистрирован: 08.12.2013

Подскажите каким приёмником можно принимать сигналы с радиопультов (433.92МГцот RGB контроллеров?

Мне тут подсказали, что обычные приёмники не подойдут http://www.ebay.com/itm/433Mhz-RF-transmitter-receiver-link-kit-for-Arduino-ARM-MC-U-remote-control-/201108260404

Так ли это?

fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Должен принять.Там обычно статический код.Берем ардуино ,приемник на 433 и библиотеку RCSWICH 

BigVan
Offline
Зарегистрирован: 08.12.2013
fly245, увы, не хочет декодировать коды сигналов от RGB пульта.. Хотя приёмник принимает сигнал - светодиод, подключённый к выходу приёмника, реагирует..
Пробовал библиотеки:
NewRemoteSwitch
RC-switch
RemoteSwitch
 
 
fly245
fly245 аватар
Offline
Зарегистрирован: 25.08.2013

Надо осциллограму снимать и сравнивать с осциллограмами статических кодировок

PM007
Offline
Зарегистрирован: 09.05.2016

Светодиод может моргать и на помехи...

А каким скетч использовали?

PM007
Offline
Зарегистрирован: 09.05.2016

Прошу сведающих поправить меня если я ошибаюсь...

Мне попался пульт который имеет перевернутый код тоесть сначало идет прыгающий, потом серийник, кнопки, флаги...

И получается что данные из кода пост #12 отображаются не коректно...

Но при этом от работает...

Что бы получить последовательность которая отвечает сигналу, нанные пришлось перевернуть, тоесть сначала поставил последние биты а в конце первые...