查看: 1504|回复: 7
|
Brain Wave Alarm Clock Using EEG
[复制链接]
|
|
在下小弟需要各位的帮忙。 我有很多疑问对于此题目。 希望可以从各位得到解答。 谢谢!
首先我已有了电线图。现在本人不知道用什么道具来管看brainwave。 frequency 小于 4-20hz。
我该用什么来管看呢?? |
|
|
|
|
|
|
|
发表于 3-6-2008 09:07 AM
|
显示全部楼层
原帖由 救我 于 2-6-2008 08:44 PM 发表
在下小弟需要各位的帮忙。 我有很多疑问对于此题目。 希望可以从各位得到解答。 谢谢!
首先我已有了电线图。现在本人不知道用什么道具来管看brainwave。 frequency 小于 4-20hz。
我该 ...
请放你的电路图。
可能你搜到看到的是 Brain Wave Alarm Clock
我没有做过, 也不会EEG。
你要有Amplifier, 把微小的信号放大。。。
然后,
1. 你可以用oscilloscope 来看。。。
2. 或你可以用PIC MCU的ADC 来sample 那个信号, 然后RS232输出到电脑上, 用MS Excel plot graph 看。
3. 或你可以用PC 的sound card 来录那个低频的信号,(soundcard 可能要改装)。 |
|
|
|
|
|
|
|
楼主 |
发表于 6-6-2008 05:58 PM
|
显示全部楼层
楼主
楼主所提的 sample 然后 通过 RS 232 去电脑, 再用 MS Excel。 这个方法是如何使用呢? 可否教小弟 ? |
|
|
|
|
|
|
|
发表于 9-6-2008 07:56 PM
|
显示全部楼层
原帖由 救我 于 6-6-2008 05:58 PM 发表
楼主所提的 sample 然后 通过 RS 232 去电脑, 再用 MS Excel。 这个方法是如何使用呢? 可否教小弟 ?
先请问你会用PIC MCU 吗?如16F877A之类的?有没有制作经验? |
|
|
|
|
|
|
|
楼主 |
发表于 12-6-2008 12:30 AM
|
显示全部楼层
回复 4# pic 的帖子
会。 曾经用过。 可是我只是学一些普通的使用。例如:LED。。 |
|
|
|
|
|
|
|
发表于 12-6-2008 10:47 AM
|
显示全部楼层
回复 5# 救我 的帖子
ADC的接法请参考:
LM35D接PIC16F877A (LCD ADC)
RS232的接法请参考:
【电路】MAX232的替代电路
做好后, 用Hyperterminal 来看 MCU送出的讯号。
参考以下CCS C源码, ADC 在 PortA0. (0-5v)
每100mS 采样 (Sample) 一次。
- // Compiler: CCS C
- // By pic@cArI , 12 Jun 2008
- // Read ADC on AN0, and send to RS232
- #include<16F877A.h>
- #device ADC=8
- #fuses HS,NOWDT,NOPROTECT,NOLVP
- #use delay(clock=20000000)
- #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7, errors)
- void main()
- {
- int value;
- setup_port_a(ALL_ANALOG);
- setup_adc(ADC_CLOCK_INTERNAL);
- set_adc_channel(0);
- while(1)
- {
- value=Read_ADC();
- printf("%u\n\r",value);
- delay_ms(100); // Delay
- }
- }
复制代码 有问题再问。
[ 本帖最后由 pic 于 12-6-2008 10:54 AM 编辑 ] |
|
|
|
|
|
|
|
发表于 10-7-2008 04:02 PM
|
显示全部楼层
Brain Wave Alarm Clock Using EEG
/////////////////////////////////////////////////////////////
//
// AlarmClock.c
//
// Implements an alarm clock. Alarm will only sound
// based on certain conditions of inputs A and B.
///////////////////////////////////////////////////////////////
#include <16F877A.h>
#device *=16 ADC=10 // Use 16-bit pointers, use 8-bit ADC
#fuses HS // You may or may not want some of these ....
#fuses NOWDT
#fuses NOPROTECT
#fuses NOLVP
#fuses NODEBUG
#fuses NOPUT
#fuses NOBROWNOUT
#use delay(clock=4000000) //4MHz
// These require use of Set_Tris_x()
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
#define DELAY_CHANGE_TIME 20000
// Global variables
int16 timeMin = 10;
int16 timeHour = 10;
int16 alarmMin = 0;
int16 alarmHour = 7;
//int8 timeMin;
//int8 timeHour;
//int8 alarmMin;
//int8 alarmHour;
//int8 testint = 0;
//int8 testint2 = 0;
int8 pina4;
int8 pina5;
int8 pina0;
int8 pina3;
int8 pina1;
int8 pina2;
int8 pind1;
int8 pind0;
int8 pind2;
int8 pind3;
int8 pind4;
int8 pind5;
int8 timerCount1 = 0;
int8 increment = 0;
int16 counter = 0;
int8 tmin0, tmin1, thour0, thour1; // time variables
int8 amin0, amin1, ahour0, ahour1; // alarm variables
#include "C:\AlarmClock programming\display.c"
// function declarations
void initTimers( void);
void timer1ISR( void);
void set_time( void);
void set_alarm(void);
void update_time( void);
// Purpose: Initializes timer interrupts
// Precondition: None
// Postcondition: Timers and interrupts are enabled
void initTimers(void)
{
setup_timer_1( T1_INTERNAL | T1_DIV_BY_8 ); // timer1 will increment every (32/4000000) = 8 microseconds
set_timer1(3036); // It will overflow every 0.5 seconds
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
timerCount1 = 0;
}
// Purpose: Timer1 ISR
// Precondition: initTimers called
// Postcondition: Timer1 counter updated
// This routine is called every 0.5 seconds
#INT_TIMER1
void Timer1ISR(void)
{
disable_interrupts(GLOBAL);
disable_interrupts(INT_TIMER1);
set_timer1(3036);
timerCount1 ++;
// if(timerCount1 == 114) // 59.7679 seconds have passed
// set_timer1(36520); // compensate for overcounting
if(timerCount1 > 119)
{
timerCount1 = 0;
increment = 1;
/*
if(testint2 == 0){
output_high(PIN_E0);
testint2 = 1;
}
else{
output_low(PIN_E0);
testint2 = 0;
}
*/
}
/*
if(testint == 0){
output_high(PIN_E1);
testint = 1;
}
else{
output_low(PIN_E1);
testint = 0;
}
*/
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
}
void set_time(void)
{
while(pina4) // do not leave while we are setting the real time
{
// allow time to increment also
if(increment == 1){
timeMin ++;
increment = 0;
}
if(timeMin > 59){
timeMin = 0;
timeHour ++;
}
if(timeHour > 23)
timeHour = 0;
pina4 = input(PIN_A4);
pind5 = input(PIN_D5);
pind4 = input(PIN_D4);
// counter = 0;
// while(counter < DELAY_CHANGE_TIME)
// counter ++;
// increment minute if button is pressed
if(pind5 == 1){
timeMin ++;
timerCount1 = 0;
set_timer1(3036);
counter = 0;
while(counter < DELAY_CHANGE_TIME)
counter ++;
// disable_interrupts(GLOBAL);
// delay_ms(250); // delay for 0.25 seconds
// enable_interrupts(GLOBAL);
}
// increment hour if button is pressed
if(pind4 == 1){
timeHour ++;
timerCount1 = 0;
set_timer1(3036);
counter = 0;
while(counter < DELAY_CHANGE_TIME)
counter ++;
// disable_interrupts(GLOBAL);
// delay_ms(250); // delay for 0.25 seconds
// enable_interrupts(GLOBAL);
}
// check for time wraparound
if(timeMin > 59)
timeMin = 0;
if(timeHour > 23)
timeHour = 0;
update_time();
display(tmin0, tmin1, thour0, thour1);
}
}
void set_alarm(void)
{
while(pina5) // do not leave while we are setting the alarm time
{
// allow time to be incremented
if(increment == 1){
timeMin ++;
increment = 0;
}
if(timeMin > 59){
timeMin = 0;
timeHour ++;
}
if(timeHour > 23)
timeHour = 0;
pina5 = input(PIN_A5);
pind4 = input(PIN_D4);
pind5 = input(PIN_D5);
// counter = 0;
// while(counter < DELAY_CHANGE_TIME)
// counter ++;
// increment alarm if button is pressed
if(pind5 == 1){
alarmMin ++;
counter = 0;
while(counter < DELAY_CHANGE_TIME)
counter ++;
// disable_interrupts(GLOBAL);
// delay_ms(250); // delay for 0.25 seconds
// enable_interrupts(GLOBAL);
}
if(pind4 == 1){
alarmHour ++;
counter = 0;
while(counter < DELAY_CHANGE_TIME)
counter ++;
// disable_interrupts(GLOBAL);
// delay_ms(250); // delay for 0.25 seconds
// enable_interrupts(GLOBAL);
}
// check for time wraparound
if(alarmMin > 59)
alarmMin = 0;
if(alarmHour > 23)
alarmHour = 0;
update_time();
display(amin0, amin1, ahour0, ahour1);
}
}
void update_time(void)
{
// set time minute display
if(timeMin < 10){ tmin1 = 0; tmin0 = timeMin; }
else if(timeMin < 20){ tmin1 = 1; tmin0 = timeMin - 10;}
else if(timeMin < 30){ tmin1 = 2; tmin0 = timeMin - 20;}
else if(timeMin < 40){ tmin1 = 3; tmin0 = timeMin - 30;}
else if(timeMin < 50){ tmin1 = 4; tmin0 = timeMin - 40;}
else { tmin1 = 5; tmin0 = timeMin - 50;}
// set alarm minute display
if(alarmMin < 10){ amin1 = 0; amin0 = alarmMin; }
else if(alarmMin < 20){ amin1 = 1; amin0 = alarmMin - 10;}
else if(alarmMin < 30){ amin1 = 2; amin0 = alarmMin - 20;}
else if(alarmMin < 40){ amin1 = 3; amin0 = alarmMin - 30;}
else if(alarmMin < 50){ amin1 = 4; amin0 = alarmMin - 40;}
else { amin1 = 5; amin0 = alarmMin - 50;}
if(timeHour < 10){ thour1 = 0; thour0 = timeHour; }
else if(timeHour < 20){ thour1 = 1; thour0 = timeHour - 10;}
else { thour1 = 2; thour0 = timeHour - 20;}
if(alarmHour < 10){ ahour1 = 0; ahour0 = alarmHour; }
else if(alarmHour < 20){ ahour1 = 1; ahour0 = alarmHour - 10;}
else { ahour1 = 2; ahour0 = alarmHour - 20;}
}
// ============================================================
// MAIN SUBROUTINE
//
// Main subroutine controls the entire program. Set clock time
// and alarm time. Set off buzzer.
#pragma zero_ram
void main()
{
disable_interrupts(GLOBAL); // We don't want to be interrupted yet
disable_interrupts(INT_TIMER1);
delay_ms(500); // wait for voltages to stablize
// configure I/O
setup_adc(ADC_OFF);
setup_adc_ports(NO_ANALOGS); // set portA as all digital
set_tris_a(0b11111111); // all inputs
set_tris_b(0b00000000); // all outputs
set_tris_c(0b00000000); // all outputs
set_tris_d(0b11111111); // all inputs
set_tris_e(0b00000000); // all outputs
// port_b = 0;
// port_c = 0;
// port_e = 0;
// timeMin = 10;
// timeHour = 10;
// alarmMin = 0;
// alarmHour = 7;
output_low(PIN_E2); // buzzer off by default
output_high(PIN_E0); // relays on by default
output_high(PIN_E1);
delay_ms(50);
initTimers(); // This is where the interrupts are enabled again
output_low(PIN_E2); // buzzer off by default
output_high(PIN_E0); // relays on by default
output_high(PIN_E1);
// start main loop
while(TRUE)
{
pina5 = input(PIN_A5);
pina4 = input(PIN_A4);
pina3 = input(PIN_A3);
pina0 = input(PIN_A0);
pina1 = input(PIN_A1);
pina2 = input(PIN_A2);
pind1 = input(PIN_D1);
pind0 = input(PIN_D0);
pind2 = input(PIN_D2);
pind3 = input(PIN_D3);
// first check if real time has to be incremented
if(increment == 1){
timeMin ++;
increment = 0;
}
if(timeMin > 59){
timeMin = 0;
timeHour ++;
}
if(timeHour > 23)
timeHour = 0;
// while(!pina2 && !pina3 && !pina4 && !pina5);
counter = 0;
while(counter < 5000)
counter ++;
// counter = 0;
// while(counter < DELAY_CHANGE_TIME)
// counter ++;
// display the real time or alarm time
// if(input(PIN_A5) == 1) // call set_alarm routine
if(pina5 == 1)
set_alarm();
// else if(input(PIN_A4) == 1) // call set_alarm routine
// else if(pina4 == 1)
if(pina4 == 1)
set_time();
// else{ // display the real time and update it too
update_time();
display(tmin0, tmin1, thour0, thour1);
// }
////////////////////////////////////// OUTPUTS /////////////////////////////////////////
// set buzzer and relay outputs depending on input signals and time
if( pina3 && (timeHour*60+timeMin == alarmHour*60+alarmMin) ) // hard time buzzer
{
output_high(PIN_E2);
if(pind1)
output_high(PIN_E0);
else
output_low(PIN_E0);
if(pind3)
output_high(PIN_E1);
else
output_low(PIN_E1);
}
else if( pina3 && pina0 &&
(timeHour*60+timeMin > alarmHour*60+alarmMin-90) &&
(timeHour*60+timeMin < alarmHour*60+alarmMin) ) // give 90 minutes for light sleep stage
{
output_high(PIN_E2);
if(pind1)
output_high(PIN_E0);
else
output_low(PIN_E0);
if(pind3)
output_high(PIN_E1);
else
output_low(PIN_E1);
}
else if( pina3 && pina1 ) // if alarm is set and user has fallen asleep
{
if(pind0)
output_low(PIN_E0);
else
output_high(PIN_E0);
if(pind2)
output_low(PIN_E1);
else
output_high(PIN_E1);
}
else
{
output_low(PIN_E2);
output_high(PIN_E0);
output_high(PIN_E1);
}
} // end while loop
} // end main
有谁可以帮帮我看哪里出了问题吗?我是ccs c的初学这。。 |
|
|
|
|
|
|
|
发表于 11-7-2008 08:51 AM
|
显示全部楼层
回复 7# happy660 的帖子
参考版规 1
========================
1. 为什么你的帖没人回覆?
不是没人会, 而很多时候是你的资料不齐, 别人很难回覆, 或根本不想回覆。。。
那在发问题时:写出:
i. 你要想做什么? 你的应用是什么?
ii. 你想要拿到什么效果
iii. 你做了什么
iv. 你遇到了什么问题。
v. 你用什么MCU?
vi. 你用什么语言? ASM /C/PICBasic/Keil?Compiler 版本?
vii. 有源码吗? 有电路图吗?
viii. 有照片/图片补充吗?
清清楚楚的。。。能多详细, 就写的多详细, 才会得到有效的回覆。 |
|
|
|
|
|
|
| |
本周最热论坛帖子
|