//...
// https://wokwi.com/projects/426225551245381633
const int segmentPins[8] = {11, 12, 2, 3, 4, 5, 6, 7};
const int digitPins[3] = {8, 9, 10};
//... common anode
# define OND HIGH // digit powered
# define OFFD LOW // or not
# define ONS LOW // segment powered
# define OFFS HIGH // or not
const byte digits[10] = {
B1111110, // 0
B0110000, // 1
B1101101, // 2
B1111001, // 3
B0110011, // 4
B1011011, // 5
B1011111, // 6
B1110000, // 7
B1111111, // 8
B1111011 // 9
};
unsigned long lastRead = 0;
const unsigned long readInterval = 2000; // 2-second update interval
float temperature = 42.0; //...
bool firstReading = true;
void setup() {
Serial.begin(115200);
Serial.println("\nJefferson Airplane!\n");
// Initialize pins
for (int i = 0; i < 8; i++) pinMode(segmentPins[i], OUTPUT);
for (int i = 0; i < 3; i++) pinMode(digitPins[i], OUTPUT);
return; //... skip animation life too short.
// Slower startup animation (10 seconds)
const byte animationFrames[] = {
B1000000, // A
B0100000, // B
B0010000, // C
B0001000, // D
B0000100, // E
B0000010, // F
B0000001 // G
};
unsigned long animationStart = millis();
unsigned long frameStart = animationStart;
int currentFrame = 0;
const int frameDuration = 500; //
while (millis() - animationStart < 10000) { // 10-second animation
// Update animation frame
if (millis() - frameStart >= frameDuration) {
frameStart = millis();
currentFrame = (currentFrame + 1) % 7;
}
// Try to read sensor during animation. why.
// Display current animation frame
displayAnimationFrame(animationFrames[currentFrame]);
}
}
void loop() {
float temp;
// Continuously attempt to read the sensor
if (1) {
// Update temperature every 10 seconds
if (millis() - lastRead >= readInterval) {
lastRead = millis();
temperature += 0.77; //... just getting hotter
Serial.println(temperature);
firstReading = false;
}
}
// Display current temperature
displayNumber(firstReading ? 0.0f : temperature);
}
void clearDisplay() {
for (int digit = 0; digit < 3; digit++) {
digitalWrite(digitPins[digit], OFFD); // Turn off all digits
}
for (int segment = 0; segment < 8; segment++) {
digitalWrite(segmentPins[segment], OFFS); // Turn off all segments
}
}
void displayNumber(float temp) {
// Clear old digits before updating
clearDisplay();
int number = round(temp * 10); // Convert temp to 1 decimal place (e.g., 24.7 → 247)
int digitsArray[3] = { (number / 100) % 10, (number / 10) % 10, number % 10 };
if (0) {
Serial.print(" "); Serial.println(digitsArray[0]);
Serial.print(" "); Serial.println(digitsArray[1]);
Serial.print(" "); Serial.println(digitsArray[2]);
} // plausible
for (int digit = 0; digit < 3; digit++) {
/* if (digit == 0 && temp < 10) {
displayDigit(-1); // Blank leading digit for temps under 10°C
} else {
displayDigit(digitsArray[digit]);
}
*/
//... just
displayDigit(digitsArray[digit]);
digitalWrite(segmentPins[7], (digit == 1) ? ONS : OFFS); // Decimal point on middle digit
//... don't until all segments are ready to go
digitalWrite(digitPins[digit], OND);
//...
if (1) // just stop it when it should be shwoing one 7:
if (digitsArray[digit] == 7) {
Serial.println("s e v e n");
for (; ; );
}
delay(5);
digitalWrite(digitPins[digit], OFFD);
}
}
void displayDigit(int number) {
//...
if (number == -1) return;
// Clear previous segments
if (0) //... no need: the logic writes every segment
for (int segment = 0; segment < 7; segment++) {
digitalWrite(segmentPins[segment], HIGH);
}
//... turn on/off digit segments
for (int segment = 0; segment < 7; segment++) {
digitalWrite(segmentPins[segment], (digits[number] & (1 << (6 - segment))) ? ONS : OFFS);
}
}
//... distractions
void displayAnimationFrame(byte pattern) {
}
void displayPattern(byte pattern) {
}