2025年5月22日木曜日

Johnny5 with mosquitto

 https://github.com/markwest1972/johnny_five_intro/blob/master/exercises

/06_adding_mqtt_to_the_mix.md を参考に以下のように改変

 別窓からmosquitto_pub -d -t from_client -m left などと指令する


 var five = require("johnny-five");

 var mqtt = require("mqtt");

 var myBoard, myServo, myLed;

 var brightness = 0;

 var commandTopic = 'from_client';

 var responseTopic = 'to_client';


 myBoard = new five.Board();

 myBoard.on("ready", function() {

  myServo = new five.Servo(11);

      myServo.center(); // at first, set to center position

      myLed = new five.Led(5);

      myLed.brightness(brightness); // at first, set to zero

      var options = { host: "localhost", port: "1883" };

      var client  = mqtt.connect(options);

      client.on('connect', function () {

         client.subscribe(commandTopic);

      });

      client.on('message', function (topic, payload) {

        var message = payload.toString(); // very import point

       console.log('Incoming message['+message+']');

// 以下のmyServo.positionはstepで更新されるはず

       if ( message === 'left' )  {

         myServo.step(validateServoMove(20, myServo.position));

         // myServo.position are updatede above code

         client.publish(responseTopic, 'Servo angle ['+myServo.position+']');

       }

       if ( message === 'right' ) {

         myServo.step(validateServoMove(-20, myServo.position));

         client.publish(responseTopic, 'Servo angle ['+myServo.position+']');

       }

       if ( message === 'center' ) {

         myServo.center();

         client.publish(responseTopic, 'Servo angle ['+myServo.position+']');

       }


       if ( message === 'brighter' ) {

         validateAndAdjustLedBrightness(20);

         client.publish(responseTopic, 'LED brightness ['+brightness+']');

       }

       if ( message === 'dimmer' ) {

         validateAndAdjustLedBrightness(-20);

         client.publish(responseTopic, 'LED brightness ['+brightness+']');

       }

    });

 });


  function validateServoMove(adjustment, position){

   var newPosition = (position + adjustment);

  if (newPosition < 0 || newPosition > 180 ) {

      console.log('...Servo cannot be moved further in that direction');

      adjustment = 0;

    }else{

      console.log('...Adjusting Servo to angle ['+(position += 

     adjustment)+']');

  }

  return adjustment;

 }

function validateAndAdjustLedBrightness(adjustment){

  brightness += adjustment;

  if (brightness <= 0) {

    console.log('...LED cannot be dimmed futher');

    brightness = 0;

  }else if (brightness >= 255) {

    console.log('...LED cannot be brightened futher');

    brightness = 255;

  }else{

    console.log('...Adjusting LED to ['+brightness+']');

  }

  myLed.brightness(brightness);

 }


0 件のコメント:

コメントを投稿