Помогите с plx-daq
- Войдите на сайт для отправки комментариев
Пнд, 13/12/2021 - 16:29
Есть система учета времени прихода сотрудников собранная на 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"); // } }
Ну наверное для этого в "первую свободную ячейку" нужно записывать какую то метку , а при переподключении начинать запись с этой метки.
На форуме по EXCEL'ю спроси.
Ардуино тут не при чем - править надо код в Excel...
Так все что делает excell это принимает данные разве не надо править то что передает эти данные?
Так все что делает excell это принимает данные разве не надо править то что передает эти данные?
Смотреть надо и то и другое вместе. В эксель посылаются не только "данные" но и некоторые, можно так назвать, "команды". А что по ним делается - надо в экселе смотреть. И как вообще работа всего этого организована.
Предположительно, в случае переподключения лишней (вредной) является "команда" отправляемая в строке 33. Нужно что-то предпринять, чтобы эксель понимал, нужно ли ему действительно заново лист начать или нужно продолжать запись на текущем листе (игнорировал эту команду).
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
Не помогло, запись все так же осуществляется на существующие ячейки. Полагаю, что надо написать условие при котором будет совершаться поиск пустых ячеек (а именно первой пустой ячейки в столбце) и отсчитывать от нее
Зачем полагать? Документацию на плагин взяли и все команды просмотрели. Есть такая для поиска пустых ячеек?
Документацию читал, такой функции нет, но есть навигация по рядам, вот из неё возможно получится написать функцию
Документацию читал, такой функции нет, но есть навигация по рядам, вот из неё возможно получится написать функцию
вам в любом случае понадобится программная метка, чтобы различить запись в новый или возобновление записи в начатый лист, о чем вам уже сказали в сообщениях #1 и #4.
Вопросы по кругу пошли
Имхо, надо искать не пустую, а последнюю (ну, в смысле, за которой не занимать:)). А лучше не искать, а заранее знать.. Например в еепром записать координаты
можно, кстати. подойти к решению с другой стороны - при переподключении каждый раз открывать новый лист для записи. Тогда проблема поиска свободных и занятых ячеек отпадет сама собой
Только на первый шит пишет надстройка.
И она не для создания вот таких многодневных логов, так что я не знаю, зачем так мучаться.