Skocz do zawartości

Kurs ESP8266 - #4 - wykresy, zapis do FS, mini smartdom


Leoneq

Pomocna odpowiedź

A mam takie pytanko bo dotychczas bazujemy na lokalnym serwerze a jakbyśmy chcieli sterować esp za pomocą  strony internetowej z dowolnego miejsca na świecie to czy wystarczy wykupić sobie hosting i przenieść cały folder z projktem z VSC na serwer ? bo próbowałem robić tak za pomoca filezilla ale wczytało na serwer samą strone (sam html z css) bez plików z kodami odpowiedzialnymi za sterowanie esp i jak wciskam przyciski na stronie  która jest na tym hostingu to nic się nie dzieje 

Link do komentarza
Share on other sites

@fizyk89 witam na forum 🙂 Dodatkowy serwer z plikami wiele tutaj nie pomoże. Kluczowe jest to, aby ESP miało dostęp do Internetu (publiczne IP), wtedy równie dobrze pliki mogą być nadal na ESP. Oczywiście to tylko jedna z metod, bo można to zrealizować za pośrednictwem jakiegoś serwera, ale mam wrażenie, że nie o to Ci chodzi. Daj znać co konkretnie próbujesz zrobić, bo może są na to jakieś gotowe rozwiązania 🙂 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Informatykiem z wykształcenia nie jestem, choć jak pamiętam odblokowanie adresu IP (oraz portu) publicznie może się wiązać z potencjalnymi atakami. Co więcej, należałoby mieć stały adres IP (lub usługę typu no-ip), żeby połączenie nie było przydzielane pod nowy adres.

Proponuję postawić sobie VPNa - więc z dowolnego miejsca tak jak chciałeś, twój laptop byłby widziany jakby był po prostu w Twojej sieci lokalnej. Wtedy możesz się połączyć tak samo, jak lokalnie.

Koncepcja z przeniesieniem strony z ESP na hosting 'tak o' się nie uda, bo jak nawet sam wspomniałeś - nie ma plików z kodem, więc przyciski nie wiedzą co robić.

Link do komentarza
Share on other sites

Na stronie Chart.js znajduje się wiele przykładów.

By z nich skorzystać, nie można pominąć

https://www.chartjs.org/docs/latest/getting-started/

Dołączamy bibliotekę Chart.js

<script src="https://cdn.jsdelivr.net/npm/chart.js"></script> 

Tworzymy płótno do "malowania"

<canvas id="myChart" width="400" height="200"></canvas>

var ctx = document.getElementById("myChart").getContext("2d");

Wklejamy Setup z przykladów

Wklejamy Config

var myChart = new Chart(ctx, config);

Jeżeli prezentujemy zależność czasową, warto ustawić oś X na time scale.

options: {
        scales: {
            x: {
                type: 'time',
                time: {
                    unit: 'hour',
                    //parser: 'DD.MM.YY HH:mm', // Define the custom time format
                    displayFormats: {
                        hour: 'DD.MM.YY HH:mm',
                    },

Rozwiąże to problem niezachowania skali przy nierównych odstępach czasu pomiędzy pomiarami.

Do służby czasu, Chart.js wymaga jeszcze dołączenia Moment.js

<script src="https://cdn.jsdelivr.net/npm/moment"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-moment"></script>

W całości:

<!DOCTYPE html>
<html>
   <head>
      <title>Readings</title>
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
      <script src="https://cdn.jsdelivr.net/npm/moment"></script>
      <script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-moment"></script>
   </head>
   <body>
      <div class="chart-container" style="position: relative; width: 100%; height: calc(width/1.4);">
         <canvas id="readingsChart" aria-label="chart"></canvas>
      </div>
      <script>
         var ctx = document.getElementById("readingsChart").getContext("2d");

         var data = [];

         let config = {
             type: 'line',
             data: {
                 datasets: [{
                     label: 'Voltage',
                     data: data.map(point => ({
                         x: point.x,
                         y: point.voltage
                     })),
                     borderColor: 'rgba(75, 192, 192, 1)',
                     backgroundColor: 'rgba(75, 192, 192, 0.2)',
                     borderWidth: 1,
                     pointRadius: 5,
                     pointHoverRadius: 8,
                     yAxisID: 'y',
                 }, {
                     label: 'Current',
                     data: data.map(point => ({
                         x: point.x,
                         y: point.current
                     })),
                     borderColor: 'rgba(255, 99, 132, 1)',
                     backgroundColor: 'rgba(255, 99, 132, 0.2)',
                     borderWidth: 1,
                     pointRadius: 5,
                     pointHoverRadius: 8,
                     yAxisID: 'y1',
                 }],
             },
             options: {
                 scales: {
                     x: {
                         type: 'time',
                         time: {
                             unit: 'hour',
                             //parser: 'DD.MM.YY HH:mm', // Define the custom time format
                             displayFormats: {
                                 hour: 'DD.MM.YY HH:mm',
                             },
                         },
                         title: {
                             display: false,
                             text: 'Time',
                         },
                         ticks: {
                             //maxTicksLimit: 6
                             maxRotation: 0,
                             autoskip: true,
                             autoSkipPadding: 15
                         },
                     },
                     y: {
                         id: 'y',
                         type: 'linear',
                         position: 'left',
                     },
                     y1: {
                         id: 'y1',
                         type: 'linear',
                         position: 'right',
                         //suggestedMax: 0.0,
                         //suggestedMin: 0.0,
                         beginAtZero: false,
                         // grid line settings
                         grid: {
                             drawOnChartArea: false, // only want the grid lines for one axis to show up
                         },
                     },
                 },
                 animation: {
                     duration: 0 // general animation time
                 },
                 hover: {
                     animationDuration: 0 // duration of animations when hovering an item
                 },
                 responsiveAnimationDuration: 0, // animation duration after a resize
             },
         };
         if (typeof Chart !== "undefined") {
             var dataChart = new Chart(ctx, config);
         }

         function appendDataToChart(chart, time, voltage, current) {
             chart.data.datasets[0].data.push({
                 x: time,
                 y: voltage
             });
             chart.data.datasets[1].data.push({
                 x: time,
                 y: current
             });
             chart.update();
         }

         function clearChart(chart) {
             chart.data.datasets[0].data = [];
             chart.data.datasets[1].data = [];
             chart.update();
         }

         appendDataToChart(dataChart, "2023-12-01 18:41:08", 12.2, 2.32);
         appendDataToChart(dataChart, "2023-12-02 18:41:08", 11.2, 3.32);
         appendDataToChart(dataChart, "2023-12-03 18:41:08", 10.2, 2.82);
         appendDataToChart(dataChart, "2023-12-04 18:41:08", 15.2, 4.32);
      </script>
   </body>
</html>

Bonus: funkcja pobierająca dane do wykresu w formacie JSON.

       const tbody = document.querySelector('table tbody');
      function appendDataToTable(tbody, voltage, current, date) {
        let row = document.createElement('tr');
        let timeCell = document.createElement('td');
        timeCell.textContent = date;
        row.appendChild(timeCell);
        let voltageCell = document.createElement('td');
        voltageCell.textContent = voltage;
        row.appendChild(voltageCell);
        let currentCell = document.createElement('td');
        currentCell.textContent = current;
        row.appendChild(currentCell);
        let firstChildElement = tbody.firstChild;
        // Append the row to the table body
        tbody.insertBefore(row, firstChildElement);
        //tbody.appendChild(row);
      }

      async function refreshSensors() {
          let url = "./json.php";
          let response = await fetch(url);
          let text = await response.text();
          //https://www.w3schools.com/jsref/jsref_parse_json.asp
          let values = JSON.parse(text);
          values.forEach((element) => {
              if (typeof Chart !== "undefined") {
                  appendDataToChart(dataChart, element["time"], element["voltage"], element["current"]);
              }
              appendDataToTable(tbody, element["voltage"], element["current"], date.toLocaleString('sv-SE'));
          });
      }
Edytowano przez rziomber
  • Lubię! 2
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.