25-04-2019, 12:19
Sprawa wygląda tak kod z internetu sterowanie hdd z ardrino u mnie UNO oczywiście działa ...
https://www.youtube.com/watch?v=CMz2DYpos8w
"lekko zmodyfikowany idea jak w oryginale " jest to "szybki kod w pętli " przełączający cewki o 120
i chciałem w ramach Nuki-experymentu podkraść/podejrzeć zmienna co 1s z zastosowaniem mils() i wyświetlić na oled i mam problem ...(w zasadzie chciałbym co 0,5 s)
dodanie kodu wyświetlania na oled lub na serialu spowalnia pętlę co doprowadza do szarpania silnika ...
JAK się takie zadanie realizuje ...
W głównej pętli wykonuje się coraz szybszy rozpędzający kod do punktu stabilizacji a tu poboczne zadanie psuje pracę .... NIE WIEM JAK WSTAWIC KOD sory robie jak umie ....(prosił bym o link jak to zrobic )
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
int phase1 = 2;
int phase2 = 3;
int phase3 = 4;
int led1 = 10;
int led2 = 12;
int led3 = 13;
int steps = 5;
unsigned long MaxKrok = 40000;
unsigned long MinKrok = 1200;
unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas= 0;
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.setTextColor(WHITE);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(phase1, OUTPUT);
pinMode(phase2, OUTPUT);
pinMode(phase3, OUTPUT);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
}
void loop() {
switchStep(1);
switchStep(2);
switchStep(3);
if(MaxKrok > MinKrok) //kroki potrzebne do przyspieszenia silnika
{
MaxKrok = MaxKrok - steps;
} else {
MaxKrok=MinKrok;
}
if (MaxKrok < 39950 && MaxKrok > 20000) { digitalWrite(led1, HIGH); steps = 300; } else digitalWrite(led1, LOW);
if (MaxKrok < 20000 && MaxKrok > 3000 ) { digitalWrite(led2, HIGH); steps = 50 ;} else digitalWrite (led2 , LOW);
if (MaxKrok < 3000 && MaxKrok > MinKrok ) { digitalWrite(led3, HIGH); steps = 2 ;} else digitalWrite (led3 , LOW);
// podkradniecie zmiennej MaxKrok co 1s z petli glownej i do oled
aktualnyCzas = millis();
if (aktualnyCzas - zapamietanyCzas >= 1000)
{
display.clearDisplay();
display.setCursor(8,10);
display.println(MaxKrok);
display.display();
zapamietanyCzas = aktualnyCzas;
}
}
void switchStep(int stage) // zmiana faz
{
switch(stage)
{
case 1:
digitalWrite(phase1, HIGH);
digitalWrite(phase2, LOW);
digitalWrite(phase3, LOW);
myDelay(MaxKrok);
break;
case 2:
digitalWrite(phase1, LOW);
digitalWrite(phase2, HIGH);
digitalWrite(phase3, LOW);
myDelay(MaxKrok);
break;
default:
digitalWrite(phase1, LOW);
digitalWrite(phase2, LOW);
digitalWrite(phase3, HIGH);
myDelay(MaxKrok);
break;
}
}
void myDelay(unsigned long p) {
if (p > 16380) {
delay (p/1000);
} else {
delayMicroseconds(p);
}
}
POZDRAWIAM DZIEKI
https://www.youtube.com/watch?v=CMz2DYpos8w
"lekko zmodyfikowany idea jak w oryginale " jest to "szybki kod w pętli " przełączający cewki o 120
i chciałem w ramach Nuki-experymentu podkraść/podejrzeć zmienna co 1s z zastosowaniem mils() i wyświetlić na oled i mam problem ...(w zasadzie chciałbym co 0,5 s)
dodanie kodu wyświetlania na oled lub na serialu spowalnia pętlę co doprowadza do szarpania silnika ...
JAK się takie zadanie realizuje ...
W głównej pętli wykonuje się coraz szybszy rozpędzający kod do punktu stabilizacji a tu poboczne zadanie psuje pracę .... NIE WIEM JAK WSTAWIC KOD sory robie jak umie ....(prosił bym o link jak to zrobic )
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
int phase1 = 2;
int phase2 = 3;
int phase3 = 4;
int led1 = 10;
int led2 = 12;
int led3 = 13;
int steps = 5;
unsigned long MaxKrok = 40000;
unsigned long MinKrok = 1200;
unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas= 0;
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.setTextColor(WHITE);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(phase1, OUTPUT);
pinMode(phase2, OUTPUT);
pinMode(phase3, OUTPUT);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
}
void loop() {
switchStep(1);
switchStep(2);
switchStep(3);
if(MaxKrok > MinKrok) //kroki potrzebne do przyspieszenia silnika
{
MaxKrok = MaxKrok - steps;
} else {
MaxKrok=MinKrok;
}
if (MaxKrok < 39950 && MaxKrok > 20000) { digitalWrite(led1, HIGH); steps = 300; } else digitalWrite(led1, LOW);
if (MaxKrok < 20000 && MaxKrok > 3000 ) { digitalWrite(led2, HIGH); steps = 50 ;} else digitalWrite (led2 , LOW);
if (MaxKrok < 3000 && MaxKrok > MinKrok ) { digitalWrite(led3, HIGH); steps = 2 ;} else digitalWrite (led3 , LOW);
// podkradniecie zmiennej MaxKrok co 1s z petli glownej i do oled
aktualnyCzas = millis();
if (aktualnyCzas - zapamietanyCzas >= 1000)
{
display.clearDisplay();
display.setCursor(8,10);
display.println(MaxKrok);
display.display();
zapamietanyCzas = aktualnyCzas;
}
}
void switchStep(int stage) // zmiana faz
{
switch(stage)
{
case 1:
digitalWrite(phase1, HIGH);
digitalWrite(phase2, LOW);
digitalWrite(phase3, LOW);
myDelay(MaxKrok);
break;
case 2:
digitalWrite(phase1, LOW);
digitalWrite(phase2, HIGH);
digitalWrite(phase3, LOW);
myDelay(MaxKrok);
break;
default:
digitalWrite(phase1, LOW);
digitalWrite(phase2, LOW);
digitalWrite(phase3, HIGH);
myDelay(MaxKrok);
break;
}
}
void myDelay(unsigned long p) {
if (p > 16380) {
delay (p/1000);
} else {
delayMicroseconds(p);
}
}
POZDRAWIAM DZIEKI