sledování 3 stavů na vstupním pinu a zobrazení na webu

Odpovědět
Majk39
Příspěvky: 3
Registrován: 04 črc 2022, 23:14
Reputation: 0

sledování 3 stavů na vstupním pinu a zobrazení na webu

Příspěvek od Majk39 » 05 črc 2022, 15:53

Ahoj, napsal jsem program pro Arduino kdy sleduji informaci na 8 vstupních pinech a následně zobrazuji v tabulce na webu. Arduino je jako webový server. Když je na vstupu č.1 log 1 pak se v tabulce pod P1 zobrazí červené pole, když je log 0 pak je pole zelené, toto funguje parádně. Ale potřeboval bych ještě třetí stav a to když se na vstupu č.1 střídá log 1/log0 s frekvencí 1s, potom bych potřeboval aby v tabulce bylo pole oranžové.
Ten čas je orientační, zkrátka pulsy na vstupu by měli zobrazit oranžovou v tabulce.

Našel jsem na webu kódy kdy pulzy na vstupu nastaví log 1 na výstup, resp. když jsou pulzy kratší než podmínka je výstup log 1, když dlouho nepřijde pulz nastaví se log 0 ale nějak nevím jak to zakomponovat. Postup bych poté nastavil na všechny vstupy, jak je v tabulce.
Poradíte prosím?

Kód: Vybrat vše

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {0x82, 0xA3, 0x12, 0x01, 0x9B, 0xB1 };
byte ip[] = { 192, 168, 1, 50 }; // ip
byte gateway[] = { 192, 168, 1, 1 }; // gateway
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask

EthernetServer diagnostika(80); //vytvoříme server na portu 80

String readString;

void setup() {

  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  pinMode(7, INPUT);
  pinMode(8, INPUT);
  pinMode(9, INPUT);

  Ethernet.begin(mac, ip, gateway, subnet);

  diagnostika.begin(); //spustíme server

  //POZOR - nepoužívat v Arduino UNO a Ethernet shield piny 0,1,10,11,12,13 - nebude možné nahrát program (0,1) a nebude fungovat ETH komunikace (10,11,12,13)

}

void loop() {

  EthernetClient client = diagnostika.available();  //spuštění serveru


  //klasická hlavička HTML

  client.println(F("HTTP/1.1 200 OK"));
  client.println(F("Content-Type: text/html"));
  client.println(F("Connection: close"));
  client.println(F("Refresh: 6"));
  client.println();
  client.println(F("<!DOCTYPE HTML>"));
  client.println(F("<html>"));
  client.println(F("<head>"));
  client.println(F("<meta charset=\"UTF-8\">"));   // nastavení kódování webové stránky
  client.println(F("<title>DIAGNOSTIKA</title>"));
  client.println(F("</head>"));

  //zde začíná tabulka hodnot

  client.println(F("<p><u><strong>Diagnostika</strong></u></p>"));
  client.println(F("<p>&nbsp;</p>"));

  client.println(F("<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"height:60%; width:50%\">"));
  client.println(F("<tbody>"));
  client.println(F("<tr>"));
  client.println(F("<td colspan=\"1\" rowspan=\"2\" style=\"background-color:#aaaaaa; width:50px\">&nbsp;</td>"));
  client.println(F("<td style=\"background-color:#ffffcc; text-align:center; width:70px\"><strong>P1</strong></td>"));
  client.println(F("<td style=\"background-color:#ffffcc; text-align:center; width:70px\"><strong>P2</strong></td>"));
  client.println(F("<td style=\"background-color:#ffffcc; text-align:center; width:70px\"><strong>P3</strong></td>"));
  client.println(F("<td style=\"background-color:#ffffcc; text-align:center; width:70px\"><strong>P4</strong></td>"));
  client.println(F("<td style=\"background-color:#ffffcc; text-align:center; width:70px\"><strong>P5</strong></td>"));
  client.println(F("<td style=\"background-color:#ffffcc; text-align:center; width:70px\"><strong>P6</strong></td>"));
  client.println(F("<td style=\"background-color:#ffffcc; text-align:center; width:70px\"><strong>P7</strong></td>"));
  client.println(F("<td style=\"background-color:#ffffcc; text-align:center; width:70px\"><strong>P8</strong></td>"));
  client.println(F("<td colspan=\"1\" rowspan=\"2\" style=\"background-color:#aaaaaa; width:50px\">&nbsp;</td>"));
  client.println(F("</tr>"));
  client.println(F("<tr>"));
  if (digitalRead(2) == HIGH) {
    client.println(F("<td style=\"background-color:#66ff00\">&nbsp;</td>"));
  }
  else {
    client.println(F("<td style=\"background-color:#ff0000\">&nbsp;</td>"));
  }
  if (digitalRead(3) == HIGH) {
    client.println(F("<td style=\"background-color:#66ff00\">&nbsp;</td>"));
  }
  else {
    client.println(F("<td style=\"background-color:#ff0000\">&nbsp;</td>"));
  }
  if (digitalRead(5) == HIGH) {
    client.println(F("<td style=\"background-color:#66ff00\">&nbsp;</td>"));
  }
  else {
    client.println(F("<td style=\"background-color:#ff0000\">&nbsp;</td>"));
  }
  if (digitalRead(6) == HIGH) {
    client.println(F("<td style=\"background-color:#66ff00\">&nbsp;</td>"));
  }
  else {
    client.println(F("<td style=\"background-color:#ff0000\">&nbsp;</td>"));
  }
  if (digitalRead(7) == HIGH) {
    client.println(F("<td style=\"background-color:#66ff00\">&nbsp;</td>"));
  }
  else {
    client.println(F("<td style=\"background-color:#ff0000\">&nbsp;</td>"));
  }
  if (digitalRead(8) == HIGH) {
    client.println(F("<td style=\"background-color:#66ff00\">&nbsp;</td>"));
  }
  else {
    client.println(F("<td style=\"background-color:#ff0000\">&nbsp;</td>"));
  }
  if (digitalRead(9) == HIGH) {
    client.println(F("<td style=\"background-color:#66ff00\">&nbsp;</td>"));
  }
  else {
    client.println(F("<td style=\"background-color:#ff0000\">&nbsp;</td>"));
  }
  if (digitalRead(9) == HIGH) {
    client.println(F("<td style=\"background-color:#66ff00\">&nbsp;</td>"));
  }
  else {
    client.println(F("<td style=\"background-color:#ff0000\">&nbsp;</td>"));
  }

  client.println(F("</tr>"));
  client.println(F("<tr>"));
  client.println(F("<td colspan=\"10\" style=\"background-color:#aaaaaa\">&nbsp;</td>"));
  client.println(F("</tr>"));
  client.println(F("<tr>"));
  client.println(F("<td colspan=\"10\" style=\"background-color:#aaaaaa\">&nbsp;</td>"));
  client.println(F("</tr>"));
  client.println(F("<tr>"));

  client.println("</body>");
  client.println("</html>");

  delay(5); //dáme klientovi čas na zpracování
  client.stop(); //komunikace je u konce

}

analytik
Příspěvky: 148
Registrován: 26 čer 2020, 12:48
Reputation: 0
Bydliště: Děčín

Re: sledování 3 stavů na vstupním pinu a zobrazení na webu

Příspěvek od analytik » 05 črc 2022, 17:14

Stav mezi logickou nulou a jedničkou lze získat jednoduchým trikem. Načítej v určitém intervalu každý vstup několikrát, převeď získané logické hodnoty na aritmetické 1 a 0 a vypočítej průměr. Bude-li se tato hodnota lišit od nuly i jedničky, dej oranžovou.

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: sledování 3 stavů na vstupním pinu a zobrazení na webu

Příspěvek od AstroMiK » 05 črc 2022, 19:32

Průměrování se mi zdá skoro zbytečné - myslím, že by stačil součet.
Jinak ale souhlasím s Analytikem.

Když se zvolí šikovná rychlost testování, která bude o trochu rychlejší než půlperioda změny stavu pinu a hodnoty se budou ukládat do "kruhového" pole, tak se dá pracovat třeba jen s polem o velikosti tří posledních stavů.

Tady je příklad, který testuje pin D5 každých 300ms a vyhodnocuje požadované 3 stavy (výstup jen do sérového terminálu):

Kód: Vybrat vše

byte pole[3];
byte ukazatel;
boolean znacka;

void setup(void)
  {
    Serial.begin(9600);
    pinMode(5,INPUT_PULLUP);
  }

void loop(void)
  {
    if (millis() % 300 < 100)  znacka = true;       // spousteni kazdych 300ms
    if (millis() % 300 > 100 and znacka == true)
      {
        znacka = false;
        test();
      }




  }


void test(void)
  {
    Serial.print(millis());
    pole[ukazatel] = digitalRead(5);
    ukazatel++;
    if (ukazatel == 3) ukazatel = 0;
    byte soucet = pole[0] + pole[1] + pole[2];
    if (soucet == 0)               Serial.println(" - zelena");
    if (soucet == 3)               Serial.println(" - cervena");
    if (soucet < 3 and soucet > 0) Serial.println(" - oranzova");
  }

Majk39
Příspěvky: 3
Registrován: 04 črc 2022, 23:14
Reputation: 0

Re: sledování 3 stavů na vstupním pinu a zobrazení na webu

Příspěvek od Majk39 » 06 črc 2022, 14:36

..děkuji Vám oboum za pomoc. Zapracoval jsem kód do projektu a funguje:)) Kód jsem použil od AstroMika - děkuji:)

Jen pro zajímavost jsem nezahálel a hledal jsem a našel jsem ještě jiný kód (viz kód) ale ten nefungoval dobře, protože pokud nastala čistá změna z 0 rovnou na 1 a nebo naopak, tak se na webu zobrazil právě onen mezi stav (oranžová), který byl vidět právě v jednom cyklu obnovení stránky, což bylo matoucí. Při dalším obnovení již byl stav správně.

Kód od Vás tento neduh nemá a vždy vidím v každém refresh okně přesně hned každý stav správně.

Zde tedy onen kód, co měl onu vadu (pro zajímavost)

Kód: Vybrat vše

unsigned long previousMillis = 0; // last time update
long interval = 5000; // interval at which to do something (milliseconds)
int buttonPin = 9;
int buttonState = 0;
int a = 0;
int b = 0;


void setup() {
 // put your setup code here, to run once:
Serial.begin(9600);
pinMode(buttonPin, INPUT); // initialize the pushbutton pin as an input:
}

void loop(){
 unsigned long currentMillis = millis();

 

    buttonState = digitalRead(buttonPin); //read state
    delay(1000);
    Serial.println(buttonState);
    if ( buttonState ==0) a++; // if state LOW increment coulter by 1
    
    if ( buttonState ==1) b++;// if state HIGH increment coulter by 1
         
    if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;   
      
    if (a==0) Serial.println("it is always low");  
    if (b==0) Serial.println("it is always high");  
    if (a!=0 && b!=0) Serial.println("it's blinking");
    Serial.println("put counter a and b to zero value"); 
    a=0;
    b=0;
     }
     else {
 
 Serial.println(a);
 Serial.println(b);

 
 
 }
 }
Naposledy upravil(a) Majk39 dne 06 črc 2022, 14:41, celkem upraveno 1 x.

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: sledování 3 stavů na vstupním pinu a zobrazení na webu

Příspěvek od AstroMiK » 06 črc 2022, 14:41

Ale to mně dělá taky.
Není možné rozeznat okamžitě při první změně stavu z 0 na 1 jestli se jedná o trvalou změnu, nebo jen sekundové blikání.

Majk39
Příspěvky: 3
Registrován: 04 črc 2022, 23:14
Reputation: 0

Re: sledování 3 stavů na vstupním pinu a zobrazení na webu

Příspěvek od Majk39 » 06 črc 2022, 14:56

ano, máte pravdu, na sériové konzoli je to vidět (mezi stav) ale na web do buňky se mi to již nepřenese...takže úprava HTML.
Nejspíš tedy záleží kdy se vyhodnocují podmínky a kdy se zobrazí webová stránka, tedy spustím server EthernetClient client = DIAG.available() a pak hned provedu vyhodnocení podmínek a pak teprve vykresluji HTML a u konkrétní buňky jsou ony 3 podmínky pro zobrazení barvy

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 8 hostů