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);
}