I have built a little project with an Arduino Due an oled adafruit display connected with sda and sdl in pin 20 and 21 and gnd to gnd and vcc to 3.3 volts and a serial keyboard working from the arduino ide or a serial terminal program with an implemented limited BASIC language, it works and i think can be built more over this code, like a true BASIC Code. An Apple ii very limited!!!!
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // Larghezza dello schermo OLED, in pixel
#define SCREEN_HEIGHT 64 // Altezza dello schermo OLED, in pixel
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
String inputBuffer = ""; // Buffer per memorizzare l'input da seriale
bool programEnded = false; // Flag per indicare se il programma è terminato
// Funzione per eseguire l'interpretazione dei comandi BASIC
void runBasicCommand(String command) {
if (command.startsWith("PRINT")) {
// Esegui il comando PRINT
String textToPrint = command.substring(6); // Rimuovi "PRINT " dalla stringa
display.clearDisplay(); // Cancella il display
display.setTextSize(1); // Imposta la dimensione del testo
display.setTextColor(SSD1306_WHITE); // Imposta il colore del testo
display.setCursor(0, 0); // Imposta la posizione del cursore
display.println(textToPrint); // Stampa il testo sul display
display.display(); // Aggiorna il display per visualizzare le modifiche
} else if (command.startsWith("INPUT")) {
// Esegui il comando INPUT
String prompt = command.substring(6); // Rimuovi "INPUT " dalla stringa
display.clearDisplay(); // Cancella il display
display.setTextSize(1); // Imposta la dimensione del testo
display.setTextColor(SSD1306_WHITE); // Imposta il colore del testo
display.setCursor(0, 0); // Imposta la posizione del cursore
display.println(prompt); // Visualizza il prompt sul display
display.display(); // Aggiorna il display per visualizzare le modifiche
// Attendi l'input dall'utente
while (!Serial.available()) {
delay(100);
}
inputBuffer = Serial.readStringUntil('\n'); // Leggi l'input dalla seriale
display.clearDisplay(); // Cancella il display
} else if (command.startsWith("GOTO")) {
// Esegui il comando GOTO
int lineNumber = command.substring(5).toInt(); // Rimuovi "GOTO " dalla stringa e converti in intero
Serial.print("Vai alla riga ");
Serial.println(lineNumber); // Stampa il numero della riga sulla seriale (per debugging)
// Implementa il salto alla riga desiderata
// ...
} else if (command == "END") {
// Esegui il comando END
programEnded = true; // Imposta il flag per indicare che il programma è terminato
Serial.println("Programma terminato.");
} else {
// Comando non supportato
Serial.println("Comando non supportato");
}
}
void setup() {
Wire.begin(); // Inizializza la comunicazione I2C
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Inizializza il display OLED
display.display(); // Aggiorna il display per visualizzare le modifiche
delay(2000); // Attendere 2 secondi
display.clearDisplay(); // Cancella il display
Serial.begin(9600); // Inizializza la comunicazione seriale
}
void loop() {
if (!programEnded && Serial.available() > 0) {
String receivedLine = Serial.readStringUntil('\n'); // Leggi una riga dalla porta seriale
Serial.println(receivedLine); // Stampa la riga ricevuta sulla seriale (per debugging)
// Esegui l'interpretazione del comando BASIC
runBasicCommand(receivedLine);
}
}