• Hello,
    I am trying to port Arduino C code to Puck.JS JavaScript
    and I think I have potential timing issue with use of setWatch on clock PIN
    to read data from data PIN similar to code below.

    Is it possible to find optimal solution to interpret my input PINs
    even with setWatch callback?
    I do not get consistent results reading the data and I am worried that
    only solution would be to have native code handling it?

    What I try to do - storing each data bit on clock edge to array (to be interpreted later)

    var req = 31; //mic REQ
    var dat = 1; //mic Data line
    var clk = 2; //mic Clock line
    var i = 0;
    var a=[];
    pinMode(clk, 'input_pullup');
    pinMode(dat, 'input_pullup');
    pinMode(clk, 'input_pullup');
    setWatch(function () {
            b = digitalRead(dat);
            if (i < 52) {
    }, clk, {
        edge: "rising",
        debounce: 0,
        repeat: true

    Arduino code was similar to
    Arduino is using loop driven by CLK pin vs. Espruino based on JavaScript callback with set Watch for CLK edge...
    My HW is Puck.JS.

    void loop()
        digitalWrite(req, HIGH); // generate set request
        for (i = 0; i < 13; i++)
            k = 0;
            for (j = 0; j < 4; j++)
                while (digitalRead(clk) == LOW) {}
                while (digitalRead(clk) == HIGH) {}
                bitWrite(k, j, (digitalRead(dat) & 0x1)); // read data bits, and reverse order )
            mydata[i] = k;
  • what hardware are interfacing too? there might already be a module you can use - or something similiar that you could modify.

  • The issue you're hitting is that setWatch timestamps the events and put them in a queue to execute with JS - but as you notice it's won't execute JavaScript in the interrupt itself.

    One way around this is to actually watch the data pin for changes as well:

    var currentDat = 0;
    setWatch(function (e) { currentDat = e.state; }, dat, {repeat:true});
    setWatch(function () {
            if (i < 52) {

    However reading clocked data is a really common thing to want to do, so in version 1v96 I added the ability to also record a separate data source using setWatch:

    setWatch(function (e) {
            if (i < 52) {
    }, clk, {
        edge: "rising",
        debounce: 0,
        repeat: true,
       data : dat

    So that should do exactly what you want.

    More info at: http://www.espruino.com/Reference#l__glo­bal_setWatch

    As @Wilberforce says, depending on what you're trying to connect to there might also be a way to set up the underlying hardware to help you out.

  • @Gordon and @Wilberforce Many thanks for quick response. Suggestion to use new setWatch functionality for reading data pin exactly resolved timing issues with data readings.

    I am amazed how Puck.JS and Espruino JavaScript approach makes prototyping so easy including making easy publishing of data via BLE GATT service. We have submitted order for additional Espruino gatgets to learn even more.

  • Great, thanks!

  • Post a reply
    • Bold
    • Italics
    • Link
    • Image
    • List
    • Quote
    • code
    • Preview

failing to read data pin based on clock pin with setWatch and digitalRead

Posted by Avatar for mkol5222 @mkol5222