BASIC4MCU | 질문게시판 | 안녕하세요 ! 코드를 합치는 것좀 도와주실 수 있으신가요?
페이지 정보
작성자 PinO 작성일2019-02-26 20:36 조회989회 댓글0건본문
제가 뇌파센서인 마인드웨이브를 사용한 제품을 만들고 있는데 아두이노는 처음이고, 코드에 대해서 모르는게 너무 많아서 이렇게 글을 적습니다. 우선 회사에서 제공한 코드가 2가지 있습니다.한 가지는 눈 깜빡임을 얻을 수 있는 코드입니다.#define LED 13
#define BAUDRATE 57600
#define DEBUGOUTPUT 0
// checksum variablesbyte generatedChecksum = 0;
byte checksum = 0;
int flag=0;
int payloadLength = 0;byte payloadData[64] = {0};
byte poorQuality = 0;
byte attention = 0;
byte blinkstrenth =0;
byte meditation = 0;byte delta =0;
float high_alpha = 0;
byte low_gamma = 0;// system variables
long lastReceivedPacket = 0;
boolean bigPacket = false;
//////////////////////////
// Microprocessor Setup //
//////////////////////////
void setup()
{
Serial.begin(BAUDRATE); // USB
}
////////////////////////////////
// Read data from Serial UART //
////////////////////////////////
byte ReadOneByte()
{
int ByteRead;
while(!Serial.available());
ByteRead = Serial.read();
return ByteRead;
}
void loop()
{// Look for sync bytes
if(ReadOneByte() == 170)
{
if(ReadOneByte() == 170)
{
payloadLength = ReadOneByte();
if(payloadLength > 169) //Payload length can not be greater than 169
return;
generatedChecksum = 0;
for(int i = 0; i < payloadLength; i++)
{
payloadData[i] = ReadOneByte(); //Read payload into memory
generatedChecksum += payloadData[i];
}checksum = ReadOneByte(); //Read checksum byte from stream
generatedChecksum = 255 - generatedChecksum; //Take one's compliment of generated checksumif(checksum == generatedChecksum)
{
poorQuality = 200;
attention = 0;
meditation = 0;
blinkstrenth = 0;
for(int i = 0; i < payloadLength; i++)
{ // Parse the payload
switch (payloadData[i])
{
case 2:
i++;poorQuality = payloadData[i];
bigPacket = true;
break;
case 4:
i++;
attention = payloadData[i];
break;
case 5:
i++;
meditation = payloadData[i];break;
case 0x16: //Blinki++;
blinkstrenth = payloadData[i];
if(blinkstrenth)
flag=1;
break;
case 0x80:i = i + 3;
break;
case 0x83:
// eight big-endian 3-byte unsigned integer values representing
// delta(0~2), theta(3~5), low-alpha(6~8),high-alpha(9~11), low-beta(12~14), high-beta(15~17)
// low-gamma(18~20), and mid-gamma(21~23)
//These values have no units and therefore are only meaningful compared to each other and to themselves, to consider relative quantity and temporal fluctuations.
i=i+25;
break;
} // switch} // for loop
if(bigPacket)
{
Serial.print("PoorQuality: ");
Serial.print(poorQuality, DEC);
Serial.print(" Attention: ");
Serial.print(attention, DEC);
Serial.print(" meditation: ");
Serial.print(meditation, DEC);
Serial.print(" Time : ");
Serial.print(millis() - lastReceivedPacket, DEC);
lastReceivedPacket = millis();
Serial.print("\n");
/*
switch(attention / 10)
{
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;case 9:
break;case 10:
break;
}
*/}
bigPacket = false;
}
else {
// Checksum Error
} // end if else for checksum
} // end if read 0xAA byte
} // end if read 0xAA byte
}
그리고 다음은 센서를 통해서 얻을 수 있는 데이터에 관한 코드입니다.
#define BAUDRATE 57600
#define LED 8
#define Theshold_Eyeblink 110
#define EEG_AVG 70
//
long payloadDataS[5]={0};
long payloadDataB[32]={0};
byte checksum=0,generatedchecksum=0;
unsigned int Raw_data,Poorquality,Plength,Eye_Enable=0,On_Flag=0,Off_Flag=1;
unsigned int j,n=0;
long Temp,Avg_Raw,Temp_Avg;
//
void setup(){
Serial.begin(BAUDRATE); // USB
pinMode(LED,OUTPUT);
}
//
byte ReadOneByte(){ // One Byte Read Function
int ByteRead;
while(!Serial.available());
ByteRead=Serial.read();
return ByteRead;
}
//
void loop(){
if(ReadOneByte()==170){ // AA 1 st Sync data
if(ReadOneByte()==170){ // AA 2 st Sync data
Plength=ReadOneByte();
if(Plength==4){ Small_Packet(); } // Small Packet
else if(Plength==32){ Big_Packet(); } // Big Packet
}
}
}
//
void Small_Packet(){
generatedchecksum=0;
for(int i=0; i<Plength; i++){
payloadDataS[i]=ReadOneByte(); //Read payload into memory
generatedchecksum+=payloadDataS[i];
}
generatedchecksum=255-generatedchecksum;
checksum=ReadOneByte();
if(checksum==generatedchecksum){ // Varify Checksum
if(j<512){
Raw_data=((payloadDataS[2]<<8)|payloadDataS[3]);
if(Raw_data&0xF000){ Raw_data=(((~Raw_data)&0xFFF)+1); }
else{ Raw_data=(Raw_data&0xFFF); }
Temp+=Raw_data;
j++;
}
else{ Onesec_Rawval_Fun(); }
}
}
//
void Big_Packet(){
generatedchecksum=0;
for(int i=0; i<Plength; i++){
payloadDataB[i]=ReadOneByte(); //Read payload into memory
generatedchecksum+=payloadDataB[i];
}
generatedchecksum=255-generatedchecksum;
checksum=ReadOneByte();
if(checksum==generatedchecksum){ // Varify Checksum
Poorquality=payloadDataB[1];
if(Poorquality==0){ Eye_Enable=1; } else{ Eye_Enable=0; }
}
}
//
void Onesec_Rawval_Fun(){
Avg_Raw=Temp/512;
if(On_Flag==0&&Off_Flag==1){
if(n<3){ Temp_Avg+=Avg_Raw; n++; }
else{
Temp_Avg=Temp_Avg/3;
if(Temp_Avg<EEG_AVG){ On_Flag=1; Off_Flag=0; }
n=0; Temp_Avg=0;
}
}
Eye_Blink();
j=0;
Temp=0;
}
//
void Eye_Blink ()
{
if (Eye_Enable)
{
if (On_Flag==1 && Off_Flag==0)
{
if ((Avg_Raw>Theshold_Eyeblink) && (Avg_Raw<350))
{
digitalWrite(LED,HIGH);
Serial.println("On_Flag==1");
}
else
{
if (Avg_Raw>350)
{
On_Flag==0;Off_Flag==1;
}
digitalWrite(LED,LOW);
Serial.println("On_Flag==0");
}
}
else
{
digitalWrite(LED,LOW);
Serial.println("On_Flag==0");
}
}
else
{
digitalWrite(LED,LOW);
Serial.println("On_Flag==0");
}
}
저희는 LED는 사용할 생각이 없어서 LED 같은 경우에는 코드에서 사라져도 되는데 그렇게 되면 데이터도 출력이
안될 것 같아서 일단 전부 올렸습니다.
위의 코드들을 각각 실행하면 원하는 값들을 얻을 수 있었습니다. 하지만 제가 원하는 것은 한 개의 코드를 이용하여 아두이노의 실행화면에 눈 깜빡임 값과 위의 데이터들을 같이 출력하고 싶습니다.정말 두서 없이 많은 것을 부탁드린 것 같아 죄송합니다...
댓글 0
조회수 989등록된 댓글이 없습니다.