#include "Arduino.h"
constexpr int startPin = 4; // pin from UNO to ADC START
constexpr int eocPin = 2; // pin from ADC EOC to UNO
// The next pins used to simluate the ADC
constexpr int adcEOCpin = 5; // pin from UNO that simulates ADC EOC output pin
constexpr int adcStartPin = 3; // pin from UNO that simulates ADC START input pin
void setup() {
Serial.begin(9600);
// Changed from INPUT to INPUT_PULLUP for Wokwi
// The slide switches have been "modified" in diagram.json not to bounce!
pinMode(13, INPUT_PULLUP);
pinMode(12, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
pinMode(10, INPUT_PULLUP);
pinMode(startPin, OUTPUT);
pinMode(eocPin, INPUT);
// Interrupt routine that just reports that data are available
attachInterrupt(digitalPinToInterrupt(eocPin), setDataAvailable, RISING);
// Simulating ADC
// --------------------------------------------------------------------------
pinMode(adcEOCpin, OUTPUT);
pinMode(adcStartPin, INPUT);
digitalWrite(adcEOCpin, HIGH); // EOC seems to be HIGH if conversion not active
attachInterrupt(digitalPinToInterrupt(adcStartPin), setStart, FALLING);
// --------------------------------------------------------------------------
}
boolean convertingOn = false;
boolean dataAvailable = false;
// Only for ADC simulation
boolean startConverting = false;
void loop() {
startADCCycle(10);
simADC(); // Simulates the ADC "conversion" time
handleData();
}
void startADCCycle(unsigned long everyXmsec) {
static unsigned long lastCycle = 0;
if (!convertingOn && millis()-lastCycle >= everyXmsec) {
digitalWrite(startPin, HIGH); // set START Pin to High
delayMicroseconds(100);
digitalWrite(startPin, LOW); // set START Pin to LOW again
convertingOn = true;
lastCycle = millis();
}
}
void handleData() {
if (dataAvailable) {
convertingOn = false;
dataAvailable = false;
printData();
}
}
void setDataAvailable() {
dataAvailable = true;
}
void printData() {
int pin13State = 0;
int pin12State = 0;
int pin11State = 0;
int pin10State = 0;
static int lastpin13State = 1;
static int lastpin12State = 1;
static int lastpin11State = 1;
static int lastpin10State = 1;
pin13State = digitalRead(13);
pin12State = digitalRead(12);
pin11State = digitalRead(11);
pin10State = digitalRead(10);
if (pin13State != lastpin13State || pin12State != lastpin12State || pin11State != lastpin11State || pin10State != lastpin10State)
{
String out = "";
out = (pin13State == HIGH) ? "1" : "0";
out += (pin12State == HIGH) ? "1" : "0";
out += (pin11State == HIGH) ? "1" : "0";
out += (pin10State == HIGH) ? "1" : "0";
Serial.println(out);
lastpin13State = pin13State;
lastpin12State = pin12State;
lastpin11State = pin11State;
lastpin10State = pin10State;
}
}
// Simulates the ADC functions START and EOC
void setStart() {
startConverting = true;
}
void simADC() {
static boolean isConverting = false;
static unsigned long startTime = 0;
if (isConverting) {
if (micros() - startTime > 500) { // Only assumption: ADC conversion time takes 500 microseconds
digitalWrite(adcEOCpin, HIGH);
isConverting = false;
}
} else {
isConverting = startConverting;
if (isConverting) {
startConverting = false;
startTime = micros();
digitalWrite(adcEOCpin, LOW);
}
}
}