Kontrola a vládání tiskárny

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Kontrola a vládání tiskárny

Příspěvek od Kony » 03 lis 2020, 19:54

Ahoj, snažím si udělat takový můj projekt ke kontrole a částečnému ovládání 3D tiskárny...

Nyní mám Arduino MEGA + kouřový senzor, rele, DHT22, senzor otevřeného ohně, ethernet modul, diplay a dvě tlačítka

Jakmile jsem tam neměl připojený ethernet modul, tak vše běželo krásně, okamžitě to detekovalo senzory, reakce na tlačítka (které nastavují nastavenou teplotu dle které se spína rele) vše jelo krásně, ale jakmile jsem napojil ethernet modul, tak vše špatně... reakce, třeba 10 sekund..
Vím co teď uvidíte, tak je hrozný balast v kódu a tak bych chtěl někoho poprosit, kdo mi mi v tom trošku udělal pořádek a hlavně aby mi to reagovalo jako bez ethernet modulu

Kód: Vybrat vše

#include <DHT.h>
#include <LiquidCrystal.h>
#include <SPI.h>
#include <UIPEthernet.h>
// inicializace pinu, lze vyměnit za jiné volné
LiquidCrystal lcd(23, 22, 5, 4, 3, 24);
#define pinDHT 48
#define analogPin A0
#define digitalPin 35
const int dOut = 49;
const int aOut = A1;
DHT mySensor(pinDHT, DHT22);
int teplota;
int analog = 0;
int analog_kour = 0;
unsigned long cas = 0;
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 50);
char serverName[] = "xxxxxxx.eu"; // webserver
#define BUFF_DELKA 255
char buffer[BUFF_DELKA];
EthernetClient client;

void prerus_ohen() {
  // pokud je aktivován digitální vstup,
  // vypiš hlášku o detekci ohně
  Serial.println("Detekovan ohen!");
  delay(500);
}
void prerus_kour(){
  // vypiš varovnou hlášku, pokud je aktivován digitální vstup
  // a senzor byl ústálen alespoň po dobu 180s = 3 minut
  if(millis()>180000){
    Serial.println("Prekonana hranice plynu v okoli!");
    delay(1000);
  }
}

void setup()
{
  Serial.begin(115200);
  lcd.begin(16,2);
  lcd.setCursor(0,0);
  lcd.print("Aktualni:");
  lcd.setCursor(0,1);
  lcd.print("Nastaveni: ");
  pinMode(33, INPUT_PULLUP);   // pin 33  nastaven jako vstup
  pinMode(34, INPUT_PULLUP);   // pin 34  nastaven jako vstup
  pinMode(32, OUTPUT);
  pinMode(analogPin, INPUT); //ohen
  pinMode(digitalPin, INPUT); //ohen
  attachInterrupt(digitalPinToInterrupt(digitalPin), prerus_ohen, FALLING);
  pinMode(dOut, INPUT); //kour
  pinMode(aOut, INPUT); //kour
  attachInterrupt(digitalPinToInterrupt(dOut), prerus_kour, FALLING);
  Ethernet.begin(mac, ip);
  Serial.print("Server je na IP adrese: ");
  Serial.println(Ethernet.localIP());
}

void loop()
{  
if(client.connect(serverName, 80)){
        delay(100);
        client.print(F("GET http:/xxxx.eu/aaaaa/reset"));
        client.println(F(".php"));
        client.println(F("Host: xxxx.eu"));
        client.println(F("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"));
        client.println(F("Connection: close"));
        client.println();
        delay(100);
        int inBuffer = 0;

        for(int i = 0; i < BUFF_DELKA; i++){ //vyprázdní buffer
            buffer[i] = '\\0'; //nastaví všechny prvky buffer na znak konce řetězce
        }
        
        while(client.available()){
            buffer[inBuffer] = client.read();    
            inBuffer++;
        }
                 if(buffer[0] == '1'){
                    digitalWrite(4, HIGH);
                    Serial.print("Posledni stav = ");
                }
                if(buffer[0] == '0'){
                    digitalWrite(4, LOW);
                    Serial.print("Posledni stav = ");
                }
        client.stop();  
    }
    Serial.println(buffer[0]);
    delay(100); 
     
    //OHEN
   // načtení napětí ze vstupu senzoru do proměnné
  int napetiSenzor = analogRead(analogPin);
  // přepočtení celého rozsahu 0-1024 na hodnoty 0-3
  int prepocet = map(napetiSenzor, 0, 1024, 0, 3);
  // nastavení stavu dle hodnoty přepočtené ze vstupu
  switch (prepocet) {
    case 0:
      Serial.println("Detekovan ohen ve vzdalenosti do 20 cm!");
      break;
    case 1:
      Serial.println("Detekovan ohen ve vzdalenosti od 20 do 80 cm!");
      break;
    case 2:
      Serial.println("Zadny ohen neni detekovan.");
      break;
  }
  // KOUR
  analog_kour = analogRead(aOut);
  Serial.print("Analogova hodnota: ");
  Serial.print(analog_kour);
  Serial.print(", v procentech: ");
  // přepočet hodnoty analogového vstupu z 1024
  // na 100 procent pomocí funkce map
  Serial.print(map(analog_kour, 0, 1023, 0, 100));
  Serial.println("%");
  //
  float tep = mySensor.readTemperature();
  lcd.setCursor(10,0);
  lcd.print("    ");
  lcd.setCursor(10,0);
  lcd.print(tep);
  Serial.println(tep);
  lcd.setCursor(14,0);
  lcd.print((char)223);
  lcd.print("C");
     if (digitalRead(33) == LOW){
   teplota = (teplota+5);
   Serial.println(teplota);
   lcd.setCursor(11,1);
   lcd.print("     ");
  } 
       if (digitalRead(34) == LOW){
   teplota = (teplota-5);
   Serial.println(teplota);
   lcd.setCursor(11,1);
   lcd.print("     ");
   }
   Serial.println(teplota);  
  lcd.setCursor(11,1); 
  lcd.print(teplota);
  lcd.setCursor(14,1);
  lcd.print((char)223);
  lcd.print("C");
  if (tep > (teplota + 2)) digitalWrite(32, LOW);
  if (tep < (teplota - 2)) digitalWrite(32, HIGH);
  delay (200);
}
a navic si myslim ze mi tam internet poradne nejde, protoze mi to nechce nacitat info z php stranky

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Kontrola a vládání tiskárny

Příspěvek od KamilV » 03 lis 2020, 21:31

Ty pomalé reakce máš od chvíle, kdy jsi změnil kód (přidal jsi knihovnu UIPEthernet.h), nebo od chvíle, kdy jsi fyzicky přicvaknul modul k Arduinu?

Zkus modul nepřipojit a pouze nechat změněný kód. Je to pomalé?
Jdi od konce a zakomentovávej řádky související s Eth. Je to pomalé?
Můžeš mít i nějakou kolizi s tou knihovnou. Takto na to příjdeš.

Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Re: Kontrola a vládání tiskárny

Příspěvek od Kony » 03 lis 2020, 21:56

Změnil jsem celý projekt....

Udělám zvlášť ovládání rele pro větrák včetně displeye a zvlášť další čidla,
4idlo DHT22, displey a tlačítka ovládání jsem připojil k Arduinu Nano a po nějaké chvilce se mi na displeyi zobrazí čínské znaky (asi nějaké zaklínadlo). řekl bych že to bude tím umazáváním atd co mám v kódu... mohl by mi s tím někdo poradit ??
jakmile udělám restart, tak vše OK

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Kontrola a vládání tiskárny

Příspěvek od pavel1tu » 04 lis 2020, 06:59

Měníš to rychleji než tu stačíme kontrolovat,
až bude něco co budeš chtít rozchodit - dej vědět ;)
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Re: Kontrola a vládání tiskárny

Příspěvek od Kony » 04 lis 2020, 08:12

no já bych rád to dotáhl celé na jednom zařízení, ale čumím do toho jak husa do flashky a nemůžu najít nikde problém.

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Kontrola a vládání tiskárny

Příspěvek od KamilV » 04 lis 2020, 10:12

V prvním postu jsi pospal nějaký problém. Já jsem Ti poslal asi 5 otázek a postup, jak poměrně rychle identifikuješ, kde problém vzniká. Odpověď žádná, místo toho info, že jsi změnil "všechno". Jako co všechno? Celý kód? A za jaký? Zapojení? Periferie? Celý projekt? Místo čidel jsi začal dělat detektor barev?

Zkus prosím vždy jen řešit jeden problém a dotáhnout ho do konce. To je dost důležitý návyk v programování. Rozkládat velké problémy na malé dílčí a postupně je řešit. Neskákat z jednoho na druhé.
A vždy ukázat aktuální kód, při velkém rozsahu třeba jen patřičnou část, pokud ji dokážeš identifikovat, což se ne vždy tazateli může podařit.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Kontrola a vládání tiskárny

Příspěvek od pavel1tu » 04 lis 2020, 19:36

Kony píše:
04 lis 2020, 08:12
no já bych rád to dotáhl celé na jednom zařízení, ale čumím do toho jak husa do flashky a nemůžu najít nikde problém.
OK,
hoď sem kod, určitě ti poradíme, ale nemůžeš dělat každou "půlhodinu" změny - to nikdo nestihne zkontrolovat to předchozí

jinak já na kroužku děti učím - postupovat krok po kroku, třeba teploměr s externím čidlem
- vyzkouším externí teploměr, jak měří, odladím četnost měření
- komunikaci vyzkouším tak, že odesílám natvrddo číslo "123,456" a rozchodím aby mi to přijímalo, na přijímači odchytám jen na sériovou komunikaci
- zprovozním měření teploty včetně přenosu teploty - na přijímači odchytám jen na serial
- zprovozním displej - aby nepřetékaly hodnoty, atd.
- zprovozním to jako celek

Proto je výhodné vše psát jako funkce, pak stačí v loop() jen "//" zrušit volání té funkce co už chodí a odladit opět další část
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Kontrola a vládání tiskárny

Příspěvek od pavel1tu » 04 lis 2020, 19:52

Beru poslední zveřejněný kod - co se mi nepozdává:
(sestavím si to o víkendu, teď opravdu nestíhám)
v loop() deklaruješ dokola proměnné - no, MEGA má dost paměti, ale toto se nedělá, paměť se tím fragmentuje
int napetiSenzor = analogRead(analogPin);
int prepocet = map(napetiSenzor, 0, 1024, 0, 3);
float tep = mySensor.readTemperature();

Nejsem profik, ale pokud jsem pochopil, tak v první části vyčítáš něco z WWW stránky a podle toho nastavuješ Output 4
- já bych to nevyčítal v každém cyklu Arduina, ale pro začátek jednou za 15s (pak po odladění častěji), podle mne se možná kousne LAN modul - možná, já na takovéto věci používám knihovnu https://github.com/arkhipenko/TaskScheduler ale tady by stačil klasický milis()
- možná i vyčítání analogů (oheň,kouž) bych dělal tak jednou za 500ms, nebo 1s - nevím jak rychlou reakci potřebuješ
- jinak tam nevidím žádný problém, musím si to trochu učesat (abych se v tom vyznal) a až připojím display testnu to

PS: nemám MEGU jen UNO a DUE, ale i UNO ten kod unese dle mne
PS2: rozchoď jednotlivé části - vyčítání z WWW, atd. - nepostupuj dál, dokud jedna část nechodí
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Kontrola a vládání tiskárny

Příspěvek od pavel1tu » 04 lis 2020, 20:21

Kód: Vybrat vše

if(client.connect(serverName, 80)){
        delay(100);                                                              // dal bych 1000 pro začátek
        client.println(F("GET http:/xxxx.eu/aaaaa/reset.php"));     // oprav na http:// a ".php" dej sem, proč na dalším řádku ?
                                                                                                 // a změna na println
        client.println(F("Host: xxxx.eu"));
        client.println(F("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"));
        client.println(F("Connection: close"));
        client.println();
        delay(1000);                                              // dal bych 1000 pokud je to hosting na netu
                
nedal jsi sem PHP soubor z kterého to vyčítáš,
když ten PHP soubor zavoláš z prohlížeče - je tam ta "1" a "0" ?
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Re: Kontrola a vládání tiskárny

Příspěvek od Kony » 05 lis 2020, 17:51

ano pokud zadam PHP do www prohlizece na PC, tak vycita v pohode

Odpovědět

Kdo je online

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