/*
Forum: https://forum.arduino.cc/t/i-do-not-read-analog-input-with-millis-function/1310084
Wokwi: https://wokwi.com/projects/411465414534821889
*/
/***********************************
Random numbers from 1 to 3
V 4.0 25 September 2024
v 5.0 26 September
v 6.0 1 October
v 7.0 4 Octobere
v 8.0 10 October
***********************************/
#define WOKWI
#include <Adafruit_GFX.h>
#include <SPI.h>
#include <Wire.h>
#ifdef WOKWI
#define TFT_CS 10
#define TFT_DC 8
#include "Adafruit_ILI9341.h"
Adafruit_ILI9341 display = Adafruit_ILI9341(TFT_CS, TFT_DC);
#else
#include <Adafruit_SSD1331.h>
#define sclk 13
#define mosi 11
#define cs 10
#define rst 9
#define dc 8
Adafruit_SSD1331 display = Adafruit_SSD1331(cs, dc, rst);
#endif
// +++++++++++++ color definition +++++++++
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
// +++++++++++++ functions +++++++++++++++++
void memorizzaDato();
void allarme();
void azzera();
void leggeDato();
void fine();
// +++++++++++++ global variables ++++++++
unsigned long startMillis;
unsigned long currentMillis;
const unsigned long period = 10000;
bool counting;
int count;
int indirizzo = 0;
byte byteUno = 0;
byte byteDue = 0;
int dato;
//int sogliaINF = 0;
//int sogliaSUP = 0;
unsigned long seed;
const byte analogPin = A3;
int valore = 0;
bool uscito1 = false;
bool uscito2 = false;
bool uscito3 = false;
int dimTesto = 7;
int giocate = 0; // variable for repeat outputs
void setup() {
Wire.begin();
display.begin();
display.fillScreen(GREEN);
display.setCursor(20, 20); //column, row
display.setTextColor(WHITE);
display.setTextSize(2);
display.print("ver.7");
display.setCursor(25, 50); //colonna, riga
display.setTextSize(1);
display.print("10 ott 24");
delay(3000);
Serial.begin(9600);
counting = true; //enable counting
startMillis = millis();
count = 0;
unsigned long seed = analogRead(A0);
for (int i = 1; i <= 3; ++i) {
delay(50);
seed += analogRead(A0) * 1024 * i;
}
randomSeed(seed);
}
void loop() {
//currentMillis = millis();
dato = random(1, 4);
Serial.println(dato);
switch (dato) {
case 1:
if (uscito1 == false) {
display.fillScreen(BLACK);
display.setCursor(30, 5); //column, row
display.setTextColor(CYAN);
display.setTextSize(dimTesto);
display.print("1");
leggeDato();
//memorizzaDato();
}
uscito1 = true;
break;
case 2:
if (uscito2 == false) {
display.fillScreen(BLACK);
display.setCursor(30, 5); //column, row
display.setTextColor(CYAN);
display.setTextSize(dimTesto);
display.print("2");
leggeDato();
//memorizzaDato();
}
uscito2 = true;
break;
case 3:
dato = 3;
if (uscito3 == false) {
display.fillScreen(BLACK);
display.setCursor(30, 0); //column, row
display.setTextColor(CYAN);
display.setTextSize(dimTesto);
display.print("3");
leggeDato();
//memorizzaDato();
}
uscito3 = true;
break;
}
azzera();
fine();
//allarme();
//delay(1000);
}
/********************************************************
Functions
********************************************************/
void leggeDato() {
currentMillis = millis();
if (currentMillis - startMillis <= period) { //true until the end of the period
count++; //increase count
//Serial.print(count);
valore = analogRead(analogPin);
Serial.print(" ");
Serial.println(valore);
delay(100);
}
else //period has ended
if (counting == true) { //enable counting
Serial.print(count);
counting = false; //block count
}
}
void memorizzaDato() {
Wire.beginTransmission(0x50);
Wire.write(highByte(indirizzo));
Wire.write(lowByte(indirizzo));
Wire.write(byte(giocate));
Wire.endTransmission();
indirizzo++;
delay(5);
// saves data in two consecutive bytes in the 24LC256
byteUno = ((analogPin >> 8) & 0xFF);
byteDue = (analogPin & 0xFF);
Wire.beginTransmission(0x50);
Wire.write(highByte(indirizzo));
Wire.write(lowByte(indirizzo));
Wire.write(byte(byteUno));
Wire.endTransmission();
indirizzo++;
delay(5);
Wire.beginTransmission(0x50);
Wire.write(highByte(indirizzo));
Wire.write(lowByte(indirizzo));
Wire.write(byte(byteDue));
Wire.endTransmission();
indirizzo++;
delay(5);
Serial.println(" Stored data");
if (indirizzo >= 32000) {
allarme();
}
}
void azzera() {
if (uscito1 == true && uscito2 == true && uscito3 == true) {
uscito1 = false;
uscito2 = false;
uscito3 = false;
giocate = ++giocate;
display.fillScreen(BLACK);
display.setCursor(40, 25); //column, row
display.setTextColor(YELLOW);
display.setTextSize(5);
//display.print(giocate);
Serial.println("--------");
giocate = giocate++;
Serial.println("--------");
Serial.println(giocate);
Serial.println("--------");
Serial.println(" ");
}
}
void allarme() {
display.fillScreen(RED);
display.setCursor(5, 20); //column, row
display.setTextColor(WHITE);
display.setTextSize(2);
display.print("Memory full");
while (1);
}
void fine() {
delay(1000);
if (giocate > 10) {
display.fillScreen(RED);
display.setCursor(25, 20); //column, row
display.setTextColor(WHITE);
display.setTextSize(2);
display.print("End");
Serial.println(" End");
while (1);
}
}