Создание файла с динамическим именем. Библиотека SD

тогда, тут(в С++) тебе делать нечего. Интерпретаторы - потолок твоей карьеры.

Объем - это в КиБ, там есть 0.7, 0.5 и 0.33 :wink: Кроме того - почему 7? А если еще раз код посмотреть и собственно название функции?

ну спасибо конечно, но хотелось бы разобраться

ArcticFox а мой метод еще не пробовали ?

Хорошо, что сделал нам одолжение. Мы весьма признательны.

“Код” это пример, который компилируется и запускается, показывая проблему. Не вся простыня с твоими “нетленками”, а небольшая программа, которую можно собрать и загрузить в реальный контроллер (или в Вокви) и убедиться в наличии того, о чем задан вопрос. Иначе не ясно где и что ты накосячил. То, что накосячил - очевидно, так как спрашиваешь и не можешь разобраться сам.

именно ваш и попробовал

tmkey = tmkey.substring(0, 8);

не создается

а можно без сарказма этого?

нет. Ты же не платишь деньгами за ответы, значит плата взимается тем, что ты нас веселишь. Что-то не так? :wink:

По делу:

  1. выведи в консоль (Serial.println() ) имя файла, до вызова SD.open().
  2. хорошо бы обрабатывать ошибки открытия файла для записи. Возможно узнаешь что-то новое.

вариант для ленивых

#include "Keypad.h"
#include <OneWire.h>
#include <SPI.h>
#include <SD.h>

byte addr[8];
OneWire ibutton(A1);

Sd2Card card;
SdVolume volume;
SdFile root;

bool ENGMODE_ADDKEY = false;  // false - режим проверки, true - режим добавления
bool ENGMODE_DELKEY = false;
bool CODECALL_WAIT = false;
String acesskey;
String tmkey;

const byte ROWS = 4;
const byte COLS = 3;
char hexaKeys[ROWS][COLS] = {
  {'3','2','1'}, 
  {'6','5','4'},
  {'9','8','7'},
  {'K','C','0'}
};

byte rowPins[ROWS] = {8, 9, 3, 4}; 
byte colPins[COLS] = {5, 6, 7}; 

Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup(){
  pinMode(A0, OUTPUT);
  Serial.begin(9600);
  
  if (!SD.begin(10)) {
    tone(A0, 800);
    delay(300);
    noTone(A0);
    delay(80);
    tone(A0, 500);
    delay(80);
    noTone(A0);
    delay(80);
    tone(A0, 500);
    delay(80);
    noTone(A0);
    return;
  } else {
    tone(A0, 800);
    delay(1000);
    noTone(A0);
    delay(80);
    tone(A0, 500);
    delay(80);
    noTone(A0);
  }
  
  File acesskeyCMD = SD.open("acesskey.txt");
  if (acesskeyCMD) {
    while (acesskeyCMD.available()) {
      acesskey += (char)acesskeyCMD.read();
    }
    acesskeyCMD.close();
    Serial.println(acesskey);
  } else {
    Serial.println("error opening acesskey.txt");
  }
}

void loop(){
  char customKey = customKeypad.getKey();
  
  if (customKey){
    if(customKey == 'K') {
      Serial.println("Mode: ADD KEY");
      ENGMODE_ADDKEY = true;
      tone(A0, 800, 200);
    } else if(customKey == 'C') {
      Serial.println("Mode: CHECK KEY");
      ENGMODE_ADDKEY = false;
      tone(A0, 500, 200);
    } else {
      Serial.println(customKey);
      tone(A0, 815, 100);
    }
    delay(500);
  }
  
  readKey();
}

void readKey() {
  if (ibutton.search(addr)) {
    tmkey = "";
    
    for (int i = 7; i > -1; i--) {
      if (addr[i] < 0x10) {
        tmkey += "0";
      }
      tmkey += String(addr[i], HEX);
    }
    
    tmkey.toUpperCase();
    
    // Обрезаем до первых 8 символов
    tmkey = tmkey.substring(0, 8);
    
    // Добавляем расширение
    String filename = tmkey + ".TXT";
    
    // Конвертация в char массив
    char filenameChar[filename.length() + 1];
    filename.toCharArray(filenameChar, sizeof(filenameChar));
    
    Serial.print("Key ID: ");
    Serial.println(tmkey);
    Serial.print("Filename: ");
    Serial.println(filenameChar);
    
    if(ENGMODE_ADDKEY){
      // РЕЖИМ ДОБАВЛЕНИЯ КЛЮЧА
      File myFile = SD.open(filenameChar, FILE_WRITE);
      if (myFile) {
        myFile.println("Authorized Key");
        myFile.println(tmkey);
        myFile.close();
        
        // Сигнал успешного добавления
        tone(A0, 800);
        delay(500);
        noTone(A0);
        delay(500);
        tone(A0, 800);
        delay(500);
        noTone(A0);
        
        Serial.print("Key added - ");
        Serial.println(filenameChar);
        delay(3000);
      } else {
        Serial.print("Failed to add key - ");
        Serial.println(filenameChar);
        tone(A0, 400);
        delay(1000);
        noTone(A0);
      }
    } else {
      // РЕЖИМ ПРОВЕРКИ КЛЮЧА
      File iftmkey = SD.open(filenameChar);
      if (iftmkey) {
        Serial.print("Access accepted - key: ");
        Serial.println(tmkey);
        iftmkey.close();
        
        // Сигнал успешного доступа
        tone(A0, 800);
        delay(200);
        noTone(A0);
        delay(100);
        tone(A0, 800);
        delay(200);
        noTone(A0);
      } else {
        Serial.print("Key not found. Access denied - key: ");
        Serial.println(tmkey);
        
        // Сигнал ошибки
        tone(A0, 400);
        delay(500);
        noTone(A0);
      }
    }
    
    ibutton.reset_search();
    tmkey = "";
    delay(80);
    noTone(A0);
    delay(200);
    tone(A0, 500);
    delay(800);
    noTone(A0);
    delay(5000);
  }
}

Нет

4f73a2cc271.txt

но не создается

справедливо

Аккуратнее с формулировками: Не “файл не создается”, а “я не могу создать файл”.

Возможно, Гэри Килдалл, а возможно, кто-то до него. Можно лишь констатировать, что случилось это не позже 1974 года.
И, кстати, не 7, а 8.

И - да, когда Килдалл создавал ОС CP-M/80, объем ОП 2к уже считался недопустимо низким, поэтому перенос этого ограничения в Ардуино вполне оправдан.

Поэтому целесообразно, раз уж возникли какие-то проблемы, то сначала следует научиться создавать файл с заведомо допустимым именем, и только после успеха этого начинания можно будет попробовать что-то еще.

вы идиот или как?
Вам было сказано - длина имени файла не более 8-ми символов. Вы до 8-ми считать не научились еще?

оскорбления тут не уместны

А что тут уместно? Вам несколько человек сказали про правило “8.3”, даже кусок кода из библилиотеки процитировали - а вы опять показываете файл с именем в 11 символов? Не доходит?

Если не ругаться - могу вас пожалеть - “Мальчик, не расстраивайся, это не твое. Найди себе другое хобби, попроще…”

в строках 106-120 ты обрезал имя до 8 символов, а во второй ветке условия - в строке 122 используешь не обрезанное (простите! :wink: )

Могу дать телефон хорошего моэля в Хайфе. :rofl: (тут не все поймут шутку )

Вот спасибо, барин, уважил. Внял нашим мольбам.

Простите, Вы альтернативно одарены? Вам ведь сказали, что имя файла должно быть 8.3 Более того, Вам даже код привели где проверяется и, если не так, тупо возвращается false. Кстати, а почему Вы не проверяете что Вам возвращают? Тоже типизация мешает? Или другое чего?

Ну, а после того, как Вам сказали в чём проблема и привели код, а Вы не удосужились изменить формирование имени файла, … что тут сказать? Ну, … промолчу.

А где Вы увидели оскорбление? Это был вопрос о Вашем здоровье.

ИИ говорит что надо так, заблуждается?

void setup(){
  Serial.begin(9600);  // ← Перенесено сюда
  
  pinMode(A0, OUTPUT);
  
  if (!SD.begin(10)) {
    // сигнал ошибки
    tone(A0, 800);
    delay(300);
    noTone(A0);
    // ...
    return;
  }
  
  // остальной код setup...
}

void loop(){
  char customKey = customKeypad.getKey();
  
  if (customKey){
    // Убрали Serial.begin() отсюда
    if(customKey == 'K')
      Serial.println("insert key code");
    else if(customKey == 'C')
      Serial.println("insert key reset");
    else
      Serial.println(customKey);
    tone(A0, 815, 100); 
    delay(500);
  }
  
  readKey();
}

void readKey() {
  if (ibutton.search(addr)) {
    // Убрали Serial.begin() отсюда
    
    for (int i = 7; i > -1; i--) {
      // Форматируем каждый байт в 2 символа HEX
      if (addr[i] < 0x10) tmkey += "0";
      tmkey += String(addr[i], HEX);
    }
    
    if(ENGMODE_ADDKEY){
      String filename = tmkey + ".KEY";  // .KEY вместо .txt
      
      File myFile = SD.open(filename, FILE_WRITE);
      if (myFile) {
        myFile.println("Authorized Key");
        myFile.close();
        
        // сигнал успеха
        tone(A0, 800);
        delay(500);
        noTone(A0);
        delay(500);
        tone(A0, 800);
        delay(500);
        noTone(A0);
        
        Serial.println("key added - " + filename);
      } else {
        Serial.println("ERROR: Cannot create file " + filename);
      }
      delay(3000);
    } else {
      String filename = tmkey + ".KEY";
      File iftmkey = SD.open(filename);
      if (iftmkey) {
        Serial.println("access accepted - key: " + tmkey);
        iftmkey.close();
      } else {
        Serial.println("access denied - key not found: " + tmkey);
      }
    }
    
    ibutton.reset_search();
    tmkey = "";
    delay(80);
    noTone(A0);
    // ...
  }
}