@Remork . Thanks for the feedback, hopefully it's fixed now.
is anyone successfully using i2c OLED / LCD?
- Edited
giuliomoro
well.. dunno?
with the risk of being pedantic
is the "http://bela.io/" supposed to be in the RestartSec line?
and
giuliomoro journalcltl
still has an L too many.
Remork is the "http://bela.io/" supposed to be in the RestartSec line?
D'OH
Remork still has an L too many.
D'OH D'OH
:face_with_rolling_eyes:
"pedantic" == reasonable in this case. Fixed now I think (again!).
can't even get the emoji to work ..
- 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);