Arduino Polska Forum

Pełna wersja: Problem z serialport Node.js i komunikacja web - Arduino Pro Mini - Ratunku! :)
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Cześć!
Poszukuję rozwiązania problemu, buduję swoja strone lokalną, która ma sie komunikować z Arduino Pro mini (z czujnikami) i mają sobie przesyłać komunikaty i podejmowac akcje w zalezności od nich lub nie...

Mam Windows 11, zastosowałem serwer Node.js i jego bibliotekę 'serialport' do komunikacji przez port com, celem jest najpierw poinformowanie Arduino o początku sesji, niby to opanowałem, ale wyskakuje błąd w momencie próby komunikacji z Arduino:

"TypeError: SerialPort is not a constructor
at C:\...\.........\js\app.js:20:25
at Layer.handle [as handle_request] (C:\...\node_modules\express\lib\router\layer.js:95:5)
at next (C:\...\node_modules\express\lib\router\route.js:144:13)
at Route.dispatch (C:\...\node_modules\express\lib\router\route.js:114:3)
at Layer.handle [as handle_request] (C:\...\node_modules\express\lib\router\layer.js:95:5)
at C:\...\node_modules\express\lib\router\index.js:284:15
at Function.process_params (C:\...\node_modules\express\lib\router\index.js:346:12)
at next (C:\...\node_modules\express\lib\router\index.js:280:10)
at C:\...\node_modules\body-parser\lib\read.js:137:5
at AsyncResource.runInAsyncScope (node:async_hooks:203:9)"

* '/../' - ta sama ścieżka we wszystkich linkach.

Próbowałem reinstalować bibl. 'serialport', restartować node i komputer, testowałem port COM3 i COM4 - nie ma skutku...

Kod w pliku app.js w projekcie jest taki:
Kod:
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const port = 8080;

// Parsowanie treści żądania POST
app.use(bodyParser.urlencoded({ extended: true }));

// Obsługa żądania GET na stronę główną
app.get('/', (req, res) => {
    //res.sendFile(__dirname + '/../index.html');
    res.sendFile('C:/.../index.html'); //ścieżka bezwzględna - bo o jeden katalog wyżej niż plik projektu app.js
});

// Obsługa żądania POST od formularza
app.post('/rozpocznij-sesje', (req, res) => {
    // Tutaj kod, który wysyła sygnał do Arduino
    const SerialPort = require('serialport');
    const arduinoPort = new SerialPort('COM3', { baudRate: 9600 });

    // Wysyłamy sygnał do Arduino
    arduinoPort.write('ROZPOCZNIJ_SESJE\n', (err) => {
        if (err) {
            console.error('Błąd podczas wysyłania danych do Arduino:', err);
        } else {
            console.log('Wysłano sygnał do Arduino o rozpoczęciu sesji.');
        }
    });

    res.send('Sesja została rozpoczęta.'); // Odpowiedź dla klienta przeglądarki
});

// Start serwera na określonym porcie
app.listen(port, () => {
    console.log(`Serwer uruchomiony na porcie ${port}`);
});


Czy ktoś się z czymś podobnym spotkał? Co mam zrobić?

Może są inne, lepsze biblioteki? Ale darmowe?

Z góry dziękuję za zainteresowanie i pomoc
Lessin72
Kod:
    const SerialPort = require('serialport');
    const arduinoPort = new SerialPort('COM3', { baudRate: 9600 });

Tak w ogóle to problem wydaje się być poza tematem forum - może poszukaj pomocy na jakimś forum o JS.

Ja nie znam tego języka, ale zapytałem google i dostałem przykład gdzie nie używają new do SerialPort,
tylko używają tego jak funkcji

ardiunoPort = SerialPort( -- jakieś parametry --);
Też nie mam pojęcia o czym piszesz @Lession, ale często wykorzystuję sterowanie uC ze strony WWW zamiast LCD i przycisków.
Do ESP8266 (bo tańsze i nierzadko lepsze) wgrywam serwer websockets, strona WWW może być zapisana w ESP, może być też uruchamiana na PC z parametrem, że nie gada z localhost, tylko z jakimś IP. Wewnątrz kodu strony mam funkcje JS które reagują na dane przysyłane z ESP, albo wysyłają działania operatora na suwakach, przyciskach i polach tekstowych strony WWW.
Przykład dla ESP32, gdzieś obok jest też dla ESP8266.  https://github.com/kaczakat/ESP32_websoc...etsOTA.ino
Uno jest za małe by to ogarnąć z shieldem Ethernet, jest biblioteka ale tylko dla klienta websockets.
Jeśli nawet z jakiegoś powodu musiałbym użyć Atmega328 to przykład z websockets wszystkie wnioski z działania drukuje na Serial i może to być wprost użyte jako polecenia dla UNO/NANO, a ESP pełniłby funkcję modemu WIFI.
(18-09-2023, 14:37)Lession napisał(a): [ -> ]
(18-09-2023, 11:43)kaczakat napisał(a): [ -> ]Też nie mam pojęcia o czym piszesz @Lession, ale często wykorzystuję sterowanie uC ze strony WWW zamiast LCD i przycisków.
Do ESP8266 (bo tańsze i nierzadko lepsze) wgrywam serwer websockets, strona WWW może być zapisana w ESP, może być też uruchamiana na PC z parametrem, że nie gada z localhost, tylko z jakimś IP. Wewnątrz kodu strony mam funkcje JS które reagują na dane przysyłane z ESP, albo wysyłają działania operatora na suwakach, przyciskach i polach tekstowych strony WWW.
Przykład dla ESP32, gdzieś obok jest też dla ESP8266.  https://github.com/kaczakat/ESP32_websoc...etsOTA.ino
Uno jest za małe by to ogarnąć z shieldem Ethernet, jest biblioteka ale tylko dla klienta websockets.
Jeśli nawet z jakiegoś powodu musiałbym użyć Atmega328 to przykład z websockets wszystkie wnioski z działania drukuje na Serial i może to być wprost użyte jako polecenia dla UNO/NANO, a ESP pełniłby funkcję modemu WIFI.

Dzięki! Mogę spróbować? A mogę dowiedzieć się przy pomocy jakiego programu programujesz to to: ESP8266?
Masz tam przecież szkice .ino do Arduino IDE. ESP8266 i ESP32 dodaje się do Arduino jako dodatkowe płytki, core esp8266 czy core esp32, tutoriali znajdziesz wszędzie na pęczki. Wtedy używałem core ESP 2.5.2, jak wyskoczą jakieś błędy to biblioteki użyte powinny być z tego mniej więcej okresu. Oczywiście to jeden ze sposobów.
Jak proces nie jest skomplikowany i chcesz do płytki podłączyć jakiś LCD czy oled, sterować jakimś przekaźnikiem wg prostych zależności, np. godzina konkretna, albo wschód słońca, czujnik DS18B20 to można wgrać gotowy firmware TASMOTA, albo ESPEASY, działanie można wyklikać sobie z menu WWW.
Z Tasmotą i jakimś domowym serwerem jak Home Assistant czy Domoticz możesz z kolei zrobić całą sieć urządzeń IOT, które gadają ze sobą i podejmują czynności, np. czujnik w kuchni pod zlewem został zalany bo pękł wężyk, w przedpokoju uruchamia się pipkacz i na LCD pokazuje jaki jest problem i gdzie, kolejne odłączają pralkę i inne sprzęty zasilane w wodę od prądu, ten w kotłowni zamyka główny zawór wody z siłownikiem elektrycznym, a z serwera dostajesz na telefon powiadomienia o wszystkich alarmach i wykonanych czynnościach nawet jak Cię nie ma w domu i nie możesz usłyszeć alarmu z buzera w przedpokoju.
Interfejs sprzętowy do programowania ESP zależy od wybranej płytki, popularny WEMOS mini ma tak jak UNO wbudowany USB-UART na chipie CH340.
ESP8266 ma tylko 9 pinów zdatnych do użycia, wystarczająco by sporo podłączyć, są na logice 3.3V. Piny to może być problem, ale po to ma WIFI by ten w kotłowni sterował tylko zaworem, ten pod zlewem tylko miał jeden czujnik analogowy, a ten w przedpokoju ekran na I2C i jedno cyfrowe wyjście do pikania, kilka przycisków do interakcji i wyłączenia wycia.