Vooruitlopend op de komst van de losse CH32v003 chippies eerst nog een paar testjes met het programmeren van het “ontwikkelbordje” (de F4P6 variant).
De pinnen 3V3, Gnd en SWDIO van de WCH-LinkE verbonden met de pinheader op de CH32v003, respectievelijk VDD, Gnd en SWD en het programmeren vanuit de Arduino IDE verloopt als een trein!
Testen van I2C
Ik had ergens gelezen dat je de analoog-digitaal-converter (ADC) pas kon gebruiken nadat je ‘m geactiveerd hebt. Standaard staat ie blijkbaar uitgeschakeld. Ik vroeg me af of dat dan ook geldt voor I2C. Volgens de datasheet zit er maar één II2C bus op. Toch zie ik op de 20-pins variant ook het volgende:
- SDA – PC1 (vet gedrukt) en PC6, PD8 (cursief gedrukt)
- SCL – PC2 (vet gedrukt) en PC5 & PD1 (cursief gedrukt)

Ik gok maar even op de combinatie van de pinnen PC1 en PC2, wat overeenkomt met D3 en D4 in de Arduino-code. Eerste testje hieronder.
// CH32V003 testprogramma aansturen OLED-scherm
//
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#define I2C_ADDRESS 0x3C
SSD1306AsciiWire oled;
void setup() {
Wire.begin(3,4); // SDA = PC1 = D3, SCL = PC2 = D4
oled.begin(&Adafruit128x64, I2C_ADDRESS);
oled.set400kHz();
oled.setFont(Adafruit5x7);
oled.clear();
oled.print("CH32V003_OLED_test1.ino");
delay(2000);
oled.clear();
}
void loop() {
oled.print("Test aan");
delay(2000);
oled.clear();
oled.print("Test uit");
delay(2000);
oled.clear();
}
Geen beeld! Maar het blijkt eenvoudiger dan gedacht: geen pinnummers opgeven bij Wire.begin, dus …
Wire.begin()
… en dan werkt het gewoon! Blijkbaar zijn PC1 en PC2 standaard al gedefinieerd en moet je het niet nogmaals aangeven.
Testen van de ADC
Vervolgens verder met de ADC. Zoals hierboven al gezegd had ik al ergens gezien dat de ADC niet vanzelf zal gaan werken. Onderstaande programma bewees dat!
// CH32V003 testprogramma ADC
//
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
int analogPin = A2;
//#define analogPin PIN_A2 //Dit kan ook
int analogValue;
#define I2C_ADDRESS 0x3C
SSD1306AsciiWire oled;
void setup() {
Wire.begin();
oled.begin(&Adafruit128x64, I2C_ADDRESS);
oled.set400kHz();
oled.setFont(Adafruit5x7);
oled.clear();
oled.print("CH32V003_ADC_test1.ino");
delay(2000);
oled.clear();
}
void loop() {
analogValue = analogRead(analogPin);
oled.print("ADC-waarde is ");
oled.print(analogValue);
delay(1000);
oled.clear();
}
Want een 1K potmeter aangesloten op A0 (PA2) gaf alleen maar “0” als waarde. Maar ook op A1, A2, en A4 het zelfde resultaat. Hoe zet je die ADC aan?? Beetje rondzoeken en dan blijkt dat je de ADC kunt “aanzetten” door in het bestand “variant_CH32V003F4.h” van de CH332-library voor de regel:
//#define ADC_MODULE_ENABLE
de dubbele slashes weg te halen. Ik vond het bestand (onder Windows 11) hier:

/* ENABLE Peripherals */
//#define ADC_MODULE_ENABLED
#define UART_MODULE_ENABLED
// #define SPI_MODULE_ENABLED
#define I2C_MODULE_ENABLED
De UART en I2C stonden al enabled, de SPI en de ADC stonden standaard dus uit. Aangezien het document “variant_CH32V003F4.h” heet en werkt voor de CH32v003F4P6 vraag ik me af of het ook zal werken voor de chippes die onderweg zijn: de J4M6 en de A4M6. We zullen het merken!
Waar je wel tegenaan loopt is de beperkte hoeveelheid geheugen. Bovenstaand programma levert voor analogValue een waarde van 0 (bij 0V) tot 1023 (bij 3,3V). Om in het scherm het voltage te printen moet de volgende berekening gemaakt worden:
Voltage = (3,3 : 1023) x analogValue
- 3,3 is het maximale voltage
- 1023 is de maximale waarde van analogValue
Bijvoorbeeld: wanneer analogValue = 564, dan is het voltage 1,82 Volt.
En om dat te kunnen doen moet je met floats werken en dat kost veel geheugen: te veel voor de CH32V003! Daardoor dus foutmeldingen tijdens de compilatie. Aangezien de andere varianten net zoveel geheugen hebben, zal het daarmee evenmin werken en dat is natuurlijk jammer.
Er valt nog wat geheugen vrij te spelen door UART_MODULE_ENABLED” uit te schakelen. Bovenstaande programma verbruikt ca. 10% minder flash geheugen (12216 bytes, i.p.v. 13804 bytes) en 6% minder SRAM (624 bytes i.p.v. 748 bytes).
Met UART aangezet:
Sketch uses 12216 bytes (74%) of program storage space. Maximum is 16384 bytes.
Global variables use 624 bytes (30%) of dynamic memory, leaving 1424 bytes for local variables. Maximum is 2048 bytes.
Met UART uitgeschakeld:
Sketch uses 13804 bytes (84%) of program storage space. Maximum is 16384 bytes.
Global variables use 748 bytes (36%) of dynamic memory, leaving 1300 bytes for local variables. Maximum is 2048 bytes.
Tegen deze beperking ben ik eigenlijk tot nog toe met de Arduino en de ESP32 C3 (heeft een overmaat aan geheugen!) niet aangelopen.

Met deze beperking zal ik rekening moeten houden bij de keuze welke processor in te zetten.