基本情報

このページではIoTコンテンツ(だれかきたセンサ)をベースにして、新しいコンテンツを「フォーク」できます。フォークしたコンテンツは、プロジェクトの一覧ページに新しい項目として表示されます。元の項目を上書きしたい場合は編集してください。

※写真URLは.jpg, .jpeg, .pngのいずれかで終わるもの、またはGyazoへアップロードされたページのURL(https://gyazo.com/hogehogeなど)に対応しています。

{ "dependencies": { "twitter": "latest" } }

※IoTコンテンツの説明、エントリポイントに関する情報 main: index.js およびf3jsモジュールへの依存情報 dependencies: { f3js: (略) } は、この欄の内容とマージされるため記入不要です。

カードのプレビュー
だれかきたセンサ
'16/9/20 7:51
背後に誰かが来たらお知らせします
石田啓介

プライベートコンテンツ

チェックを外すと、このコンテンツはすぐ一覧に公開され、誰でもアクセスできるようになります。 なるべくコンテンツを共有していただきたいので、チェックは初めから外れています。また、ログインしていない状態ではチェックをつけられません。 一度公開されたコンテンツは、プライベートにできません。(一度チェックを外すと、以降そのコンテンツを編集するときにはチェックをつけられなくなります。)

ソースコード

マイコン・小型コンピュータのプログラムのソースコードを記述してください。f3jsパッケージをrequireすることで筐体設計が可能です。詳しくはAPIドキュメントをご覧ください。

// LCD var LCD = require('jsupm_i2clcd'); var myLcd = new LCD.Jhd1313m1(0, 0x3E, 0x62); // Buzzer var upmBuzzer = require("jsupm_buzzer"); var myBuzzer = new upmBuzzer.Buzzer(6); myBuzzer.setVolume(0.01); myBuzzer.stopSound(); // Slider var upm_grove = require('jsupm_grove'); var mySlide = new upm_grove.GroveSlide(0); // Ultrasonic var ultrasonic = require("jsupm_groveultrasonic"); var mySonic = new ultrasonic.GroveUltraSonic(8); // Motion var grove_motion = require('jsupm_biss0001'); var myMotion = new grove_motion.BISS0001(2); // Servo var servoModule = require("jsupm_servo"); var myServo = new servoModule.ES08A(5); myServo.haltPwm(); ///////////////////////////////////////// var __ = require("underscore"); var Twit = require('twit'); function TweetBuzzer(keys) { var client = new Twit(keys); var r=100, g=100, b=100; // var words = ['love', 'happy', 'hate', 'like', 'angry', 'sad']; // var words = ['apple', 'google', 'microsoft', 'twitter']; var words = ['love', 'hate']; var myLcd, myBuzzer, mySlide; var status, stream; var beep = false; this.run = function(lcd, buzzer, slide, stt) { myLcd = lcd; myBuzzer = buzzer; mySlide = slide; status = stt; var stream = client.stream("statuses/filter", {track: words}); stream.on("tweet", function(tw){ if (status.iru && !beep) onTweet(tw); }); }; this.destroy = function() { stream.destroy(); stream = null; }; //////////////////////// var onTweet = function(tw) { myLcd.setCursor(0,0); myLcd.write(" "); myLcd.setCursor(0,0); myLcd.write("@"+tw.user.screen_name); var note = 3000; var hit = false; myLcd.setCursor(1, 0); myLcd.write(Array(words.length+1).join('_')); __.each(words, function(w, i){ var re = new RegExp(w, 'i'); if (tw.text.match(re)) { myLcd.setCursor(1, words.length-(i+1)); myLcd.write("+"); myLcd.setCursor(1, words.length+1); myLcd.write(Array(15-words.length).join(' ')); myLcd.setCursor(1, words.length+1); myLcd.write(w); note /= words.length - i; hit = true; } }); if (hit) { var vol = mySlide.voltage_value(); if (status.iru && !status.kita && !beep ) { beep = true; if (vol >= 0.1) { myBuzzer.setVolume(0.2*(vol-0.1)); myBuzzer.playSound(note, 50000); myBuzzer.stopSound(); } setTimeout(function(){beep = false}, 10); } } }; } var tb = new TweetBuzzer({ "consumer_key" : "" // Twitter consumer key , "consumer_secret" : "" // Twitter consumer secret , "access_token" : "" // Twitter access token , "access_token_secret" : "" // Twitter access token secret }); ///////////////////////////////////////// function Dareka() { var oshirase_shita = false; var before_dist = 0; var myLcd, upmBuzzer, myBuzzer, myMotion; var status; var kitaInterval; var timeout_iru = 60000 * 3; this.check = function(lcd, upm_buzzer, buzzer, sonic, motion, servo, stt) { status = stt; myLcd = lcd, upmBuzzer = upm_buzzer, myBuzzer = buzzer; mySonic = sonic, myMotion = motion, myServo = servo; kitaInterval = setInterval(function() { if (myMotion.value() === true) { myLcd.setCursor(1, 15); myLcd.write("*"); if (!status.iru) { setTimeout(function(){ status.iru = false; myLcd.setColor(100,100,100); }, timeout_iru); } status.iru = true; myLcd.setColor(255,255,0); } else { myLcd.setCursor(1, 15); myLcd.write(" "); } if (status.iru) { check_dist(); } }, 300); }; this.destroy = function() { clearInterval(kitaInterval); myServo.haltPwm(); }; var check_dist = function() { var travelTime = mySonic.getDistance(); if (travelTime > 0) { var distance = (travelTime / 29 / 2).toFixed(3); // myLcd.setCursor(1,0); // myLcd.write(Math.round(distance)+"[cm]"); // console.log(Math.round(distance)+"[cm]"); if (before_dist - 50 > distance) { if (!status.kita) oshirase(); } before_dist = distance; } }; var oshirase = function() { console.log("Darekairu!"); status.kita = true; myLcd.setColor(255, 0, 0); myBuzzer.setVolume(0.3); myBuzzer.playSound(upmBuzzer.SI/4, 100000); myBuzzer.playSound(upmBuzzer.SI/5, 100000); myBuzzer.playSound(upmBuzzer.SI/6, 100000); /* myBuzzer.playSound(1000000/(440* Math.pow(2, (3/12))/2), 100000); myBuzzer.playSound(1000000/(440* Math.pow(2, (7/12))/2), 100000); myBuzzer.playSound(1000000/(440* Math.pow(2, (10/12))/2), 100000); */ myBuzzer.stopSound(); setTimeout(function(){ status.kita = false; if (status.iru) { myLcd.setColor(255, 255, 0); } else { myLcd.setColor(100, 100, 100); } }, 1000); }; } var dareka = new Dareka(); ///////////////////////////////////////// var stt = { iru: false, kita: false }; tb.run(myLcd, myBuzzer, mySlide, stt); dareka.check(myLcd, upmBuzzer, myBuzzer, mySonic, myMotion, myServo, stt); var f3js = require('f3js'); var dep = 1, w = 2; // 本体ケース var c = f3js.createContainer(); c.x = 8, c.y = 130; var p = c.createPath(); p.moveTo(0, 0); p.jointTo(75, 0, w, dep); p.jointTo(75, 74, w, dep); p.lineTo(65, 74); p.lineTo(65, 45); p.jointTo(28, 45, w, dep); p.lineTo(28, 130); // p.jointTo(0, 130, w, dep); p.lineTo(0, 130); p.jointTo(0, 0, w, dep); p.close(); var plates = p.extrude(114); plates[0].x = 10; plates[0].y = 10; f3js.add(plates[0]); f3js.drawRectangle(66,150,7,15); plates[1].x = 88; plates[1].y = 10; var front = plates[1]; f3js.drawText("isyda", 20, 14); myLcd.rotation = 10; front.add(myLcd, 27, 66, -90); front.add(myBuzzer, 57, 36, 90); front.add(mySlide, 37, 16); front.add(myMotion, 57, 86, 90); f3js.add(plates[1]); plates[2].x = 165; plates[2].y = 10; f3js.add(plates[2]); plates[3].x = 210; plates[3].y = 10; f3js.add(plates[3]); plates[4].x = 90; plates[4].y = 130; f3js.add(plates[4]); plates[5].x = 100; plates[5].y = 130; f3js.add(plates[5]); // Sonicケース var sc = f3js.createContainer(); sc.x = 180, sc.y = 130; var sp = sc.createPath(); sp.moveTo(0, 0); sp.jointTo(60, 0, w, dep); sp.lineTo(60, 50); sp.jointTo(0, 50, w, dep); sp.lineTo(0, 0); sp.close(); f3js.drawRectangle(202.5, 148, 15, 7); var splates = sp.extrude(60); splates[0].x = 180, splates[0].y = 185; f3js.add(splates[0]); splates[1].x = 245, splates[1].y = 130; f3js.add(splates[1]); splates[2].x = 245, splates[2].y = 195; splates[2].add(mySonic, 30, 17) f3js.add(splates[2]); f3js.drawCircle(320, 35, 1); f3js.drawCircle(320, 35+52, 1); // When exiting: clear interval and print message process.on('SIGINT', function() { console.log("Exiting..."); dareka.destroy(); tb.destroy(); myLcd.setColor(100, 100, 100); myBuzzer.stopSound(); process.exit(0); });
カスタマイズ

このコンテンツにはカスタマイズできる項目がありません。

表示オプション
ソースコード中で変数宣言にコメントをつけるとカスタマイズ項目としてGUIウィジェットが表示されます。グレーアウトしているウィジェットはユーザが提案した項目で、ソースコード末尾の変数宣言に対応しています。

設計のダウンロード

モジュール

このプロジェクトは組み立てにモジュールを必要としません。

レイアウト
プログラム

ログインしないと使えない機能です。