佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1504|回复: 7

Brain Wave Alarm Clock Using EEG

[复制链接]
发表于 2-6-2008 08:44 PM | 显示全部楼层 |阅读模式
在下小弟需要各位的帮忙。 我有很多疑问对于此题目。 希望可以从各位得到解答。 谢谢!
首先我已有了电线图。现在本人不知道用什么道具来管看brainwave。 frequency 小于 4-20hz。
我该用什么来管看呢??
回复

使用道具 举报


ADVERTISEMENT

发表于 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) 一次。
  1. // Compiler: CCS C
  2. // By pic@cArI , 12 Jun 2008
  3. // Read ADC on AN0, and send to RS232
  4. #include<16F877A.h>
  5. #device ADC=8
  6. #fuses HS,NOWDT,NOPROTECT,NOLVP
  7. #use delay(clock=20000000)
  8. #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7, errors)

  9. void main()
  10. {
  11.    int value;
  12.    setup_port_a(ALL_ANALOG);
  13.    setup_adc(ADC_CLOCK_INTERNAL);
  14.    set_adc_channel(0);

  15.    while(1)
  16.    {
  17.       value=Read_ADC();
  18.       printf("%u\n\r",value);
  19.       delay_ms(100); // Delay
  20.    }
  21. }
复制代码
有问题再问。

[ 本帖最后由 pic 于 12-6-2008 10:54 AM 编辑 ]
回复

使用道具 举报

Follow Us
发表于 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 &lt;16F877A.h&gt;
#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 &quot;C:\AlarmClock programming\display.c&quot;

// 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 &gt; 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 &gt; 59){
         timeMin = 0;
         timeHour ++;
      }

      if(timeHour &gt; 23)
         timeHour = 0;

      pina4 = input(PIN_A4);
      pind5 = input(PIN_D5);
      pind4 = input(PIN_D4);
//      counter = 0;
//      while(counter &lt; DELAY_CHANGE_TIME)
//         counter ++;

      // increment minute if button is pressed
      if(pind5 == 1){
         timeMin ++;
         timerCount1 = 0;
         set_timer1(3036);
         counter = 0;
         while(counter &lt; 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 &lt; DELAY_CHANGE_TIME)
            counter ++;
//         disable_interrupts(GLOBAL);
//         delay_ms(250); // delay for 0.25 seconds
//         enable_interrupts(GLOBAL);
      }

      // check for time wraparound
      if(timeMin &gt; 59)
         timeMin = 0;

      if(timeHour &gt; 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 &gt; 59){
         timeMin = 0;
         timeHour ++;
      }

      if(timeHour &gt; 23)
         timeHour = 0;

      pina5 = input(PIN_A5);
      pind4 = input(PIN_D4);
      pind5 = input(PIN_D5);
//      counter = 0;
//      while(counter &lt; DELAY_CHANGE_TIME)
//         counter ++;

      // increment alarm if button is pressed
      if(pind5 == 1){
         alarmMin ++;
         counter = 0;
         while(counter &lt; 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 &lt; DELAY_CHANGE_TIME)
            counter ++;
//         disable_interrupts(GLOBAL);
//         delay_ms(250); // delay for 0.25 seconds
//         enable_interrupts(GLOBAL);
      }

      // check for time wraparound
      if(alarmMin &gt; 59)
         alarmMin = 0;

      if(alarmHour &gt; 23)
         alarmHour = 0;

      update_time();
      display(amin0, amin1, ahour0, ahour1);
   }
}

void update_time(void)
{
   // set time minute display
         if(timeMin &lt; 10){ tmin1 = 0; tmin0 = timeMin; }
         else if(timeMin &lt; 20){ tmin1 = 1; tmin0 = timeMin - 10;}
         else if(timeMin &lt; 30){ tmin1 = 2; tmin0 = timeMin - 20;}
         else if(timeMin &lt; 40){ tmin1 = 3; tmin0 = timeMin - 30;}
         else if(timeMin &lt; 50){ tmin1 = 4; tmin0 = timeMin - 40;}
         else { tmin1 = 5; tmin0 = timeMin - 50;}

   // set alarm minute display
         if(alarmMin &lt; 10){ amin1 = 0; amin0 = alarmMin; }
         else if(alarmMin &lt; 20){ amin1 = 1; amin0 = alarmMin - 10;}
         else if(alarmMin &lt; 30){ amin1 = 2; amin0 = alarmMin - 20;}
         else if(alarmMin &lt; 40){ amin1 = 3; amin0 = alarmMin - 30;}
         else if(alarmMin &lt; 50){ amin1 = 4; amin0 = alarmMin - 40;}
         else { amin1 = 5; amin0 = alarmMin - 50;}

         if(timeHour &lt; 10){ thour1 = 0; thour0 = timeHour; }
         else if(timeHour &lt; 20){ thour1 = 1; thour0 = timeHour - 10;}
         else { thour1 = 2; thour0 = timeHour - 20;}

         if(alarmHour &lt; 10){ ahour1 = 0; ahour0 = alarmHour; }
         else if(alarmHour &lt; 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 &gt; 59){
         timeMin = 0;
         timeHour ++;
      }

      if(timeHour &gt; 23)
         timeHour = 0;

//      while(!pina2 &amp;&amp; !pina3 &amp;&amp; !pina4 &amp;&amp; !pina5);
      counter = 0;
      while(counter &lt; 5000)
         counter ++;

//      counter = 0;
//      while(counter &lt; 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 &amp;&amp; (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 &amp;&amp; pina0 &amp;&amp;
            (timeHour*60+timeMin &gt; alarmHour*60+alarmMin-90) &amp;&amp;
            (timeHour*60+timeMin &lt; 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 &amp;&amp; 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. 有照片/图片补充吗?
清清楚楚的。。。能多详细, 就写的多详细, 才会得到有效的回覆。
回复

使用道具 举报


ADVERTISEMENT

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 27-12-2024 01:48 AM , Processed in 0.681320 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表