/*
Sabratha Faculty of Engineering
Electrical & Electronic Eng Department
1- Sokina Kenan
2- Abdulhamed Essed
9/October/2019
^_^
*/
const int buzzer = 6;
int BAUDRATE = 57600;
int counter = 0;
// ===== Totals =====
unsigned long total_attention = 0;
unsigned long total_meditation = 0;
unsigned long total_theta = 0;
unsigned long total_delta = 0;
unsigned long total_low_alpha = 0;
unsigned long total_high_alpha = 0;
unsigned long total_low_beta = 0;
unsigned long total_high_beta = 0;
unsigned long total_low_gamma = 0;
unsigned long total_mid_gamma = 0;
long total_raw_EEG = 0;
// ===== Averages =====
unsigned long ave_attention;
unsigned long ave_meditation;
unsigned long ave_theta;
unsigned long ave_delta;
unsigned long ave_low_alpha;
unsigned long ave_high_alpha;
unsigned long ave_low_beta;
unsigned long ave_high_beta;
unsigned long ave_low_gamma;
unsigned long ave_mid_gamma;
long ave_raw_EEG;
// ===== ThinkGear Variables =====
byte payloadChecksum = 0;
byte checksum = 0;
int payloadLength = 0;
byte payloadData[64] = {0};
byte poorQuality = 0;
byte attention = 0;
byte meditation = 0;
boolean bigPacket = false;
boolean brainwave = false;
// ===== EEG Bands =====
unsigned int delta_wave = 0;
unsigned int theta_wave = 0;
unsigned int low_alpha_wave = 0;
unsigned int high_alpha_wave = 0;
unsigned int low_beta_wave = 0;
unsigned int high_beta_wave = 0;
unsigned int low_gamma_wave = 0;
unsigned int mid_gamma_wave = 0;
// ===== RAW EEG =====
int raw_EEG = 0;
// ===============================
void setup() {
pinMode(buzzer, OUTPUT);
Serial.begin(57600);
delay(500);
Serial.println("Communicating...");
}
// ===============================
byte ReadOneByte() {
while (!Serial.available());
return Serial.read();
}
// ===============================
int read_3byte_int(int i) {
return ((payloadData[i] << 16) | (payloadData[i + 1] << 8) | payloadData[i + 2]);
}
// ===============================
int read_2byte_signed(int i) {
int value = ((int)payloadData[i] << 8) | payloadData[i + 1];
if (value > 32767) value -= 65536;
return value;
}
// ===============================
void read_waves(int i) {
delta_wave = read_3byte_int(i); i += 3;
theta_wave = read_3byte_int(i); i += 3;
low_alpha_wave = read_3byte_int(i); i += 3;
high_alpha_wave = read_3byte_int(i); i += 3;
low_beta_wave = read_3byte_int(i); i += 3;
high_beta_wave = read_3byte_int(i); i += 3;
low_gamma_wave = read_3byte_int(i); i += 3;
mid_gamma_wave = read_3byte_int(i);
}
// ===============================
void loop() {
if (ReadOneByte() == 0xAA) {
if (ReadOneByte() == 0xAA) {
payloadLength = ReadOneByte();
if (payloadLength > 169) return;
payloadChecksum = 0;
for (int i = 0; i < payloadLength; i++) {
payloadData[i] = ReadOneByte();
payloadChecksum += payloadData[i];
}
checksum = ReadOneByte();
payloadChecksum = 255 - payloadChecksum;
if (checksum != payloadChecksum) return;
brainwave = false;
for (int i = 0; i < payloadLength; i++) {
switch (payloadData[i]) {
case 0x02:
poorQuality = payloadData[++i];
bigPacket = true;
break;
case 0x04:
attention = payloadData[++i];
break;
case 0x05:
meditation = payloadData[++i];
break;
case 0x80: // ===== RAW EEG =====
i++;
raw_EEG = read_2byte_signed(i);
i++;
break;
case 0x83:
i++;
brainwave = true;
read_waves(i + 1);
i += payloadData[i];
break;
}
}
if (brainwave && attention > 0 && attention < 100) {
counter++;
total_attention += attention;
total_meditation += meditation;
total_theta += theta_wave;
total_delta += delta_wave;
total_low_alpha += low_alpha_wave;
total_high_alpha += high_alpha_wave;
total_low_beta += low_beta_wave;
total_high_beta += high_beta_wave;
total_low_gamma += low_gamma_wave;
total_mid_gamma += mid_gamma_wave;
total_raw_EEG += raw_EEG;
ave_attention = total_attention / counter;
ave_meditation = total_meditation / counter;
ave_theta = total_theta / counter;
ave_delta = total_delta / counter;
ave_low_alpha = total_low_alpha / counter;
ave_high_alpha = total_high_alpha / counter;
ave_low_beta = total_low_beta / counter;
ave_high_beta = total_high_beta / counter;
ave_low_gamma = total_low_gamma / counter;
ave_mid_gamma = total_mid_gamma / counter;
ave_raw_EEG = total_raw_EEG / counter;
Serial.println("=================================");
Serial.print("RAW EEG: "); Serial.println(raw_EEG);
Serial.print("Attention: "); Serial.println(attention);
Serial.print("Meditation: "); Serial.println(meditation);
Serial.print("Theta: "); Serial.println(theta_wave);
Serial.print("Delta: "); Serial.println(delta_wave);
Serial.println("=================================");
}
if (theta_wave < 20000)
digitalWrite(buzzer, HIGH);
else
digitalWrite(buzzer, LOW);
}
}
}
