Source Code



Below is the code I wrote on the Arduino Uno.




#include <SoftwareSerial.h>



// Define software serial port (replace with Serial if using hardware serial)

SoftwareSerial eegSerial(2, 3); // RX=2, TX=3

const long BAUD_RATE = 9600; // Module default baud rate



// EEG data structure

struct EEGData {

 uint8_t attention; // Attention value 0-100

 uint8_t meditation; // Meditation value 0-100

 uint16_t raw; // Raw EEG data

} eegData;



void setup() {

 // Initialize serial port (Debug + Module Communication)

 Serial.begin(115200);

 eegSerial.begin(BAUD_RATE);

 delay(1000); // Wait for module startup

}




void loop() {

 if (eegSerial.available() > 0) {

 parseEEGData(); // Parse module data

 sendEEGData(); // Send parsed data via serial port

 }

 delay(100);

}




// Parse ThinkGear module protocol data

void parseEEGData() {

 uint8_t byteRead = eegSerial.read();

 static uint8_t state = 0;

 static uint8_t payloadLen = 0;

 static uint8_t payload[32];

 static uint8_t checksum = 0;




 switch (state) {

 case 0: // Waiting for frame header 0xAA

 if (byteRead == 0xAA) state = 1;

 break;

 case 1: // Wait for second frame header 0xAA

 if (byteRead == 0xAA) state = 2;

 else state = 0;

 break;

 case 2: // Read payload length

 payloadLen = byteRead;

 checksum = 0;

 state = 3;

 break;

 case 3: // Read payload

 payload[payloadLen - 1] = byteRead;

 checksum += byteRead;

 if (--payloadLen == 0) state = 4;

 break;

 case 4: // Checksum verification

 checksum = 0xFF - checksum;

 if (checksum == byteRead) {

 extractData(payload, sizeof(payload));

 }

 state = 0;

 break;

 }

}




// Extract attention, meditation, raw data

void extractData(uint8_t* payload, uint8_t len) {

 for (uint8_t i = 0; i < len; i++) {

 if (payload[i] == 0x02 && payload[i+1] == 0x01) {

 eegData.attention = payload[i+2]; // Attention value

 i += 2;

 }

 if (payload[i] == 0x04 && payload[i+1] == 0x01) {

 eegData.meditation = payload[i+2]; // Meditation value

 i += 2;

 }

 if (payload[i] == 0x80 && payload[i+1] == 0x02) {

 eegData.raw = (payload[i+2] << 8) | payload[i+3]; // Raw EEG signal

 i += 3;

 }

 }

}




// Serial data transmission (formatted output)

void sendEEGData() {

 Serial.print(“Attention:”);

 Serial.print(eegData.attention);

 Serial.print(“,Meditation:”);

 Serial.print(eegData.meditation);

 Serial.print(“,RawEEG:”);

 Serial.println(eegData.raw);

}