import ddf.minim.*;
import ddf.minim.signals.*;
import ddf.minim.analysis.*;
import ddf.minim.effects.*;
Minim minim;
AudioPlayer song;
int MARGIN = 20;
Clock myClock = new Clock();
int time1 = 0;
int time2 = 0;
void setup() {
size(700,500);
minim = new Minim(this);
song = minim.loadFile(".mp3");//指定のファイル名
smooth();
frameRate(30);
}
void draw() {
stroke(255);
background(0);
myClock.getTime();
myClock.draw();
}
class Clock {
float s, m, h;
Clock(){
}
void getTime(){
s = second();
m = minute() + (s/60.0);
h = hour()%12 + (m/60.0);
}
void draw(){
fill(255);
//指定の時間になったら音と文字がでる
if(time1==hour() & time2==minute()){
if(song.isPlaying()){
}else{
song.play();
}
text("Get up!!",500,400);
}
//右側の指定時間描画
fill(255);
rect(450,200,120,40);
fill(0);
stroke(0);
ellipse(510,212,2,2);
ellipse(510,230,2,2);
fill(255);
stroke(255);
int a=470;
int b=185;
rect(465,175,20,15);
rect(465+60,175,20,15);
rect(465,175+75,20,15);
rect(465+60,175+75,20,15);
stroke(0);
fill(0);
triangle(a,b,a+8,b,a+4,b-5);
triangle(a,b+70,a+8,b+70,a+4,b+70+5);
triangle(a+60,b,a+8+60,b,a+4+60,b-5);
triangle(a+60,b+70,a+8+60,b+70,a+4+60,b+70+5);
textSize(38);
text(nf(time1,2),455,235);
text(nf(time2,2),455+60,235);
int lenge = 200;
//ストップボタン
fill(255);
rect(460,95,100,45);
fill(0);
textSize(38);
text("Stop",470,130);
//点の描画
translate(lenge, lenge);
rotate(radians(180));
pushMatrix();
fill(128);
noStroke();
for(int i=0; i<60; i++){
rotate(radians(6));
ellipse(lenge-MARGIN,0,3,3);
}
for(int i=0; i<12; i++){
rotate(radians(30));
ellipse(lenge-MARGIN,0,10,10);
}
//針の描画
popMatrix();
noFill();
stroke(255);
pushMatrix();
rotate(radians(s*(360/60)));
strokeWeight(1);
line(0,0,0,lenge-MARGIN);
popMatrix();
pushMatrix();
rotate(radians(m*(360/60)));
strokeWeight(2);
line(0,0,0,lenge-MARGIN);
popMatrix();
pushMatrix();
rotate(radians(h*(360/12)));
strokeWeight(4);
line(0,0,0,(lenge*3)/4-MARGIN);
popMatrix();
}
}
void mousePressed(){
//時間指定
if(mouseX>465 & mouseX<485){
if(mouseY>175 & mouseY<190){
if(time1<23){
time1++;
}else if(time1==23){
time1=0;
}
}else if(mouseY>250 & mouseY<265){
if(time1>0){
time1--;
}else if(time1==0){
time1=23;
}
}
}
if(mouseX>465+60 & mouseX<485+60){
if(mouseY>175 & mouseY<190){
if(time2<59){
time2++;
}else if(time2==59){
time2=0;
}
}else if(mouseY>250 & mouseY<265){
if(time2>0){
time2--;
}else if(time2==0){
time2=59;
}
}
}
//Stopボタンの判定(音が止まる)
if(mouseX>460 & mouseX<560 & mouseY>95 & mouseY<140){
song.close();
song = minim.loadFile(".mp3");//指定の音声ファイル(上と同じ推奨?)
}
}
void stop(){
song.close();
minim.stop();
super.stop();
}
直接あって話とか、メールとか、合宿前までに設定するの面倒だと思うので。
- とりあえず最低限のことは書いたつもり。不足等あればコメントないし直接変更をしてください。 -- 西中 2012-05-11 (金) 01:57:20
- 各班4回生はすごい準備しているぞ~危機感もったほうがいいぞ -- なか 2012-05-17 (木) 16:54:34
- 時間判定を追加 -- 西中 2012-05-19 (土) 01:42:39
- とりあえず基本的な目ざまし時計としての体裁は出来ていると思います。 -- 西中 2012-05-19 (土) 02:23:55
- 申し訳ないですが後はよろしくお願いします。 -- 西中 2012-05-19 (土) 02:24:43
- 時間判定を追加 -- 西中 2012-05-19 (土) 02:33:27
- 時計まわり丸々いただきました。すげぇ -- 12_Inou 2012-05-20 (日) 15:16:03
void setup(){
pinMode(2,INPUT);
pinMode(3,OUTPUT);
Serial.begin(9600);
}
int value = 0;
boolean before = false;
long beforeTime = 0;
void loop(){
if(digitalRead(2) == HIGH){ //もし今光っていて
if(before){ //もし一回前のループで光っていた
//なら変化なし
if(micros() - beforeTime > 1000000){
digitalWrite(3,LOW);//青LED消灯
Serial.print(0);
}
}else{ //一回前のループで光っていなかった
//なら変化した
if(micros() - beforeTime > 1000000){
//寝返り打った?レム睡眠だ!
digitalWrite(3,HIGH); //青LED光らせる
Serial.print(1);
}
beforeTime = micros();
}
before = true; //今回のループでは光った
}else{ //今のループで光っていなくて
if(before){ //もし一回前のループで光っていた
if(micros() - beforeTime > 1000000){ //変化した
//寝返り打った?レム睡眠だ!
digitalWrite(3,HIGH); //青LED点灯
Serial.print(1);
}
beforeTime = micros();
}else{ //一回前光っていなかったら
if(micros() - beforeTime > 1000000){ //変化なし
digitalWrite(3,LOW); //青LED消灯
Serial.print(0);
}
}
before = false; //今回のループでは光っていなかった
}
}
import ddf.minim.*;
import ddf.minim.signals.*;
import ddf.minim.analysis.*;
import ddf.minim.effects.*;
import processing.serial.*;
Serial arduino;
Clock clock;
Minim minim;
AudioPlayer song;
int[] millisAry = {0};
String[] lineAry = {"time,ms,dif"};
boolean isRem(int[] ary){
int average = 0;
int temp = 0;
for(int i=ary.length-1; i>0; i--){
temp = temp + ary[i];
if(temp >= 5*60*1000){ //5分前の記録まで読み込む
average = temp/(ary.length - i);
break;
}
}
if(average < 5*60*1000/5){ //5分間に5回の動きを検出した
return true;
}
return false;
}
//EventHandlers/////////////////////////////////////////////////////////////
void setup(){
println(Serial.list());
arduino = new Serial(this,Serial.list()[2],9600);
minim = new Minim(this);
song = minim.loadFile("GET UP - Sergej Smile.mp3");
clock = new Clock();
size(700,500);
smooth();
frameRate(30);
}
void draw(){
background(0);
clock.checkAlarm(isRem(millisAry));
clock.refresh();
}
void serialEvent(Serial p){
if(arduino.read() == 49){
int[] tempAry = new int[millisAry.length+1];
int temp = 0;
for(int i=0; millisAry.length>i; i++){
tempAry[i] = millisAry[i];
temp = temp + tempAry[i];
}
tempAry[millisAry.length] = millis() - temp;
millisAry = tempAry;
//write log
String[] tempAry2 = new String[lineAry.length+1];
for(int i=0; lineAry.length>i; i++){
tempAry2[i] = lineAry[i];
}
tempAry2[lineAry.length] = nf(hour(),2)+":"+nf(minute(),2)+","+millis()+","+millisAry[millisAry.length-1];
lineAry = tempAry2;
println(lineAry[lineAry.length-1]);
saveStrings("log"+year()+"-"+month()+"-"+day()+".csv",lineAry);
}
}
//ClockClass/////////////////////////////////////////////////////////////
class Clock{
float s,m,h;
int alarmHour = 6;
int alarmMinute = 0;
boolean isAlarmSet = true;
Clock(){
this.getTime();
}
void refresh(){
this.getTime();
this.draw();
}
void getTime(){
s = second();
m = minute() + (s/60);
h = hour()%12 + (m/60);
}
void checkAlarm(boolean isRem){
if(isRem && this.isAlarmSet && abs((hour()*60 + minute()) - (this.alarmHour*60 + this.alarmMinute)) < 90){
if(song.isPlaying() == false){
song.play();
}
fill(255,0,0);
textSize(38);
text("Wake up!!",425,65);
}
}
void draw(){
//右側の指定時間描画
//[6:00]
stroke(255);
fill(255);
rect(450,200,120,40);
stroke(0);
fill(0);
ellipse(510,212,2,2);
ellipse(510,230,2,2);
textSize(38);
text(nf(this.alarmHour,2),455,235);
text(nf(this.alarmMinute,2),455+60,235);
//[A][V]
stroke(255);
fill(255);
rect(465,175,20,15);
rect(465+60,175,20,15);
rect(465,175+75,20,15);
rect(465+60,175+75,20,15);
int a = 470;
int b = 185;
stroke(0);
fill(0);
triangle(a,b,a+8,b,a+4,b-5);
triangle(a,b+70,a+8,b+70,a+4,b+70+5);
triangle(a+60,b,a+8+60,b,a+4+60,b-5);
triangle(a+60,b+70,a+8+60,b+70,a+4+60,b+70+5);
if(mousePressed){
if(mouseX > 465 && mouseX < 485){//時間時指定
if(mouseY > 175 && mouseY < 190){//[A]
if(this.alarmHour < 23){
this.alarmHour += 1;
}else{
this.alarmHour = 0;
}
this.isAlarmSet = true;
delay(100);
}else if(mouseY > 250 && mouseY < 265){//[V]
if(this.alarmHour > 0){
this.alarmHour -= 1;
}else{
this.alarmHour = 23;
}
this.isAlarmSet = true;
delay(100);
}
}else if(mouseX > 465 + 60 && mouseX < 485 + 60){//時間分指定
if(mouseY > 175 && mouseY < 190){//[A]
if(this.alarmMinute < 59){
this.alarmMinute += 1;
}else{
this.alarmMinute = 0;
}
this.isAlarmSet = true;
delay(100);
}else if(mouseY>250 && mouseY<265){//[V]
if(this.alarmMinute > 0){
this.alarmMinute -= 1;
}else{
this.alarmMinute = 59;
}
this.isAlarmSet = true;
delay(100);
}
}
}
//[STOP]
stroke(255);
fill(255);
rect(460,95,100,45);
stroke(0);
fill(0);
textSize(38);
text("Stop",470,130);
if(mousePressed){
if(mouseX>460 && mouseX<560 && mouseY>95 && mouseY<140){
this.isAlarmSet = false;
song.close();
song = minim.loadFile("GET UP - Sergej Smile.mp3");
}
}
//clock
int lenge = 200;
int MARGIN = 20;
//点の描画
translate(lenge, lenge);
rotate(radians(180));
pushMatrix();
strokeWeight(0);
fill(128);
for(int i=0; i<60; i++){
rotate(radians(6));
ellipse(lenge-MARGIN,0,3,3);
}
for(int i=0; i<12; i++){
rotate(radians(30));
ellipse(lenge-MARGIN,0,10,10);
}
//針の描画
popMatrix();
stroke(255);
pushMatrix();
rotate(radians(s*(360/60)));
strokeWeight(1);
line(0,0,0,lenge-MARGIN);
popMatrix();
pushMatrix();
rotate(radians(m*(360/60)));
strokeWeight(2);
line(0,0,0,lenge-MARGIN);
popMatrix();
pushMatrix();
rotate(radians(h*(360/12)));
strokeWeight(4);
line(0,0,0,(lenge*3)/4-MARGIN);
popMatrix();
}
}