can't even get the emoji to work ..
is anyone successfully using i2c OLED / LCD?
- Edited
giuliomoro can't even get the emoji to work .
LOL
looks super now.
but seriously, can you pin post 84 somewhere?
add it to the Wiki maybe? i know i'll be looking for this in the future..
let's see if magic works:
@bela_robert any chance you could turn https://forum.bela.io/d/314-is-anyone-successfully-using-i2c-oled-lcd/85 into a KB page?
I certainly can. I'll get that together next week when I'll have an OLED screen to hand to test with and post here once it's up.
thanks
- Edited
giuliomoro yeah wow, im at testing stage and im not sure where im going wrong, likely something very basic in the syntax in SC but i setup a simple osc path but no results...
''s.boot
~displayOSC = NetAddr.new("192.168.7.1", 7562);
~displayOSC.sendMsg('bela.local:7562', "magic!"); "
ultimately aiming to send different plot values/waveshapes
did you change the OSC2OLED4Bela program at all? I think you are not using the correct syntax and address.
I think in its original form it only responds to a handful of OSC addresses:
/osc-test
+ float, /tr
+ float + string, /param1
+ float.
So the following should work (running it from Sc on the host), while OSC2OLED4Bela
is running on Bela:
~displayOSC = NetAddr.new("192.168.7.2", 7562);
~displayOSC.sendMsg('/osc-test', 123.23);
~displayOSC.sendMsg('/tr', 123.23, 'mystr');
~displayOSC.sendMsg('/param1', 123.23);
giuliomoro ok great, this is helpful thank u, ill test with this and im sure ill have some questions shortly!
giuliomoro hi, i have two related questions that could be more SC syntax related but i thought id try here first...if i were to try and plot this line to oled
'''
Signal.sineFill(1000, 1.0/[1,2,3,4,5,6]).plot;
'''
do i use .asString to speak to OSC or .asRawOSC?
and a similar question about printing changing values to oled,
is printing the value of this slider related to .envirPairs?
'''
Window.closeAll;
w = Window ("gui", Rect(20,20,150,30))
.front
.alwaysOnTop(true);
~sliderx = Slider(w, Rect(20,20,150,30))
~sliderx.action({
arg obj;
w.view.background_(Color.black);
obj.value.postln;
});
'''
thanks, trying to get a feel for the environment
- Edited
please use backticks ( ``` ) and not '
to enclose your code
vivian if i were to try and plot this line to oled
The currently supported functions are the ones above and they show the few types of prints you can get currently. U assume they display some basic text only, but I don't have a working display at hand, did you try them out? To obtain anything other than that, you'll need to write some custom C++ code. The available graphics functions are here https://github.com/giuliomoro/OSC2OLED4Bela/blob/master/SSD1306_OLED.h#L151-L165
Looking at the names there, you'd probably to use drawPixel()
. I don't actually know how to handle bundles in OSC neither from the Sc side or the C side, so I'll assume for simplicity that you are sending some float values and you want to show those, but there is definitely room for improvements!
For instance, I expect that if you add this to the body of int parseMessage(oscpkt::Message msg, void* arg)
:
oscpkt::Message::ArgReader args = msg.match("/values");
if(args)
{
const unsigned int nValues = args.nbArgRemaining();
float values[nValues];
for(unsigned int n = 0; n < nValues; ++n)
{
if(args.isFloat())
{
args.popFloat(values[n]);
} else if(args.isInt32()) {
int i;
args.popInt32(i);
values[n] = i;
} else {
fprintf(stderr, "Wrong type at argument %d\n", n);
return -1;
}
}
// now tenValues contains the 10 values.
// prepare a bitmap:
printf("received: ");
for(unsigned int n = 0; n < 10; ++n)
printf("%f ", values[n]);
printf("\n");
clearDisplay();
for(unsigned int x = 0; x < SSD1306_LCDWIDTH; ++x)
{
// we interpret each value as the vertical displacement and
// we want to draw a series of horizontal lines at the specified points
unsigned int valIdx = x * float(nValues) / SSD1306_LCDWIDTH;
unsigned int y = values[valIdx] * SSD1306_LCDHEIGHT;
drawPixel(x, y, WHITE);
}
Display();
}
then you can send
~displayOSC.sendMsg('/values', 0, 0.1);
or
~displayOSC.sendMsg('/values', 0, 0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9);
to display n
horizontal bars which are placed left-to-right at a relative vertical positiony
, as specified by each of the float arguments (range 0 - 1). If you pass as many arguments as the number of horizontal pixels in the display ( typically 128), then each bar will be one pixel wide. There must be a better way of doing this from Sc than specifying the numbers as comma-separated values and probably using OSC bundles it would be a better idea.
vivian do i use .asString to speak to OSC or .asRawOSC?
no idea, sorry.
vivian Window.closeAll;
w = Window ("gui", Rect(20,20,150,30))
.front
.alwaysOnTop(true);
~sliderx = Slider(w, Rect(20,20,150,30))
~sliderx.action({
arg obj;
w.view.background_(Color.black);
obj.value.postln;
});
I am not sure what this does, but it would seem it's trying to create a slider in a GUI? There's no easy way to have the Sc GUI mirrored on the OLED display. You'll have to send dedicated commands which are parsed by the C++ file and sent to the display.
giuliomoro ok thanks so much, ill study and be back with some q's.
giuliomoro ok, ive got a solid way of OSC from sc running and your /values parse is definitely effective as a way to generate waveform plots, my c++ stinks so its a slight learning curve, would you say this is something worth studying as a way to plot a graph behind those plots?
https://github.com/EKMallon/Dual-ssd1306-OLED/blob/main/DUAL_1306_I2C_OLED_wEEpromFonts.ino
not sure what you mean with "plot a graph behind "?
giuliomoro sorry, similar to this example where there are pixel plots behind the float pixels
also i cant find how i can change the thickness of the float pixels displayed
Right, so this requires a bit more of work. The thickness of the pixel is always 1 (the drawPixel
command writes one pixel at a time). Also, we transitioned to another library which is more flexible and works with more screens. Here it is: https://github.com/giuliomoro/O2O/ . You can run that example as it is and use /waveform
to achieve the same that you are currently achieving with /values
.
Did you add any other code to the current version of the library?
giuliomoro wow great, ok ill get into this, no i didnt add anything
if you have an SSD1306 you'll need to replace this line in main.cpp
:
U8G2_SH1106_128X64_NONAME_F_HW_I2C_LINUX u8g2(U8G2_R0);
with:
class U8G2_SSD1306_128X64_NONAME_F_HW_I2C_LINUX : public U8G2 {
public: U8G2_SSD1306_128X64_NONAME_F_HW_I2C_LINUX(const u8g2_cb_t *rotation) : U8G2() {
u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, rotation, u8x8_byte_linux_i2c, u8x8_linux_i2c_delay);
}
};
U8G2_SSD1306_128X64_NONAME_F_HW_I2C_LINUX u8g2(U8G2_R0);
giuliomoro this is weird but when i throw the zip in the ide and make the project and run the changed main.cpp i get this
oh sorry I forgot to mention: you need to update your board to the latest dev
branch. Follow instructions here: https://learn.bela.io/using-bela/bela-techniques/updating-bela/#updating-to-an-experimental-release
- Edited
aha! ran into the same issue.
might be good to add that to the 'Using an OLED Screen' knowledge base page?
also, for Github noobs such as myself, 'the latest dev branch' is somewhat vague.
i'm assuming it's dev-i2c, but if that turns out to be the working one, it was still a lucky guess.