Stránka 1 z 1

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

Napsal: 05 črc 2022, 15:53
od Majk39
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

}

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

Napsal: 05 črc 2022, 17:14
od analytik
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.

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

Napsal: 05 črc 2022, 19:32
od AstroMiK
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");
  }

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

Napsal: 06 črc 2022, 14:36
od Majk39
..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);

 
 
 }
 }

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

Napsal: 06 črc 2022, 14:41
od AstroMiK
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í.

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

Napsal: 06 črc 2022, 14:56
od Majk39
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