Создаю электронный CW ключ (морзе) с памятью

Тема в разделе "Технологии радиолюбителя", создана пользователем Dimasik_23, 4 фев 2017.

  1. Dimasik_23

    Dimasik_23 Нерд

    Добрый день.

    Создаю CW ключ морзе с памятью. Есть массив в который записывается нажатия 1й или 2й кнопки (1 или 2), и по задумке после 10ти нажатий эта последовательность символов улетает в EEPROM в определённую ячейку.

    Вопросик:
    Массив работает, но при каждой интерации цикла for записывается новая цифра, а надо чтоб сразу 10ть символов улетела в память.
    (примерно такого вида нужно EEPROM.writeLong(addrEeprom, 1212121211) а к сожалению записывается последняя цифра массива "1")
    Как правильно организовать запись массива в память?
    Заранее благодарю!
    Код (C++):
    #include <EEPROMex.h>
    #include "Arduino.h"

    word addrEeprom = 6;
    unsigned long buf[10];
    #define KLUCH_TOCHKA A3 //PB4 точка
    #define KLUCH_TERE A4    //PB5 тере

    void setup() {
       unsigned long output = EEPROM.readLong(addrEeprom); //смотрим что записали
       Serial.print(output);
       Serial.println();
    }

    void loop() {
    //определяем что нажали
    if((analogRead(KLUCH_TOCHKA)/4 > 250) && (analogRead(KLUCH_TERE)/4 <= 0)){ //нажали на точку
      delay(100);
      tmp_Tochka_Tere_int = 1; // в переменную указываем что нажали на точку
    }

    if((analogRead(KLUCH_TERE) > 250) && (analogRead(KLUCH_TOCHKA) <= 0)){ //нажали на тере
      delay(100);
      tmp_Tochka_Tere_int = 2; // в переменную указываем что нажали на тере
    }

    if(tmp_Tochka_Tere_int != 0){ //если что-то нажали точку или тере то в массиве записываем это
      buf[schetchik++] = tmp_Tochka_Tere_int; //прибавляем счётчик при каждом нажатии точки или тере
      if(schetchik == maxSimvol){             //считаем, когда максимум то записываем набранное
        for(int b=0; b < 10; b++){                
          EEPROM.writeLong(addrEeprom, buf[b]);  //пишем код                
          tone(BEEP_Pin, BEEP_Tone, 100);        //пикаем после записи
          //Serial.println(int(buf[b]));
        }
        schetchik = 0;
      }
    }
    tmp_Tochka_Tere_int = 0; //обнуляем переменную
    }
     
  2. rkit

    rkit Гуру

    Вы записываете десять чисел, а считываете только одно.
    Недавно была тема, где разжевали работу с EEPROM и массивами, поищите.
     
  3. лонг занимает 4 байта, при записи адрес нужно сдвигать
     
  4. Dimasik_23

    Dimasik_23 Нерд

    так, так, так...... ребята.... очень интересно.... а чуть-чуть поподробнее...... пожалуйста....
     
  5. ostrov

    ostrov Гуру

    put и get работают с любым типом данных, и с массивом и со структурой, удобно.
     
  6. Dimasik_23

    Dimasik_23 Нерд

    да-да... Я читал Ваше сообщение на подобную тему, но поверьте я испробовал довольно много предложенного в примерах этого сайта. Но мне нужна именно свежая идея, ну или пример направленный на решение данной проблемы..... Благодарю...
     
  7. ostrov

    ostrov Гуру

    Свежая или работоспособная? И что то не помню когда я отдельно писал про работу с EEPROM.
     
  8. Dimasik_23

    Dimasik_23 Нерд

    да были у Вас мысли в статейке QUOTE]Счетчик ресурса с EEPROM[/QUOTE]
    Но мне бы не хотелось лить воду, а выслушать Ваши советы по решению проблемы....
    Заранее благодарю..
     
    Последнее редактирование: 5 фев 2017
  9. Dimasik_23

    Dimasik_23 Нерд

    Все! Разобрался!
    Вот может кому и пригодится. Использовал стандартную библиотеку :#include <EEPROMex.h>

    Приведён пример на все случаи жизни:
    Код (C++):
    /*
    * EEPROMEx
    *
    * Demonstrates reading, writing and updating data in the EEPROM
    * to the computer.
    * This example code is in the public domain.
    */


    #include <EEPROMex.h>

    #include "Arduino.h"
    void issuedAdresses();
    void readAndWriteByte();
    void readAndWriteInt();
    void readAndWriteLong();
    void readAndWriteFloat();
    void updateAndReadDouble();
    void writeAndReadCharArray();
    void writeAndReadByteArray();
    void waitUntilReady();
    void errorChecking(int adress);
    void setup();
    void loop();
    const int maxAllowedWrites = 80;
    const int memBase          = 350;

    int addressByte;
    int addressInt;
    int addressLong;
    int addressFloat;
    int addressDouble;
    int addressByteArray;
    int addressCharArray;

    //**** не влез весь код*****************************************************************

    // Test reading and updating a string (char array) to EEPROM
    void writeAndReadCharArray() {
        Serial.println("---------------------------------");    
        Serial.println("writing and reading a char array");    
        Serial.println("---------------------------------");    
       
        char input[] = "Arduino";
        char output[] = "       ";

        EEPROM.writeBlock<char>(addressCharArray, input, 7);
        EEPROM.readBlock<char>(addressCharArray, output, 7);

        Serial.print("adress: ");
        Serial.println(addressCharArray);
        Serial.print("input: ");
        Serial.println(input);
        Serial.print("output: ");
        Serial.println(output);
        Serial.println("");
    }

    void writeAndReadByteArray() {

        Serial.println("---------------------------------");    
        Serial.println("updating and reading a byte array");    
        Serial.println("---------------------------------");    
       
        int itemsInArray = 7;
        byte initial[] = {1, 0, 4, 0, 16, 0 , 64 };
        byte input[]   = {1, 2, 4, 8, 16, 32, 64 };  
        byte output[sizeof(input)];

        EEPROM.writeBlock<byte>(addressByteArray, initial, itemsInArray);
        int writtenBytes = EEPROM.updateBlock<byte>(addressByteArray, input, itemsInArray);
        EEPROM.readBlock<byte>(addressByteArray, output, itemsInArray);

        Serial.print("input: ");
        for(int i=0;i<itemsInArray;i++) { Serial.print(input[i]); }
        Serial.println("");
       
        Serial.print("output: ");
        for(int i=0;i<itemsInArray;i++) { Serial.print(output[i]); }
        Serial.println("");
       
        Serial.print("Total of written bytes by update: ");
        Serial.println(writtenBytes);  
        Serial.println("");
    }
    //**** не влез весь код*****************************************************************


     
     
    mcureenab нравится это.