Personally I would just write a handler for the NRF.on("NFCoff", event that checks the contents of the card each time the NFC reader turns off the field - after some playing that seems to be the most sensible.
Here's some code that works without using a module:
var data = new Uint8Array(10+64);
var header = NRF.nfcStart();
var written = false;
data.set(header,0); // NFC device header
data.set([0,0,0xE1,0x10,(data.length-10)/8,0,0,3,0,0xFe], 0x0A); // NDEF tag header
// 0,0,e1
NRF.on('NFCrx', function(rx) {
var idx = rx[1]*4;
switch(rx[0]) {
case 0x30: //command: READ
NRF.nfcSend(new Uint8Array(data.buffer, idx, 16));
break;
case 0xa2: //command: WRITE
written = true;
if(idx > data.length) {
NRF.nfcSend(0x0);
} else {
data.set(new Uint8Array(rx, 2, 4), idx);
NRF.nfcSend(0xA);
}
break;
default: //just, re-enable rx
NRF.nfcSend();
break;
}
});
NRF.on("NFCoff",function() {
if (written)
onWritten(E.toString(new Uint8Array(data.buffer,26,data[21]-3)));
written = false;
});
function onWritten(data) {
console.log("NFC written", data);
var colors = {
red : 1,
green : 2,
blue : 4,
};
if (colors[data]) {
digitalWrite([LED3,LED2,LED1], colors[data]); // onwards
setTimeout(function() {
digitalWrite([LED3,LED2,LED1], 0);
},1000);
}
}
You can even control it using a webpage!
<html>
<body>
<script>
/* Starting a scan at startup stops Android from
moving away from the Chrome window when a tag is found*/
const reader = new NDEFReader();
const writer = new NDEFWriter();
reader.scan();
function send(msg) {
writer.write(msg).then(_=>console.log("Written ",msg));
}
</script>
<button onclick="send('red')">Red</button>
<button onclick="send('green')">Green</button>
<button onclick="send('blue')">Blue</button>
</body>
</html>
Espruino is a JavaScript interpreter for low-power Microcontrollers. This site is both a support community for Espruino and a place to share what you are working on.
Personally I would just write a handler for the
NRF.on("NFCoff",
event that checks the contents of the card each time the NFC reader turns off the field - after some playing that seems to be the most sensible.Here's some code that works without using a module:
You can even control it using a webpage!