From 80bedd3cb341a9452cb470c3ee21950bd0ba424c Mon Sep 17 00:00:00 2001 From: norman-andrians Date: Tue, 5 Mar 2024 00:26:06 +0700 Subject: [PATCH] working servo and photoresistor with websocket --- .env | 2 +- package.json | 1 + src/controller/piezo.ts | 30 +++++++++++------------------- src/controller/pin.ts | 4 ++-- src/handlers/socketHandler.ts | 8 ++++++-- src/index.ts | 8 ++++++-- src/ports/print.ts | 8 ++++++++ src/routes/api.ts | 10 +++++----- test/serial/photoresistor.ts | 15 +++++++++++++++ test/serial/servo.ts | 19 +++++++++++++++++++ test/websocket/common.ts | 19 +++++++++++++++++++ 11 files changed, 93 insertions(+), 31 deletions(-) create mode 100644 src/ports/print.ts create mode 100644 test/serial/photoresistor.ts create mode 100644 test/serial/servo.ts create mode 100644 test/websocket/common.ts diff --git a/.env b/.env index 98b8749..ea5b7eb 100644 --- a/.env +++ b/.env @@ -1 +1 @@ -SERIAL_PORT=ttyUSB0 \ No newline at end of file +SERIAL_PORT=/dev/ttyUSB0 \ No newline at end of file diff --git a/package.json b/package.json index 9a144b8..0afa5a5 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "private": true, "scripts": { "start": "nodemon", + "ports": "ts-node src/ports/print.ts", "test-blink": "nodemon test/blink.js" }, "dependencies": { diff --git a/src/controller/piezo.ts b/src/controller/piezo.ts index f921f54..9eaa93e 100644 --- a/src/controller/piezo.ts +++ b/src/controller/piezo.ts @@ -3,10 +3,9 @@ import { Piezo } from "johnny-five"; import { Pitch } from "../melodies"; export function piezoTone (req: Request, res: Response): Response { - const pin: number = Number.parseInt(req.params.p); - const note: string = req.params.n; + const { pin, note }: { pin: number, note: string } = req.body; - const piezo = new Piezo(pin); + const piezo: Piezo = new Piezo(pin); piezo.play({ song: note.toUpperCase(), @@ -21,13 +20,7 @@ export function piezoTone (req: Request, res: Response): Response { } export function piezoNoTone (req: Request, res: Response): Response { - const pin: number = Number.parseInt(req.params.p); - if (Number.isNaN(pin)) { - return res.status(400).json({ - status: 400, - message: 'Invalid pin param, it should be integer' - }); - } + const { pin }: { pin: number } = req.body; new Piezo(pin).noTone(); @@ -41,18 +34,17 @@ interface MusicSheet { } export function piezoPlayNotes (req: Request, res: Response): Response { - const pin: number = Number.parseInt(req.params.p); + const { pin }: { pin: number } = req.body; const { notes, beats, tempo }: MusicSheet = req.body; - if (Number.isNaN(pin)) { - return res.status(400).json({ - status: 400, - message: 'Invalid pin param, it should be integer' - }); - } - const piezo: Piezo = new Piezo(pin); - const song: [frequency: string, duration: number][] = notes.map((note): [frequency: string, duration: number] => { return [note, beats]}); + const song: [frequency: string, duration: number][] = notes + .map((note, i): [frequency: string, duration: number] => { + const beat = notes[i+1] && notes[i+1].trim() == "-" ? beats*2 : beats; + return [note, beat] + }) + .filter((note) => note[0].trim() != "-"); + const notesS: string = notes.join(", "); piezo.play({ song, tempo }); diff --git a/src/controller/pin.ts b/src/controller/pin.ts index 5bd8f8d..ced91bc 100644 --- a/src/controller/pin.ts +++ b/src/controller/pin.ts @@ -4,7 +4,7 @@ import { sPinModes } from "."; import { Pin } from "johnny-five"; export function readPin (req: Request, res: Response) { - const pin: number = Number.parseInt(req.params.p); + const pin: string = req.params.p; const { mode } = board.pins[pin]; @@ -18,7 +18,7 @@ export function readPin (req: Request, res: Response) { } export function setPin (req: Request, res: Response) { - const pin: number = Number.parseInt(req.params.p); + const pin: string = req.params.p; const mode: sPinModes | string = req.params.m.toUpperCase(); board.pinMode(pin, Pin[mode]); diff --git a/src/handlers/socketHandler.ts b/src/handlers/socketHandler.ts index 58a96b6..68c73e8 100644 --- a/src/handlers/socketHandler.ts +++ b/src/handlers/socketHandler.ts @@ -4,14 +4,18 @@ import { board } from "../setup"; export default (socket: Socket) => { console.log(`${socket.id} | ${socket.client.request.headers.host} | Joined`); - socket.on("control-servo", (pin: number, angle: number) => { + socket.on("control-servo", (p: string, ang: string) => { + const pin = Number.parseInt(p); + const angle = Number.parseInt(ang); + board.servoWrite(pin, angle); - console.log(); + console.log(socket.id, pin, angle); }) socket.on("read-photoresistor", (pin: string) => { board.analogRead(pin, (value) => { socket.emit("read-photoresistor", value); + console.log(socket.id, "A"+pin, value); }); }) } \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 7fba74b..12e7e92 100644 --- a/src/index.ts +++ b/src/index.ts @@ -13,7 +13,11 @@ import socketHandler from './handlers/socketHandler'; const app = express(); const server = http.createServer(app); -const io = new Server(server); // I have no experience at WebSocket, so.. forgive me :) +const io = new Server(server, { + cors: { + origin: "*" + } +}); // I have no experience at WebSocket, so.. forgive me :) const host = 'localhost'; const port = 3000; @@ -27,7 +31,7 @@ app.use('/', view); app.use('/api-arduino', isBoardConnected, api); console.log("\nRunning Server..."); -app.listen(port, host, () => { +server.listen(port, () => { console.log(`Server is connected and running in ${host} at port ${port} 🗣️🗣️🗣️`); console.log(`* Press ${chalk.bold(chalk.yellow("CTRL+C"))} to exit`); console.log(`* URL: ${chalk.bold(`http://${host}:${port}/\n`)}`); diff --git a/src/ports/print.ts b/src/ports/print.ts new file mode 100644 index 0000000..8b45b8c --- /dev/null +++ b/src/ports/print.ts @@ -0,0 +1,8 @@ +import { ReadPorts } from "./read"; + +ReadPorts().then((ports) => { + console.log(`${ports.length} Ports available`); + ports.forEach((port, i) => { + console.log((i+1) + ", " + port); + }) +}) \ No newline at end of file diff --git a/src/routes/api.ts b/src/routes/api.ts index 6b2af8f..e14bfd8 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -12,8 +12,8 @@ router.get('/hello', (req, res: Response): Response => { return res.status(200).send("Hello"); }) -router.get('/pin/:p', isPinNumeric, readPin); -router.patch('/pin/:p/:m', isPinNumeric, setPin); +router.get('/pin/:p', readPin); +router.patch('/pin/:p/:m', setPin); router.get('/led/:p', isPinNumeric, readLed); router.patch('/led/:p/:a', isPinNumeric, writeLed); @@ -21,8 +21,8 @@ router.patch('/led/:p/:a', isPinNumeric, writeLed); router.get('/rgb-led', readRgbLed); router.patch('/rgb-led/', writeRgbLed); -router.patch('/piezo/:p/:n', isPinNumeric, piezoTone); -router.patch('/piezo/stop/:p/', isPinNumeric, piezoNoTone); -router.patch('/piezo/music/:p', isPinNumeric, piezoPlayNotes); +router.patch('/piezo/', piezoTone); +router.patch('/piezo/stop/', piezoNoTone); +router.patch('/piezo/music/', piezoPlayNotes); export default router; \ No newline at end of file diff --git a/test/serial/photoresistor.ts b/test/serial/photoresistor.ts new file mode 100644 index 0000000..570abda --- /dev/null +++ b/test/serial/photoresistor.ts @@ -0,0 +1,15 @@ +import { Board, Pin } from "johnny-five"; + +const board: Board = new Board({ + port: '/dev/ttyUSB0', + debug: false, + repl: false +}); + +board.on("ready", async () => { + board.pinMode(14, Pin.INPUT); + + board.analogRead(0, (val) => { + console.log(val); + }) +}); \ No newline at end of file diff --git a/test/serial/servo.ts b/test/serial/servo.ts new file mode 100644 index 0000000..03a949d --- /dev/null +++ b/test/serial/servo.ts @@ -0,0 +1,19 @@ +import { Board, Pin, PinMode } from "johnny-five"; + +const board: Board = new Board({ + port: '/dev/ttyUSB0', + debug: false, + repl: false +}); + +board.on("ready", async () => { + board.pinMode(9, Pin.SERVO); + board.servoWrite(9, 0); + + while (true) { + board.servoWrite(9, 180); + await new Promise(resolve => setTimeout(resolve, 1000)); + board.servoWrite(9, 0); + await new Promise(resolve => setTimeout(resolve, 1000)); + } +}); \ No newline at end of file diff --git a/test/websocket/common.ts b/test/websocket/common.ts new file mode 100644 index 0000000..1cd8a74 --- /dev/null +++ b/test/websocket/common.ts @@ -0,0 +1,19 @@ +import http from 'node:http'; +import express from 'express'; +import { Server } from "socket.io"; + +const app = express(); +const server = http.createServer(app); +const io = new Server(server); + +io.on("connection", (socket) => { + console.log("Connected"); + + socket.on("message", (message) => { + console.log(message); + }) +}) + +server.listen(3001, "localhost", () => { + console.log("Common server is running"); +}) \ No newline at end of file