διόρθωση κώδικα (σμίκρυνση)

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
veriotis
Graphics Moderator
Δημοσιεύσεις: 1360
Εγγραφή: 22 Δεκ 2003 21:30
Τοποθεσία: Βέροια
Επικοινωνία:

διόρθωση κώδικα (σμίκρυνση)

Δημοσίευση από veriotis » 21 Ιαν 2013 23:18

καλησπέρα στην παρέα
θα ήθελα την βοήθεια σας αν φυσικά γίνεται να μικρύνουμε τον κώδικα για το arduino ( είμαι αρχάριος στην c++ οπότε ακολουθώ το if και alse if )
{λίγα λόγια για το τι κάνει ο κώδικας}
δέχεται εντολές από το web και ανάλογα την εντολή εκτελεί μια άλλη στο hardware . συγκεκριμένα αναβοσβήνει τα φώτα στο σπίτι μου μέσω web.

αυτό που θέλω να συμμαζέψω.

Κώδικας: Επιλογή όλων

if(buffer.indexOf("GET /?c=01")>=0)
            setRegisterPin(0, HIGH);
          else if(buffer.indexOf("GET /?c=00")>=0)
            setRegisterPin(0, LOW);

          else if(buffer.indexOf("GET /?c=11")>=0)
            setRegisterPin(1, HIGH);
          else if(buffer.indexOf("GET /?c=10")>=0)
            setRegisterPin(1, LOW);

          else if(buffer.indexOf("GET /?c=21")>=0)
            setRegisterPin(2, HIGH);
          else if(buffer.indexOf("GET /?c=20")>=0)
            setRegisterPin(2, LOW);

// και πάει λέγοντας προς το παρών έως το 390
αυτό φυσικά γίνετε για 40 νούμερα τώρα και νομίζω πώς είναι πολλά τα if .
παράδειγμα 21 δηλαδή διακόπτης 2 ανοικτός 1 ,20 διακόπτης 2 κλειστός 0

φυσικά μπορεί να αλλαχτεί και ο κώδικας http ώστε να δίνει κάτι που βολεύει .
δουλεύει μια χαρά αλλά πιστεύω πώς γράφετε καλύτερα από κάποιων που ξέρει.
ευχαριστώ προκαταβολικά :D

Άβαταρ μέλους
_tasos
Δημοσιεύσεις: 116
Εγγραφή: 03 Μάιος 2007 15:06
Επικοινωνία:

διόρθωση κώδικα (σμίκρυνση)

Δημοσίευση από _tasos » 21 Ιαν 2013 23:47

Αυτό που θα μπορούσες να κάνεις είναι να πάρεις τη τιμή του "c" από το buffer και από τον αριθμό αυτό να βρεις τον αριθμό του διακόπτη (όλα τα ψηφία εκτός του τελευταίου) και το status του (το τελευταίο ψηφίο).

Θα πρότεινα επίσης αν μπορείς να αλλάξεις το URL από "GET /?c=01" σε "GET /?switch=0&status=1", κάτι που είναι πιο ευανάγνωστο.

Άβαταρ μέλους
veriotis
Graphics Moderator
Δημοσιεύσεις: 1360
Εγγραφή: 22 Δεκ 2003 21:30
Τοποθεσία: Βέροια
Επικοινωνία:

διόρθωση κώδικα (σμίκρυνση)

Δημοσίευση από veriotis » 22 Ιαν 2013 00:49

Τάσο ευχαριστώ για το ενδιαφέρων
μπορώ να αλλάξω το url όπως λες , αλλά δεν έχω ιδέα πως να τα διαβάσω στο πρόγραμμα .

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

διόρθωση κώδικα (σμίκρυνση)

Δημοσίευση από dva_dev » 22 Ιαν 2013 12:11

Ισως μια function σαν αυτή να σε βοηθήσει.:

Κώδικας: Επιλογή όλων

String GetValue(const String& str, const String& key)
{
	String params;
	int qsPos = str.indexOf('?');
	if &#40;qsPos < 0&#41; return params;

	params = str.substring&#40;qsPos&#41;;
	params.setCharAt&#40;0,'&'&#41;;
	String search&#40;'&'&#41;;
	search += key;
	search += '=';
	qsPos = params.indexOf&#40;search&#41;;
	if &#40;qsPos < 0&#41; return "";

	qsPos += search.length&#40;&#41;;
	int qsPos2 = params.indexOf&#40;'&', qsPos+1&#41;;
	if &#40;qsPos2 < qsPos&#41; 
	&#123;
		return params.substring&#40;qsPos&#41;;
	&#125;
	else
	&#123;
		return params.substring&#40;qsPos, qsPos2&#41;;
	&#125;
&#125;
Λογικά θα χρειάζεσαι να κάνεις κάτι σαν αυτό (αντί για τα δεκάδες if):

Κώδικας: Επιλογή όλων

...
int switchNo = GetValue&#40;buffer, "switch"&#41;.toInt&#40;&#41;;
int switchStatus = &#40;GetValue&#40;buffer, "status"&#41;.toInt&#40;&#41; == 0&#41; ? LOW &#58; HIGH;

setRegisterPin&#40;switchNo, switchStatus&#41;;
Φυσικά ΔΕΝ το έχω δοκιμάσει...
Αν δεν κάνει κανά μεγάλο μπαμ, θα είχε ενδιαφέρον να μας περιγράψεις πως δουλεύει (πως συνδέεις αυτό το πράγμα με την καλωδίωση).

Άβαταρ μέλους
veriotis
Graphics Moderator
Δημοσιεύσεις: 1360
Εγγραφή: 22 Δεκ 2003 21:30
Τοποθεσία: Βέροια
Επικοινωνία:

διόρθωση κώδικα (σμίκρυνση)

Δημοσίευση από veriotis » 22 Ιαν 2013 15:46

ευχαριστώ dva_dev
θα τον δοκιμάσω .

όσο για το πώς δουλεύει ,το arduino έχει ένα μικροελεγκτή (ATmega328 το δικό μου) όπου γράφεις το πρόγραμμα για να ελέγχεις 14 ψηφιακές εξόδους/εισόδους και 6 αναλογικές εισόδους , επάνω του μπορούν να μπουν διάφορες έξτρα προεκτάσεις. μια από αυτές είναι το ethernet για να μπορώ να επικοινωνώ μαζί του μέσω δικτύου και ή άλλη προέκταση είναι μια πλακέτα με τα τσιπάκια 74hc595 που σου δίνουν την δυνατότητα τις 3 ψηφιακές εξόδους να τις κάνεις όσες θες (8 για κάθε τσιπακι) από εκεί και πέρα μερικά τρανζίστορ και relay
η καλωδίωση είναι το μανίκι μιας και όλα πρέπει να πάνε στον κεντρικό πίνακα (τα φώτα δεν πάνε στον διακόπτη του τοίχου αλλά στον κεντρικό πίνακα όπως και οι διακόπτες ) για να ελέγχοντες και να χειρίζονται κεντρικά με όπιο τρόπω θέλουμε .

ευχαριστώ για την βοήθεια
Συνημμένα
arduino.jpg
αυτοματισμός σπιτιού C++

Άβαταρ μέλους
veriotis
Graphics Moderator
Δημοσιεύσεις: 1360
Εγγραφή: 22 Δεκ 2003 21:30
Τοποθεσία: Βέροια
Επικοινωνία:

διόρθωση κώδικα (σμίκρυνση)

Δημοσίευση από veriotis » 27 Ιαν 2013 12:36

ευχαριστώ και τους δυο για την βοήθεια
Δούλεψε :D

εκτός από ένα προβληματάκι που δεν με απασχολεί απλά το αναφέρω
ο switch=0 είναι πραγματικός διακόπτης (στο Shift register ξεκινάει από το 0 η πρώτη έξοδος)
στην function μάλλον δεν λαμβάνετε υπόψιν το 0 στο switch.

τέλος πάντων δουλεύει άψογα , ευχαριστώ.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

διόρθωση κώδικα (σμίκρυνση)

Δημοσίευση από dva_dev » 27 Ιαν 2013 16:01

Δεν έχω καταλάβει ποιο ακριβώς είναι το πρόβλημα.
Αν βάλεις GET /?switch=0&status=1 δεν σου γυρνάει ότι το switch είναι 0 και το status είναι 1;
Μήπως εννοείς ότι μπορεί να μην έχεις δώσει καθόλου switch οπότε θα πρέπει να χτυπάει κάποιο λάθος ή να μην κάνει τίποτα;

Άβαταρ μέλους
veriotis
Graphics Moderator
Δημοσιεύσεις: 1360
Εγγραφή: 22 Δεκ 2003 21:30
Τοποθεσία: Βέροια
Επικοινωνία:

διόρθωση κώδικα (σμίκρυνση)

Δημοσίευση από veriotis » 27 Ιαν 2013 22:07

Κώδικας: Επιλογή όλων

/?switch=0&status=1
δεν απαντά στην γραμμή 0

Κώδικας: Επιλογή όλων

/?switch=1&status=1
απαντά κανονικά στην γραμμή 1
άφησα και το κομμάτι το δικό μου με τα If για το 0 στο loop κάτω από τον κώδικα σου αλλά ούτε αυτός δούλεψε , φυσικά μόνο με τα if δουλεύει το 0 .

και κάτι ακόμα που μου φάνηκε περίεργο κάνοντας print τα switchNo switchStatus έπαιρνα τις 2 πρώτες γραμμές σωστά (switchNo switchStatus)και μετά αρκετά μηδενικά (στο switch=0 δεν έπαιρνα απάντηση)

μια χαρά δουλεύει αυτά είναι λεπτομέρειες :D απλά ενημερώνω την σημερινή κατάσταση

και για μια γενική ιδέα παραθέτω τον κώδικα για το arduino όπως είναι τώρα

Κώδικας: Επιλογή όλων

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

byte mac&#91;&#93; = &#123; 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED &#125;;
IPAddress ip&#40;10,205,1,2&#41;;

EthernetServer server&#40;80&#41;;
int SER_Pin = 8;   //pin 14 on the 75HC595
int RCLK_Pin = 9;  //pin 12 on the 75HC595
int SRCLK_Pin = 7; //pin 11 on the 75HC595

//How many of the shift registers - change this
#define number_of_74hc595s 5 

//do not touch
#define numOfRegisterPins number_of_74hc595s * 8

boolean registers&#91;numOfRegisterPins&#93;;

void setup&#40;&#41;&#123;
  Serial.begin&#40;9600&#41;;     
  Ethernet.begin&#40;mac, ip&#41;;
  server.begin&#40;&#41;;
  pinMode&#40;SER_Pin, OUTPUT&#41;;
  pinMode&#40;RCLK_Pin, OUTPUT&#41;;
  pinMode&#40;SRCLK_Pin, OUTPUT&#41;;

  //reset all register pins
  clearRegisters&#40;&#41;;
  writeRegisters&#40;&#41;;
&#125;               

//set all register pins to LOW
void clearRegisters&#40;&#41;&#123;
  for&#40;int i = numOfRegisterPins - 1; i >=  0; i--&#41;&#123;
    registers&#91;i&#93; = LOW;
  &#125;
&#125; 

String GetValue&#40;const String& str, const String& key&#41;&#123; 
  String params; 
  int qsPos = str.indexOf&#40;'?'&#41;; 
  if &#40;qsPos < 0&#41; return params; 

  params = str.substring&#40;qsPos&#41;; 
  params.setCharAt&#40;0,'&'&#41;; 
  String search&#40;'&'&#41;; 
  search += key; 
  search += '='; 
  qsPos = params.indexOf&#40;search&#41;; 
  if &#40;qsPos < 0&#41; return ""; 

  qsPos += search.length&#40;&#41;; 
  int qsPos2 = params.indexOf&#40;'&', qsPos+1&#41;; 
  if &#40;qsPos2 < qsPos&#41; 
  &#123; 
    return params.substring&#40;qsPos&#41;; 
  &#125; 
  else 
  &#123; 
    return params.substring&#40;qsPos, qsPos2&#41;; 
  &#125; 
&#125; 
//Set and display registers
//Only call AFTER all values are set how you would like &#40;slow otherwise&#41;
void writeRegisters&#40;&#41;&#123;

  digitalWrite&#40;RCLK_Pin, LOW&#41;;

  for&#40;int i = numOfRegisterPins - 1; i >=  0; i--&#41;&#123;
    digitalWrite&#40;SRCLK_Pin, LOW&#41;;

    int val = registers&#91;i&#93;;

    digitalWrite&#40;SER_Pin, val&#41;;
    digitalWrite&#40;SRCLK_Pin, HIGH&#41;;

  &#125;
  digitalWrite&#40;RCLK_Pin, HIGH&#41;;

&#125;

//set an individual pin HIGH or LOW
void setRegisterPin&#40;int index, int value&#41;&#123;
  registers&#91;index&#93; = value;
&#125;

void loop&#40;&#41;&#123;
  EthernetClient client = server.available&#40;&#41;;
  if &#40;client&#41; &#123;
    boolean currentLineIsBlank = true;
    String buffer = "";  
    while &#40;client.connected&#40;&#41;&#41; &#123;
      if &#40;client.available&#40;&#41;&#41; &#123;
        char c = client.read&#40;&#41;;
        Serial.print&#40;c&#41;;   
        buffer+=c;       
        if &#40;c == '\n' && currentLineIsBlank&#41; &#123;

          client.println&#40;"HTTP/1.1 200 OK"&#41;;
          client.println&#40;"Content-Type&#58; text/html"&#41;;
          client.println&#40;&#41;;
          client.println&#40;"home"&#41;;
          break;
        &#125;
        if &#40;c == '\n'&#41; &#123;

          currentLineIsBlank = true;
          buffer="";       
        &#125;
        else if &#40;c == '\r'&#41; &#123;
          int switchNo = GetValue&#40;buffer, "switch"&#41;.toInt&#40;&#41;; 
          int switchStatus = &#40;GetValue&#40;buffer, "status"&#41;.toInt&#40;&#41; == 0&#41; ? LOW &#58; HIGH; 
          setRegisterPin&#40;switchNo, switchStatus&#41;; 


        &#125; 
        else &#123;

          currentLineIsBlank = false;
        &#125;
      &#125;
    &#125;
    delay&#40;1&#41;;

    client.stop&#40;&#41;;
  &#125;
  writeRegisters&#40;&#41;; 
 //MUST BE CALLED TO DISPLAY CHANGES
  //Only call once after the values are set how you need.
&#125;

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης