• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
optymalizacja kodu
#4
Najprościej dane zaktualizować wysyłając je komendą przez UART. Podłączanie kablem nie jest koniczne, teraz w każdym domu jest laptop z BT, telefon z BT (a na androida mnóstwo terminali, nakładek Arduino które wyślą Ci całą komendę po wpisaniu danych w okienka) moduł HC-05 to koszt 20zł, 10zł z Chin. W bibliotece do zegarka by Eric Ayars jest przykład z ustawieniem czasu przez Uart, wystarczy go wysłać w formacie YYMMDDwHHMMSS.
Ja to robię inaczej, przykład zabawy z silniczkiem krokowym:

Kod:
#include <AccelStepper.h>
#define HALFSTEP 8
//http://42bots.com/tutorials/28byj-48-stepper-motor-with-uln2003-driver-and-arduino-uno/

// Motor pin definitions
#define motorPin1  2     // IN1 on the ULN2003 driver 1
#define motorPin2  3     // IN2 on the ULN2003 driver 1
#define motorPin3  4     // IN3 on the ULN2003 driver 1
#define motorPin4  5     // IN4 on the ULN2003 driver 1
#define onerev  4076    // jeden pelny obrot dla silnicza z przekladnia
#define hourestep onerev/12 //obrot o 1/12
#define LED 13
#define buffsize 32
char input[buffsize];

// Initialize with pin sequence IN1-IN3-IN2-IN4 for using the AccelStepper with 28BYJ-48
AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
unsigned long czaspoprzedni;
uint8_t minuta, sekunda, setka, flagaminuta, flagasekunda, flagasetka;
uint8_t interwal = 100;
int16_t dane [4];
byte index = 0;
boolean stringComplete = false;  // whether the string is complete
int16_t maxspeed = 600, maxtime = 1800;

void inline parsujpolecenia();

void setup() {
 Serial.println("cmd=moveto,speed,maxspeed,acceleration");
 stepper1.setMaxSpeed(800.0);
 stepper1.setAcceleration(500.0);
 stepper1.setSpeed(100);
 stepper1.moveTo(onerev);
 Serial.begin (115200);
 pinMode(LED, OUTPUT);
}//--(end setup )---

void loop() {
 unsigned long czasteraz = millis();
 stepper1.run();
 if (stringComplete) parsujpolecenia();

 if ( czasteraz - czaspoprzedni >= interwal)
 {
   czaspoprzedni = czasteraz;
   flagasetka = 1;
   setka++;
 }
 if (setka >= 10)
 {
   setka = 0;
   flagasekunda = 1;
   sekunda++;
   Serial.println(stepper1.currentPosition());
   if (stepper1.distanceToGo() == 0)
   {
     // stepper1.moveTo(stepper1.currentPosition()+hourestep);
   }
   digitalWrite(LED, !digitalRead(LED));
 }
 if (sekunda >= 60)
 {
   sekunda = 0;
   flagaminuta = 1;
   minuta++;
 }
 if (flagaminuta)
 { flagaminuta = 0;
   stepper1.moveTo(0);
 }
}

void serialEvent() {
 while (Serial.available() > 0) {

   char aChar = Serial.read();
   if (aChar == '\n')
   {
     // End of record detected. Time to parse
     input[index] = 0;
     index = 0;
     stringComplete = true;
   }
   else
   {
     input[index] = aChar;
     if (index < buffsize) index++;
     input[index] = '\0'; // Keep the string NULL terminated
   }
 }
}


void inline parsujpolecenia()
{
 uint8_t index = 0;
 char * polecenie = input;
 Serial.print("Otrzymane polecenie: ");
 Serial.println(polecenie);

 char* command1 = strtok(polecenie, "=");

 if (strcmp(command1 , "cmd") == 0) {
   while (command1 != 0)
   {
     Serial.println(command1);
     command1 = strtok(NULL, ",");
     if (index < 4) dane[index] = atoi(command1);
     index++;
   }
   stepper1.moveTo(stepper1.currentPosition() + dane[0]);
   if (dane[2] > 0 && dane[2] < 800) stepper1.setMaxSpeed(dane[2]);
   if (dane[1] > 0 && dane[1] < stepper1.maxSpeed()) stepper1.setSpeed(dane[1]);
   if (dane[3] > 0 && dane[3] < 800) stepper1.setAcceleration(dane[3]);
 }
 else Serial.println("Polecenie nieprawidlowe");
 Serial.println("Aktualne parametry:");
 Serial.print("Go to   = ");
 Serial.println( stepper1.targetPosition());
 Serial.print("runSpeed =   ");
 Serial.println( stepper1.runSpeed());
 Serial.print("maxSpeed =   ");
 Serial.println(stepper1.maxSpeed());
 Serial.print("speed = ");
 Serial.println(stepper1.speed());

 stringComplete = false;
}
Opis różnych funkcji do parsowania jest w tym wątku: https://forum.arduinopolska.pl/watek-sterowanie-przeka%C5%BAnikiem-za-pomoc%C4%85-sms-arduino-uno-modu%C5%82-gsm
Delay jest dla ludzi jak każda inna funkcja, jeśli wiesz, że wysyłając komendę do modemu masz czekać 2s i nic w tym czasie nie zamierzasz robić to wstaw delay, ale możesz też napisać funkcję jak do odczytu ph, funkcja jest uruchamiana za każdym obiegiem pętli loop, ale nie jest wykonywana jej "czasochłonna" część częściej niż wymagany czas. Tak samo można zrobić sobie funkcję temp(). Wywołujesz funkcję, dajesz rozkaz pomiaru temperatury, odpalasz tu timer programowy na zmiennych static i ustawiasz flagę (też zmienna static), że zlecono pomiar, wychodzisz z funkcji. Funkcja jest wywoływana przez kolejne obiegi pętli ale nic już nie robi (no mierzy tylko czas), ustawiona flaga zleconego pomiaru i brak flagi odliczenia czasu timerem powoduje wyjście (jakiś if przed rozkazem pomiaru temperatury, jakiś if przed rozkazem odczytu temperatury) .  W czasie tych 750ms zostanie pewnie wywołana tysiące razy, tak samo inne funkcje pętli loop, jak naciśniesz jakiś przycisk lub zmieni się sekunda jest czas by coś z tym zrobić natychmiast. Po którymś sprawdzeniu czas minął, w końcu ustawiasz flagę czasu, odczytujesz temperaturę zerujesz flagę zleconego pomiaru i albo zlecasz kolejny pomiar albo blokujesz tak samo tę funkcję na 9,25s lub inny potrzebny interwał czasu.  DS18B20 nigdy nie będzie rajdówką, nawet odczyt analogowy arduino to około 100us vs 27ms odczytu z DS, za to komunikacja jest cyfrowa, jak ktoś urwie kabel, pomiar jest zły to od razu wiadomo.  Jak zmienisz płytkę na DUE/Bluepill/ESP8266 to tak pisany program od razu zauważy dodatkowego kopa, millis() i micros() będą działać tak samo, a pętla zamiast być wykonana tysiąc razy na 8bitowym procku 16MHz będzie wykonywana miliony razy na procku 32bitowym  160MHz.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Wiadomości w tym wątku
optymalizacja kodu - przez nebari - 12-03-2018, 20:24
RE: optymalizacja kodu - przez kaczakat - 13-03-2018, 04:37
RE: optymalizacja kodu - przez nebari - 13-03-2018, 14:19
RE: optymalizacja kodu - przez kaczakat - 14-03-2018, 04:20
RE: optymalizacja kodu - przez nebari - 14-03-2018, 20:24
RE: optymalizacja kodu - przez Robson Kerman - 15-03-2018, 20:37
RE: optymalizacja kodu - przez Robson Kerman - 15-03-2018, 20:46

Skocz do:


Przeglądający: 1 gości