Condition sur un etat de pixel

Bonjour,

J'utilise un écran Oled avec un librairie Adafruit.

Pour allumer un pixel, la commande est :

display.drawPixel(uint16_t x, uint16_t y, uint16_t color);

uint16_t color = WHITE pour allumer
uint16_t color = BLACK pour éteindre

J'aimerai faire une condition du type :

if (drawPixel(uint16_t x, uint16_t y)==WHITE){
...
...
}

Ça marche pas aussi simplement.
Savez vous si c'est possible ?

Merci

Bonjour,

la fonction drawPixel ne renvoie rien ...
donc non.
A priori dans la librairie il n'y a pas de fonction getPixel a ma connaissance.

il faudrait donc l’écrire ! peut être avec une autre librairie ...

en général les OLED adafruit sont commandé par SSD1306 ou éventuellement SSD1305 il y a une partie de la mémoire qui est réservée a l'affichage qui est buffurisé il n'est pas impossible donc d'écrire une fonction de relecture
[ It uses 512 bytes of RAM since it needs to buffer the entire display but its very fast! ]

quand on entre dans le code de la librairie du SSD1306 on y trouve les différentes organisations mémoire suivant la définition.

Bon bah j'ai même pas eu le temps de m'y mettre ...

return buffer[x+(y/8)*SSD1306_LCDWIDTH]&(1<<(y&7)) ? 1 : 0;

j'aurai séché là un bon moment ...

dans la librairie j'avais changé l'image splascreen du début c'est pour ça que je savais que c'était mappé en ram.

manque juste le ; en fin de proto quand on sait c'est pas grave mais pour un novice qui va copié/coller.

Merci pour vos réponses.

J'ai plus le temps en ce moment, je regarde tout ca pendant les vacances.

Finalement j'ai craqué :wink:

J'ai suivi les indications et j'ai une erreur de compilation :

/Users/leveque/Documents/Arduino/libraries/Adafruit_SSD1306/Adafruit_SSD1306.cpp: In member function 'uint16_t Adafruit_SSD1306::getPixel(int16_t, int16_t)':
/Users/leveque/Documents/Arduino/libraries/Adafruit_SSD1306/Adafruit_SSD1306.cpp:47: error: 'ssd1306_swap' was not declared in this scope
/Users/leveque/Documents/Arduino/libraries/Adafruit_SSD1306/Adafruit_SSD1306.cpp:60: error: 'buffer' was not declared in this scope

J'arrive pas saisir le problème !

Merci

J'avais effectivement mal placé la définition de getPixel.

Mais,..., il y a souvent un mais :wink:

Avec getPixel dans le code ca ne compile plus, le message :

sketch_dec21c.ino: In function 'void loop()':
sketch_dec21c:26: error: 'getPixel' was not declared in this scope

voici mon code de test :

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

byte pixelValue=0;

void setup(){
  Serial.begin(9600);

  display.begin(SSD1306_SWITCHCAPVCC);
  display.clearDisplay();
  display.drawPixel(10, 10, WHITE);
  display.display();
}

void loop(){

  pixelValue=getPixel(10, 10);

  if (pixelValue==1) Serial.println("YES");
}

Ça marche nickel, MERCI.

Je me suis pas encore mis a la programmation objet, mais que signit cette expression, et particulierement buffer ?

return buffer[x+ (y/8)*SSD1305_LCDWIDTH] & _BV((y%8)) ? 1 : 0;

buffer et le nom de la variable tableau déclarée dans la librairie pour stocker l'image de l'écran.

static uint8_t buffer[SSD1306_LCDHEIGHT * SSD1306_LCDWIDTH / 8] = ...

hauteur de l'écran multipliée par largeur et divisé par 8 car dans un octet on stocke 8 pixels

donc l'expression retourne en fait la couleur du pixel en calculant l'adresse dans le tableau et en testant 1 bit de l'octet correspondant suivant x et y

mais j'avoue que ne programmant en C que depuis moins d'un an j'ai du mal a décortiquer ... il faut créer un masque et faire un ET logique bit a bit

ici _BV retourne directement un byte correspondant au bit pixel

? est un opérateur de condition raccourci si je puis dire

(condition) ? instruction si vrai : instruction si faux

mais je suis sur qu'une explication détaillée va arriver prochainement .... :slight_smile: