// 2020/1/6 nakajima@netstock.co.jp // センサー・タイマーコントローラー var G = null; var ABTN = B13; var BBTN = B14; var MC1 = B3; var MC2 = B4; var SENSOR = B5; var Status = {}; var Edit = null; var ABTNdtime = null; var BBTNdtime = null; var RunTimer = null; var StopTimer = null; var WaitSensor = false; pinMode(ABTN, "input_pulldown"); pinMode(BBTN, "input_pulldown"); pinMode(SENSOR, "input"); I2C1.setup({scl:B6,sda:B7}); function ABTNpush() { chggostop(); show(); } function BBTNpush() { if(Status.run != 0) return; if(Edit == "d") { chgdirection(); } else if(Edit == "m") { chgmode(); } else if(Edit == "r") { chgrunsec(); } else if(Edit == "s") { chgrstopsec(); } show(); } function BBTNpushlong() { if(Status.run != 0) return; chgedit(); show(); } function ABTNwatch(status){ //console.log('A', status.state); if(status.state) { ABTNdtime = status.time; } else { var ptime = status.time - ABTNdtime; //console.log('A', ptime); ABTNpush(); } } function BBTNwatch(status){ //console.log('B', status.state); if(status.state) { BBTNdtime = status.time; } else { var ptime = status.time - BBTNdtime; //console.log('B', ptime); if(ptime > 0.5) { BBTNpushlong(); } else { BBTNpush(); } } } function SENSORwatch(status){ var s = ! status.state; digitalWrite(LED1, s); //console.log('S', s); if((Status.mode == "s" || Status.mode == "sr") && WaitSensor) { WaitSensor = false; Status.run = 1; gostop(); StopTimer = setTimeout(stoptimeout, Status.stopsec * 1000); show(); } } function chggostop() { if(Status.run == 0) { Status.run = 2; gostop(); if(Status.mode != "m") { RunTimer = setTimeout(runtimeout, Status.runsec * 1000); } } else { Status.run = 0; gostop(); if(RunTimer) { clearTimeout(RunTimer); RunTimer = null; } if(StopTimer) { clearTimeout(StopTimer); StopTimer = null; } } } function runtimeout() { if(Status.mode == "t" || Status.mode == "tr") { Status.run = 1; gostop(); StopTimer = setTimeout(stoptimeout, Status.stopsec * 1000); } else { WaitSensor = true; } show(); } function stoptimeout() { if(Status.mode == 'tr' || Status.mode == 'sr') chgdirection(); Status.run = 2; gostop(); RunTimer = setTimeout(runtimeout, Status.runsec * 1000); show(); } function gostop(){ if(Status.run == 0 || Status.run == 1) { digitalWrite(MC1, false); digitalWrite(MC2, false); } else { if(Status.direction == 1) { digitalWrite(MC2, false); digitalWrite(MC1, true); } else { digitalWrite(MC1, false); digitalWrite(MC2, true); } } } function show(){ var g = G; g.clear(); g.setFontVector(16); var inedit = Status.run == 0; var runstr = Status.run == 0 ? "STOP" : (Status.run == 1 ? "AUTOSTOP" : "GO"); var dirstr = Status.direction == 1 ? '<' : '>'; if(inedit && Edit == 'd') dirstr = "[" + dirstr + "]"; g.drawString(dirstr + " " + runstr, 0, 0); var modestr = (Status.mode == 'm' ? 'Manual' : (Status.mode == 't' ? 'Timer' : (Status.mode == 'tr' ? 'Timer Reverse' : (Status.mode == 's' ? 'Sensor' : (Status.mode == 'sr' ? 'Sensor Reverse' : '' ))))); if(inedit && Edit == 'm') modestr = "[" + modestr + "]"; g.drawString(modestr, 0, 20); var rsstr = Status.runsec + "s"; if(inedit && Edit == 'r') rsstr = "[" + rsstr + "]"; var ssstr = Status.stopsec + "s"; if(inedit && Edit == 's') ssstr = "[" + ssstr + "]"; g.drawString(rsstr + "/" + ssstr, 0, 40); g.flip(); } function chgdirection() { if(Status.direction == 1) { Status.direction = 2; } else if(Status.direction == 2) { Status.direction = 1; } } function chgmode() { if(Status.mode == 'm') { Status.mode = 't'; } else if(Status.mode == 't') { Status.mode = 'tr'; } else if(Status.mode == 'tr') { Status.mode = 's'; } else if(Status.mode == 's') { Status.mode = 'sr'; } else if(Status.mode == 'sr') { Status.mode = 'm'; } } function chgrunsec(){ if(Status.runsec <= 30) { Status.runsec = 60; } else if(Status.runsec <= 60) { Status.runsec = 90; } else if(Status.runsec <= 90) { Status.runsec = 120; } else { Status.runsec = 30; } } function chgrstopsec(){ if(Status.stopsec <= 30) { Status.stopsec = 60; } else if(Status.stopsec <= 60) { Status.stopsec = 90; } else if(Status.stopsec <= 90) { Status.stopsec = 120; } else { Status.stopsec = 30; } } function chgedit(){ if(Edit == "d") { Edit = "m"; } else if(Edit == "m") { Edit = "r"; } else if(Edit == "r") { Edit = "s"; } else if(Edit == "s") { Edit = "d"; } } function start(){ setWatch(ABTNwatch, ABTN, {repeat: true, debounce : 50}); setWatch(BBTNwatch, BBTN, {repeat: true, debounce : 50}); setWatch(SENSORwatch, SENSOR, {repeat: true}); gostop(); show(); } function init(){ Status = { run: 0, // 0:stop, 1:autostop, 2:go direction: 1, // 1 or 2 mode: 'm', // m: manual, t: timer, s: sensor, tr: timer(reverse), sr: sensor(reverse) runsec: 30, stopsec: 30, }; Edit = 'd'; // d: direction, m: mode, r: runsec, s: stopsec WaitSensor = false; G = require("SSD1306").connect(I2C1, start); } E.on('init', init);