Hello, I wrote a code that allows me to change the speed of a motor with a rotary encoder. Everything works fine, but when I try to display the speed on an OLED display, the motor moves very slowly and the display shows only small values. What should I do?
//OLED
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0);
//Encoder
#define ENCODER_DO_NOT_USE_INTERRUPTS
#include <Encoder.h>
Encoder myEnc(7, 8);
//Stepper
#include <AccelStepper.h>
AccelStepper stepper(1, 3, 4);
//
//
//
void setup() {
u8g2.begin();
u8g2.clearBuffer();
stepper.setMaxSpeed(3000); //2000
stepper.setSpeed(50);
}
long position = -1999;
long pulses;
//
//
//
void loop() {
stepper.runSpeed();
long newPos = myEnc.read();
if (newPos != position) {
position = newPos;
}
if (position >= -60 && position <= 60) { //position bewteen -40 and 40
pulses = position*1;
}
if (position >= -60 && position < -60 || position > 60 && position <= 80) { //position bewteen -80 and -40 or same in positive
pulses = position*1.4;
}
if (position < -80 || position > 80) {
pulses = position*20;
}
stepper.setSpeed(pulses);
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_logisoso16_tf ); // choose a suitable font at https://github.com/olikraus/u8g2/wiki/fntlistall
u8g2.setCursor(34,32);
u8g2.println(pulses); // write something to the internal memory
u8g2.sendBuffer(); // transfer internal memory to the display
}
OLED displays are drawn, not written.
The difference is that every dot has to be set, and that takes some time.
You are clearing your display buffer, and filling it in every iteration of 'loop'.
That takes a lot of time.
So don't do that.
You do not need to clear all content of your screen, only the part that needs to be updated.
And that also implies only if there is a changed displayed value.
So no need to draw the same content all the time.
And don't clear and rewrite the entire screen.
It'll speed up your sketch.
If that still doesn't do the trick, you need to rethink the way your sketch runs so that the stepper motor can be controlled more constantly.
If that means your display's content is updated in a less smoothly manner, so be it.
The AccelStepper library requires polling for each step and the display update takes too long, so this slows the step rate.
With an UNO/Nano/Mini Pro I use interrupts on Timer 1 for the stepper speed so no polling is needed.
I am guessing you are using a Teensy 2.0, so my stepper code will not work but you may well find an interrupt based steeper library somewhere or use the library here.
KaruYT:
Everything works fine, but when I try to display the speed on an OLED display, the motor moves very slowly and the display shows only small values. What should I do?
The display is probably more useful written rather than drawn, but I don't know if that will fix the problem. You might find this example useful. I don't know anything about Arduino.h, it is likely to be redundant, and it may be part of the problem.