Jeden void pro více různých periferií

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Bart_
Příspěvky: 18
Registrován: 06 srp 2019, 23:24
Reputation: 0

Jeden void pro více různých periferií

Příspěvek od Bart_ » 24 lis 2019, 01:42

Ahoj, mám takovýto kód:

Kód: Vybrat vše

void kalibracePump () { //kalibrace pumpy
  int kalibrace = 15000; //15000 kroků pro kalibraci
  float nadavkovano; //musí se zadat -> hodnota která se nadávkovala při 15000 krocích
  int zkalibrovano; //vypočtená kalibrace, se kterou se počítá při dávkování

  motor.step(kalibrace);
  //čekej na zadání parametrů
  zkalibrovano = (kalibrace5mL * kalibrace) / nadavkovano;
  Serial.println(zkalibrovano);
  //uložit kalibraci do EEPROM
}

void testKalibrace() {
  motor.step(zkalibrovano);
}
a mám více krokových motorů, které bych chtěl takto kalibrovat...Jde to udělat tak, abych nemusel pro každý motor psát tento kód zvlášť (void kalibracePump1, void kalibracePump2,..)?
Něco jako (ten loop je jen jako příklad, ani nevim jestli by to fungovalo :D ):

Kód: Vybrat vše

void kalibracePump (String a) { //kalibrace pumpy
  int kalibrace = 15000; //15000 kroků pro kalibraci
  float nadavkovano; //musí se zadat -> hodnota která se nadávkovala při 15000 krocích
  int zkalibrovano; //vypočtená kalibrace, se kterou se počítá při dávkování

  a.step(kalibrace);
  //čekej na zadání parametrů
  zkalibrovano = (kalibrace5mL * kalibrace) / nadavkovano;
  Serial.println(zkalibrovano);
  //uložit kalibraci do EEPROM
}

void testKalibrace(String a) {
  a.step(zkalibrovano);
}
void loop(){
 if(digitalRead(2) ==HIGH){ //pokud bylo zmáčknuto tlačítko na pinu 2, kalibruj motor 1
 kalibracePump(motor1);
}
Prostě pokud mám opakovat nějakou funkci pro různé periferie, nechci ji psát několikrát.

Dík za rady

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Jeden void pro více různých periferií

Příspěvek od gilhad » 24 lis 2019, 07:09

Ano, akorat skoro jiste nebudes chtit ten motor predavat jako retezec (protoze v tom puvodnim to retezec neni a nevolas to jako "motor1".step() ), ale jako spravny typ

Pokud mas nekde deklaraci typu

Kód: Vybrat vše

UzasnyMotor motor1;
UzasnyMotor motor2;
tak budes mit hlavicku

Kód: Vybrat vše

void testKalibrace(UzasnyMotor a) {
   a.step(zkalibrovano);
   }
a pak ti to bude fungovat tak, jak chces (a nejspis budes mit i ruznou kalibraci pro ruzne motory, takze to zkalibrovano taky predas jako parametr)

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Jeden void pro více různých periferií

Příspěvek od kiRRow » 24 lis 2019, 08:57

Ten motor to je objekt tvořený nějakou knihovnou dle třídy ? Jestli by nebylo rozumnější trošku poeditovat onu třídu a rozšířit ji o metodu zkalibrujSe() - pokud už tam něco takového dokonce není. Pak už budeš jen volat např : motor1.zkalibrujSe(); motor2.zkalibrujSe();

Bart_
Příspěvky: 18
Registrován: 06 srp 2019, 23:24
Reputation: 0

Re: Jeden void pro více různých periferií

Příspěvek od Bart_ » 24 lis 2019, 09:49

gilhad: Jasně, takže když to jsou krokové motory, u kterých používám knihovnu stepper.h tak použiji toto?:

Kód: Vybrat vše

Stepper motor1(stepsPerRevolution, 8, 9, 10, 11);
Stepper motor2(stepsPerRevolution, 4, 5, 6, 7);
void loop(){
 if(digitalRead(2) ==HIGH){ //pokud bylo zmáčknuto tlačítko na pinu 2, kalibruj motor 1
 testKalibrace(motor1);
}
void testKalibrace(Stepper a) {
   a.step(zkalibrovano);
   }
kiRRow: Tvůj nápad se mi líbí víc, ale nikdy jsem to nedělal. Jak jsem psal výše, používám knihovnu stepper.h a umím programovat pouze ve wiringu. Knihovnu jsem nikdy nepsal ani neupravoval. Dokonce se mi nedaří najít ani defaultní knihovny :D

Krokové motory používám jako peristaltická čerpadla s 3d tiskovou hlavou.

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Jeden void pro více různých periferií

Příspěvek od gilhad » 24 lis 2019, 12:01

Ano, presne tak :)

ad kiRRow - resi jiny problem, nez jsem resil ja, ve vysledku pouzijes stejne oboji ;)

Stepper.h je nekde na tvem disku a da se vyhledat. hned vedle nej bude neco Stepper.cpp, kde je ten kod.

Ale to je celkem jedno, muzes si udelat vlastni tridu nad touto a jen tam dopsat, co potrebujes noveho/jineho a pouzivat pak tuhle tridu

Kód: Vybrat vše


class MujMotor: public Stepper {
  public:
  int kalibrace;
  void zkalibrujSe(){
    kalibrace=42;  // zakladni odpoved ...
  }
  // .....
}

MujMotor motor1(stepsPerRevolution, 8, 9, 10, 11);
void setup(){
   ....
   motor1.zkalibrujSe();
   Serial.print(motor1.kalibrace); // napise 42
   ...
}


Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Jeden void pro více různých periferií

Příspěvek od kiRRow » 24 lis 2019, 12:06

Perilstatickou pumpu jsem stavěl dle : https://www.thingiverse.com/thing:2619479 - alespoň první zkušební kousek, pro potřeby provozu byl firmware upraven a změnilo se i zapojení pár pinů. Taky došlo k oddělení LCD displaye a rotačního enkodéru a zbytku do dvou samostatných krabiček, propojených kabelem. Ale jinak 7 jich už spokojeně sedí pod strojem a dávkuje vodu :)

Objekty a třídy hold do c++ patří. Koukal jsem teď na knihovnu Stepper a není to nic moc složitého, žádná kalibrace tam není. Co přesně má dělat ten motor při kalibraci ?

no a gilhadovo řešení je nejluxusnější ... tomu se nadává dědičnost ... pár řádku kódů ti vytvoří třídu která zdědí veškeré vlastnosti od třídy od které je odvozena ... a jen do ní doplníš co potřebuješ

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Jeden void pro více různých periferií

Příspěvek od kiRRow » 24 lis 2019, 12:13

Jinak tříd se vůbec nebát ... vem si to tak, že když si jednou napíšeš třídu pro ošetření zákmitu tlačítka, pak ji umístíš do vlastních souborů *.h a *.cpp, tak máš v podstatě knihovnu ...

v příštím projektu budeš obsluhovat 5 tlačítek, naimportuješ si knihovnu co jsis vytvořil a už jen vytváříš objekty se kterými pracuješ, žádné kopírování kódů a zdvojování, ztrojování ..... debounce1, debounce2, debounce3 .... pak je z toho nepřehlednej humáč

Bart_
Příspěvky: 18
Registrován: 06 srp 2019, 23:24
Reputation: 0

Re: Jeden void pro více různých periferií

Příspěvek od Bart_ » 24 lis 2019, 15:38

Předpokládám že každé vytisknuté čerpadlo bude dávat na stejný počet kroků trochu jiné hodnoty. Takže v aplikaci stisknu kalibrovat, a pumpa udělá 15000 kroků, to nadávkuje určité množství ml. To vyplním do aplikace a trojčlenkou si vypočítám kolik kroků je potřeba na dávkování 5ml. No a pak když bude potřeba dávkovat třeba 30 ml, tak další trojčlenkou vypočítá kolik kroků musí udělat aby to nadávkoval.

Já zatím používám tuhle https://www.thingiverse.com/thing:1134817, ale líp mi vychází tisknutí SLA tiskem než klasicky (nedrhne). Zatím je to proof of concept.

Dobře, jdu si číst něco o třídách :D

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Jeden void pro více různých periferií

Příspěvek od kiRRow » 24 lis 2019, 16:07

Ano kalibrace se provádí nadávkováním X množství přesně danou rychlostí a přesně daným časem ... zvážený výsledek se zadá do nastavení a uloží do EEPROM. Ale má i režim, který využívá počtu otáček a kalibrace vůbec není nutná.

Bart_
Příspěvky: 18
Registrován: 06 srp 2019, 23:24
Reputation: 0

Re: Jeden void pro více různých periferií

Příspěvek od Bart_ » 24 lis 2019, 22:44

Takže..dostal jsem se k tomuto:

Kód: Vybrat vše

#include <Stepper.h>

class MujMotor: public Stepper {
  public:
    MujMotor(int, int, int, int, int);
    int zkalibrovano;
    int kalibrace10mL = 10;
    String readString;
    
    void kalibracePump();
    void odvzdusneniPump();
    void testKalibrace();
    void rucniMichani();
    
        
};

void MujMotor::kalibracePump () { //kalibrace pumpy a= krokový motor
  long kalibrace = 10000; //10000 kroků pro kalibraci
  float nadavkovano; //musí se zadat -> hodnota která se nadávkovala při 15000 krocích


  step(kalibrace);
  Serial.println("zadejte nadávkované množství v ml");

  //čekej na zadání parametrů
  while (!Serial.available()); //čekej na zadání parametrů
  while (Serial.available()) {
    char c = Serial.read();  //gets one byte from serial buffer
    readString += c; //makes the String readString
    delay(2);  //slow looping to allow buffer to fill with next character
  }
  if (readString.length() > 0) {
    //Serial.println(readString);  //so you can see the captured String
    nadavkovano = readString.toFloat();  //convert readString into a number

    readString = "";

  }

  zkalibrovano = (kalibrace10mL * kalibrace) / nadavkovano;

  Serial.println(zkalibrovano);

  //return zkalibrovano;
  // uložit kalibraci do EEPROM

}

void MujMotor::testKalibrace() {
  Serial.println("dávkuji 10ml");
  step(zkalibrovano);
}
const int stepsPerRevolution = 200;

MujMotor motor1(stepsPerRevolution, 8, 9, 10, 11); //zde mi to nedovolí vytvořit tento objekt

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
motor1.kalibracePump();
}

void loop() {
  // put your main code here, to run repeatedly:

}
Nedaří se mi vytvořit objekt motor1, píše mi to tuto chybu:
C:\Users\bartv\AppData\Local\Temp\ccwIAt3T.ltrans0.ltrans.o: In function `__static_initialization_and_destruction_0':

C:\Users\bartv\AppData\Local\Temp\arduino_modified_sketch_741779/sketch_nov24c.ino:56: undefined reference to `MujMotor::MujMotor(int, int, int, int, int)'

collect2.exe: error: ld returned 1 exit status

exit status 1
Nastala chyba při kompilaci u desky Arduino/Genuino Uno.
Definovat MujMotor::MujMotor(int, int, int, int, int) se mi taky ale nedaří, kde dělám chybu? Snažím se o něco takovýho:

Kód: Vybrat vše

MujMotor::MujMotor(int number_of_steps, int motor_pin_1, int motor_pin_2, int motor_pin_3, int motor_pin_4) : Stepper (int number_of_steps, int motor_pin_1, int motor_pin_2, int motor_pin_3, int motor_pin_4) {
    
}
odkaz na knihnu Stepper: https://github.com/arduino-libraries/St ... master/src

Odpovědět

Kdo je online

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