feat: update PWM handling in SimulatorCanvas and enhance I2C Scanner example with SSD1306 OLED integration
parent
d35ad2d2f7
commit
c19a6cb848
|
|
@ -463,10 +463,12 @@ export const SimulatorCanvas = () => {
|
||||||
);
|
);
|
||||||
unsubscribers.push(unsubscribe);
|
unsubscribers.push(unsubscribe);
|
||||||
|
|
||||||
// PWM subscription: update LED opacity when the pin receives a LEDC duty cycle
|
// PWM subscription: update LED opacity when the pin receives a LEDC duty cycle.
|
||||||
|
// duty=0 means no PWM / analogWrite(0) — clear the inline style so the
|
||||||
|
// component keeps its default visibility instead of becoming invisible.
|
||||||
const pwmUnsub = pinManager.onPwmChange(pin, (_p, duty) => {
|
const pwmUnsub = pinManager.onPwmChange(pin, (_p, duty) => {
|
||||||
const el = document.getElementById(component.id);
|
const el = document.getElementById(component.id);
|
||||||
if (el) el.style.opacity = String(duty); // duty is 0.0–1.0
|
if (el) el.style.opacity = duty > 0 ? String(duty) : '';
|
||||||
});
|
});
|
||||||
unsubscribers.push(pwmUnsub);
|
unsubscribers.push(pwmUnsub);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -932,7 +932,7 @@ void loop() {
|
||||||
{
|
{
|
||||||
id: 'i2c-scanner',
|
id: 'i2c-scanner',
|
||||||
title: 'I2C Scanner (TWI)',
|
title: 'I2C Scanner (TWI)',
|
||||||
description: 'Scans the I2C bus and reports all devices found. Tests TWI protocol. Virtual devices at 0x48, 0x50, 0x68 should be detected.',
|
description: 'Scans the I2C bus and reports all devices found. SSD1306 OLED (0x3C) is wired on canvas; virtual devices at 0x48, 0x50, 0x68 also respond.',
|
||||||
category: 'communication',
|
category: 'communication',
|
||||||
difficulty: 'intermediate',
|
difficulty: 'intermediate',
|
||||||
code: `// I2C Bus Scanner — TWI Protocol Test
|
code: `// I2C Bus Scanner — TWI Protocol Test
|
||||||
|
|
@ -999,8 +999,14 @@ void loop() {
|
||||||
`,
|
`,
|
||||||
components: [
|
components: [
|
||||||
{ type: 'wokwi-arduino-uno', id: 'arduino-uno', x: 100, y: 100, properties: {} },
|
{ type: 'wokwi-arduino-uno', id: 'arduino-uno', x: 100, y: 100, properties: {} },
|
||||||
|
{ type: 'wokwi-ssd1306', id: 'ssd1306-1', x: 420, y: 120, properties: {} },
|
||||||
|
],
|
||||||
|
wires: [
|
||||||
|
{ id: 'wire-sda', start: { componentId: 'arduino-uno', pinName: 'A4' }, end: { componentId: 'ssd1306-1', pinName: 'DATA' }, color: '#2196f3' },
|
||||||
|
{ id: 'wire-scl', start: { componentId: 'arduino-uno', pinName: 'A5' }, end: { componentId: 'ssd1306-1', pinName: 'CLK' }, color: '#ff9800' },
|
||||||
|
{ id: 'wire-gnd', start: { componentId: 'arduino-uno', pinName: 'GND.1' }, end: { componentId: 'ssd1306-1', pinName: 'GND' }, color: '#000000' },
|
||||||
|
{ id: 'wire-vcc', start: { componentId: 'arduino-uno', pinName: '5V' }, end: { componentId: 'ssd1306-1', pinName: 'VIN' }, color: '#ff0000' },
|
||||||
],
|
],
|
||||||
wires: [],
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'i2c-rtc-read',
|
id: 'i2c-rtc-read',
|
||||||
|
|
|
||||||
|
|
@ -255,7 +255,7 @@ export class AVRSimulator {
|
||||||
this.lastPortBValue = 0;
|
this.lastPortBValue = 0;
|
||||||
this.lastPortCValue = 0;
|
this.lastPortCValue = 0;
|
||||||
this.lastPortDValue = 0;
|
this.lastPortDValue = 0;
|
||||||
this.lastOcrValues = new Array(this.pwmPins.length).fill(-1);
|
this.lastOcrValues = new Array(this.pwmPins.length).fill(0);
|
||||||
|
|
||||||
this.setupPinHooks();
|
this.setupPinHooks();
|
||||||
|
|
||||||
|
|
@ -503,7 +503,7 @@ export class AVRSimulator {
|
||||||
this.lastPortBValue = 0;
|
this.lastPortBValue = 0;
|
||||||
this.lastPortCValue = 0;
|
this.lastPortCValue = 0;
|
||||||
this.lastPortDValue = 0;
|
this.lastPortDValue = 0;
|
||||||
this.lastOcrValues = new Array(this.pwmPins.length).fill(-1);
|
this.lastOcrValues = new Array(this.pwmPins.length).fill(0);
|
||||||
this.setupPinHooks();
|
this.setupPinHooks();
|
||||||
|
|
||||||
console.log('AVR CPU reset complete');
|
console.log('AVR CPU reset complete');
|
||||||
|
|
|
||||||
|
|
@ -497,10 +497,10 @@ export const useSimulatorStore = create<SimulatorState>((set, get) => {
|
||||||
|
|
||||||
set((s) => {
|
set((s) => {
|
||||||
const boards = s.boards.map((b) =>
|
const boards = s.boards.map((b) =>
|
||||||
b.id === boardId ? { ...b, running: true } : b
|
b.id === boardId ? { ...b, running: true, serialMonitorOpen: true } : b
|
||||||
);
|
);
|
||||||
const isActive = s.activeBoardId === boardId;
|
const isActive = s.activeBoardId === boardId;
|
||||||
return { boards, ...(isActive ? { running: true } : {}) };
|
return { boards, ...(isActive ? { running: true, serialMonitorOpen: true } : {}) };
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue