# OLED 0.49"

The OLED 0.49" extension board is based on the **SSD1306 0.49" 14pin OLED** display with 64x32 pixels. The display uses I2C to communicate with the Picoclick (SDA = GPIO2, SCL = GPIO8). It uses the 3.3V power supply of the Picoclick and thus is only active when the Picoclick is activated.

The extension connector is underneath the display.

## Hardware

### Overview

<figure><img src="/files/miPnQOLg9al7ZjNPF1Hw" alt=""><figcaption></figcaption></figure>

### Technical drawing

<figure><img src="/files/oUmEmJPsj9uV9o7uAOLY" alt=""><figcaption><p>Measurements in mm, grid is 0.5mm</p></figcaption></figure>

* PCB: 18mm x 13mm
* Thickness: 1mm
* Corner radius: 2mm

### Schematics

<figure><img src="/files/gpm9VFdzTuMf3hT2ZgZm" alt=""><figcaption></figcaption></figure>

## Software

Hardwaretest can be found on [Github](https://github.com/makermoekoe/Picoclick-C3/tree/main/code/Picoclick_C3/PC3_Hardwaretest_OLED_049).

```
#include <Arduino.h>
#include <WiFi.h>
#include <FastLED.h>
#include <U8g2lib.h>
#include <Wire.h>
#include "config.h"

U8G2_SSD1306_64X32_1F_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

struct fonts {
  const uint8_t* font;
  int width;
  int height;
};

enum box_alignment {
  Center,
  Left,
  Right
};

fonts font_xl = {u8g2_font_profont29_mf, 16, 19};
fonts font_m = {u8g2_font_profont17_mf, 9, 11};
fonts font_s = {u8g2_font_profont12_mf, 6, 8};
fonts font_xs = {u8g2_font_profont10_mf, 5, 6};

int left = 0, width = 64, top = 0, height = 32;

u8g2_uint_t scrolling_offset = 0;
u8g2_uint_t scrolling_width;
const char *scrolling_text = "makermoekoe ";

void print_text(String str, fonts f, box_alignment align, float pos) {
  u8g2.setFont(f.font);
  int x = 0;
  if(align == Center) x = left + 0.5 * (width - (f.width * str.length() - 1));
  else if(align == Left) x = left + 5;
  else if(align == Right) x = left + width - f.width * str.length() - 5;
  u8g2.firstPage();  
  do{
    u8g2.drawStr(x, top + pos * height + f.height / 2, str.c_str());
  } while(u8g2.nextPage());
}

void setup(){
  pinMode(BUTTON_PIN, INPUT);
  pinMode(ADC_ENABLE_PIN, OUTPUT);
  pinMode(ADC_PIN, INPUT);
  analogReadResolution(12);
  digitalWrite(ADC_ENABLE_PIN, HIGH);

  WiFi.mode(WIFI_OFF);

  FastLED.addLeds<APA102, APA102_SDI_PIN, APA102_CLK_PIN, BGR>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  FastLED.setBrightness(100);
  delay(50);

  set_fastled(CRGB::Blue);

  Wire.begin(SDA_PIN, SCL_PIN);
  delay(100);
  u8g2.begin();
  delay(100);
  print_text("HEY", font_xl, Center, 0.5);
  delay(1000);

  scrolling_width = u8g2.getUTF8Width(scrolling_text);		// calculate the pixel width of the text
}

unsigned long t_display = 0;

void loop() {
  if(digitalRead(BUTTON_PIN) == 1){
    set_fastled(CRGB::Red);
    print_text("BYE", font_xl, Center, 0.5);
    delay(1000);
    esp_deep_sleep_start();
  }

  if(millis() >= t_display + 15){
    t_display = millis();
    u8g2_uint_t x;
  
    u8g2.firstPage();
    do{
      // draw the scrolling text at current offset
      x = scrolling_offset + 64;
      u8g2.setFont(font_m.font);		// set the target font
      do{								// repeated drawing of the scrolling text...
        u8g2.drawUTF8(x, 20, scrolling_text);			// draw the scolling text
        x += scrolling_width;						// add the pixel width of the scrolling text
      } while(x < 64);		// draw again until the complete display is filled
      
    } while(u8g2.nextPage() );
    
    scrolling_offset-=1;							// scroll by one pixel
    if((u8g2_uint_t)scrolling_offset < (u8g2_uint_t)-scrolling_width){
      scrolling_offset = 0;							// start over again
    }
  }
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://makermoekoe.gitbook.io/picoclick-c3/extension-boards/oled-0.49.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
