Прошу помочь в изменение скетча

rossolimo
Offline
Зарегистрирован: 24.10.2016

Народ помогите преобразовать скетч, чтобы вместо посылки команды "w" была возможность отсылать 3 команды к примеру "1", "2", "3".

и в соответсивии с эти выполнялась команда на запись ключа "1" идет запись 0x01, 0x86, 0xF1, 0x04, 0x12, 0x00, 0x00, 0x05; "2"  0x01, 0x86, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF;  "3"  0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00.

 

Сам скетч:

 // Based on https://danman.eu/blog/cloning-ibutton-using-rw1990-and-avr/
// and: http://elimelecsarduinoprojects.blogspot.com/2013/06/read-dallas-ibutton...
// By Swift Geek 28-08-2015
// TODO: danger to atmega328! Use OpenCollector logic!
// Used 4.8kΩ Pull-up and 3.1 Vcc for arduino/pull-up

#include <OneWire.h>
#define pin 10

OneWire ibutton (pin); // I button connected on PIN 2.

byte addr[8]; //array to store the Ibutton ID.

void setup(){
 Serial.begin(115200); 
}

void loop(){
  if (!ibutton.search (addr)){//read attached ibutton and asign value to buffer
    ibutton.reset_search();
    delay(200);
    return;
 }
 
  Serial.print(millis()/1000);
  Serial.print("> ");
  for (byte x = 0; x<8; x++){  
    Serial.print(addr[x],HEX); //print the buffer content in LSB. For MSB: for (int x = 8; x>0; x--) 
     Serial.print(" ");
  }
 
  //compute crc//
  byte crc;
  crc = ibutton.crc8(addr, 7);
  Serial.print("CRC: ");
  Serial.println(crc,HEX);
  if ( Serial.read() == 'w' ){
    ibutton.skip();ibutton.reset();ibutton.write(0x33);
    Serial.print("  ID before write:");
    for (byte x=0; x<8; x++){
      Serial.print(' ');
      Serial.print(ibutton.read(), HEX);
    }
    // send reset
    ibutton.skip();
    ibutton.reset();
    // send 0xD1
    ibutton.write(0xD1);
    // send logical 0
    digitalWrite(10, LOW); pinMode(10, OUTPUT); delayMicroseconds(60);
    pinMode(10, INPUT); digitalWrite(10, HIGH); delay(10);
    
    Serial.print('\n');
    Serial.print("  Writing iButton ID:\n    ");
    // Hardcode here your desired ID //
    // 01 D5 9F DC 02 00 00 96
    byte newID[8] = {0x01, 0x86, 0xF1, 0x04, 0x12, 0x00, 0x00, 0x05};
                     
    ibutton.skip();
    ibutton.reset();
    ibutton.write(0xD5);
    for (byte x = 0; x<8; x++){
      writeByte(newID[x]);
      Serial.print('*');
    }
    Serial.print('\n');
    ibutton.reset();
    // send 0xD1
    ibutton.write(0xD1);
    //send logical 1
    digitalWrite(10, LOW); pinMode(10, OUTPUT); delayMicroseconds(10);
    pinMode(10, INPUT); digitalWrite(10, HIGH); delay(10);

  }
} 

int writeByte(byte data){
  int data_bit;
  for(data_bit=0; data_bit<8; data_bit++){
    if (data & 1){
      digitalWrite(pin, LOW); pinMode(pin, OUTPUT);
      delayMicroseconds(60);
      pinMode(pin, INPUT); digitalWrite(pin, HIGH);
      delay(10);
    } else {
      digitalWrite(pin, LOW); pinMode(pin, OUTPUT);
      pinMode(pin, INPUT); digitalWrite(pin, HIGH);
      delay(10);
    }
    data = data >> 1;
  }
  return 0;
}

 

fogary
Offline
Зарегистрирован: 05.03.2016

Т. е. в зависимости от полученной команды ("1", "2" или "3") менялось значение в строке 57?

В строках 38-42 что-то будет меняться в зависимости от полученной команды ("1", "2" или "3") или нет?

rossolimo
Offline
Зарегистрирован: 24.10.2016

fogary пишет:

Т. е. в зависимости от полученной команды ("1", "2" или "3") менялось значение в строке 57?

В строках 38-42 что-то будет меняться в зависимости от полученной команды ("1", "2" или "3") или нет?

 

да и шла запись того или иного ключа

37
  if ( Serial.read() == 'w' ){

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

fogary
Offline
Зарегистрирован: 05.03.2016

rossolimo пишет:

да и шла запись того или иного ключа

37
  if ( Serial.read() == 'w' ){

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

Я имел ввиду, что если вместо 'w' будет стоять '1' - код "0x33" в функции "ibutton.write(0x33);" поменяется?

Если нет, то строку 37 заменяете на:

char new_data = Serial.read();
if ( new_data == '1' || new_data == '2' || new_data == '3' ){

строку 57 на:

byte newID[8];
switch (new_data) {
  case '1': newID = {0x01, 0x86, 0xF1, 0x04, 0x12, 0x00, 0x00, 0x05};
    break;
  case '2': newID = {0x01, 0x86, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
    break;
  case '3': newID = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
    break;
}

 

rossolimo
Offline
Зарегистрирован: 24.10.2016
Arduino: 1.6.12 (Windows 7), Плата:"Arduino Nano, ATmega328"

C:\Windows\Temp\arduino_modified_sketch_941242\sketch_oct25a.ino: In function 'void loop()':

sketch_oct25a:60: error: assigning to an array from an initializer list

   case '1': newID = {0x01, 0x86, 0xF1, 0x04, 0x12, 0x00, 0x00, 0x05};

                   ^

sketch_oct25a:62: error: assigning to an array from an initializer list

   case '2': newID = {0x01, 0x86, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

                   ^

sketch_oct25a:64: error: assigning to an array from an initializer list

   case '3': newID = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

                   ^

Несколько библиотек найдено для "OneWire.h"
 Используется: C:\Users\Admin\Documents\Arduino\libraries\OneWire
Не используется: C:\Users\Admin\Desktop\Aeduino\libraries\OneWire
exit status 1
assigning to an array from an initializer list

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"

 

 

rossolimo
Offline
Зарегистрирован: 24.10.2016

проблема запись едет но проблема во второй части кода где выбор ключей

byte newID[8];
switch (new_data) {
  case '1': newID = {0x01, 0x86, 0xF1, 0x04, 0x12, 0x00, 0x00, 0x05};
    break;
  case '2': newID = {0x01, 0x86, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
    break;
  case '3': newID = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
    break;
}

 

rossolimo
Offline
Зарегистрирован: 24.10.2016

я в написаниях скетчей не селен, но можно сделать по такому примеру:

к примеру 57 строка 

    byte newID[8] = {new_data};

организовать через функцию if (c привязкой прочитанного в сериале)?