Помогите с plx-daq

Sixtyone
Offline
Зарегистрирован: 13.12.2021

Есть система учета времени прихода сотрудников собранная на mc522 и arduino uno. Все данные при считывании карт приходят в excell файл. Проблема в том, что при отключении plx daq от серийного порта и повторном его включении, данные записываются в ячейки с уже существующими данными, какую функцию добавить, что бы при повторном подключении прога не переписывала уже существующие ячейки, а начинала запись новых данных в первую свободную ячейку? Вот код

#include <SPI.h> 
#include <MFRC522.h> 
 
#define SS_PIN 10 //RX slave select 
#define RST_PIN 9 
 
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance. 
 
byte card_ID[4]; //card UID size 4byte 
byte Name1[4]={0x64,0x06,0xAE,0xEB};//first UID card 
byte Name2[4]={0xC6,0x90,0x63,0xAF};//second UID card 
byte Name3[4]={0x6E,0x75,0x62,0xC9};//second UID card 
byte Name4[4]={0xE5,0x1C,0xFF,0x00};//second UID card 
 
//if you want the arduino to detect the cards only once 
//int NumbCard[4];//this array content the number of cards. in my case i have just two cards. 
int j=0;         
 
int const RedLed=6; 
int const GreenLed=5; 
int const Buzzer=8; 
 
String Name;//user name 
long Number;//user number 
int n ;//The number of card you want to detect (optional)   
 
void setup() { 
  Serial.begin(9600); // Initialize serial communications with the PC 
  SPI.begin();  // Init SPI bus 
  mfrc522.PCD_Init(); // Init MFRC522 card 
   
  //Serial.println("CLEARSHEET");                 // clears starting at row 1 
  Serial.println("LABEL,Date,Time,Name,Number");// make four columns (Date,Time,[Name:"user name"]line 48 & 52,[Number:"user number"]line 49 & 53) 
 
  pinMode(RedLed,OUTPUT); 
  pinMode(GreenLed,OUTPUT); 
  pinMode(Buzzer,OUTPUT); 
 
   } 
     
void loop() { 
  //look for new card 
   if ( ! mfrc522.PICC_IsNewCardPresent()) { 
  return;//got to start of loop if there is no card present 
 } 
 // Select one of the cards 
 if ( ! mfrc522.PICC_ReadCardSerial()) { 
  return;//if read card serial(0) returns 1, the uid struct contians the ID of the read card. 
 } 
  
 for (byte i = 0; i < mfrc522.uid.size; i++) { 
     card_ID[i]=mfrc522.uid.uidByte[i]; 
 
       if(card_ID[i]==Name1[i]){ 
       Name="Denis";//user name 
       Number=1;//user number 
       j=0;//first number in the NumbCard array : NumbCard[j] 
      } 
      else if(card_ID[i]==Name2[i]){ 
       Name="Dima";//user name 
       Number=2;//user number 
       j=1;//Second number in the NumbCard array : NumbCard[j] 
      } 
      else if(card_ID[i]==Name3[i]){ 
       Name="Islam";//user name 
       Number=61;//user number 
       j=2;//Second number in the NumbCard array : NumbCard[j] 
      } 
      else if(card_ID[i]==Name4[i]){ 
       Name="Alla";//user name 
       Number=4;//user number 
       j=3;//Second number in the NumbCard array : NumbCard[j] 
      } 
      else{ 
          digitalWrite(GreenLed,LOW); 
          digitalWrite(RedLed,HIGH); 
          goto cont;//go directly to line 85 
     } 
} 
      //if(NumbCard[j] == 1){//to check if the card already detect 
      //if you want to use LCD 
      //Serial.println("Already Exist"); 
      //} 
      //else{ 
      //NumbCard[j] = 1;//put 1 in the NumbCard array : NumbCard[j]={1,1} to let the arduino know if the card was detecting  
      //n++;//(optional) 
      Serial.print("DATA,DATE,TIME," + Name);//send the Name to excel 
      Serial.print(","); 
      Serial.println(Number); //send the Number to excel 
      digitalWrite(GreenLed,HIGH); 
      digitalWrite(RedLed,LOW); 
      digitalWrite(Buzzer,HIGH); 
      delay(30); 
      digitalWrite(Buzzer,LOW); 
      Serial.println("SAVEWORKBOOKAS,Names/WorkNames"); 
      //} 
      delay(1000); 
cont: 
delay(2000); 
digitalWrite(GreenLed,LOW); 
digitalWrite(RedLed,LOW); 
 
//if you want to close the Excel when all card had detected and save Excel file in Names Folder. in my case i have just 2 card (optional) 
//if(n==2){ 
     
  //  Serial.println("FORCEEXCELQUIT"); 
 //   } 
}

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

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

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Ардуино тут не при чем - править надо код в Excel...

Sixtyone
Offline
Зарегистрирован: 13.12.2021

Так все что делает excell это принимает данные разве не надо править то что передает эти данные?

sadman41
Offline
Зарегистрирован: 19.10.2016
Первое, что приходит в голову:
 
-------
CELL,SET,cellnum,cellvalue
Sets the specified cell value or text
 
CELL,SET,B4,Hello
---------
Вот это B4 в ардуине формировать.
kalapanga
Offline
Зарегистрирован: 23.10.2016

Sixtyone пишет:

Так все что делает excell это принимает данные разве не надо править то что передает эти данные?

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

Предположительно, в случае переподключения лишней (вредной) является "команда" отправляемая в строке 33. Нужно что-то предпринять, чтобы эксель понимал, нужно ли ему действительно заново лист начать или нужно продолжать запись на текущем листе (игнорировал эту команду).

sadman41
Offline
Зарегистрирован: 19.10.2016
    1. Reset on Connect: the checkbox should be ticked at all time. If ticket the first command from Excel to Arduino will be to restart, thus your code starts from the beginning as well. This way you can have a fresh session. If you want to connect to your Arduino without restarting it just untick the box

 

Sixtyone
Offline
Зарегистрирован: 13.12.2021

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Зачем полагать? Документацию на плагин взяли и все команды просмотрели. Есть такая для поиска пустых ячеек?

Sixtyone
Offline
Зарегистрирован: 13.12.2021

Документацию читал, такой функции нет, но есть навигация по рядам, вот из неё возможно получится написать функцию

b707
Offline
Зарегистрирован: 26.05.2017

Sixtyone пишет:

Документацию читал, такой функции нет, но есть навигация по рядам, вот из неё возможно получится написать функцию

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

Вопросы по кругу пошли

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Имхо, надо искать не пустую, а последнюю (ну, в смысле, за которой не занимать:)). А лучше не искать, а заранее знать..  Например в еепром записать координаты 

b707
Offline
Зарегистрирован: 26.05.2017

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Только на первый шит пишет надстройка.

И она не для создания вот таких многодневных логов, так что я не знаю, зачем так мучаться.