Hallo,
ich habe für meinen Nano ein Script geschrieben, welches mir Primzahlen berechnet und diese auf einem OLED-Display ausgibt. In der dritten Zeile wird außerdem die vergangene Zeit der Berechnung angezeigt. Ich verwende millis() als Ausgangszahl und rechne diese in 1/10-Sekunden, Sekunden, Minuten, ... um. Wie auf dem Bild zu sehen gibt es jedoch nach ca. 13 1/4h das Problem, dass die 1/10-Sekunden nicht mehr umgerechnet werden und es zeigt dann einen sehr große Zahl dafür an. Kann mir jemand sagen, woran das liegen könnte? Danke im voraus, 3Domse3.
Code:
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
long start = 0;
long i = 2;
int s = 0;
int m = 0;
int h = 0;
int d = 0;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
start = millis();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}
long found = 0;
void loop() {
long prime = is_prime(i);
long y = (millis() - start) / 100;
digitalWrite(LED_BUILTIN, LOW);
if (y == 10) {
s++;
y = 0;
start = millis();
}
if (s == 60) {
digitalWrite(LED_BUILTIN, HIGH);
m++;
s = 0;
}
if (m == 60) {
h++;
m = 0;
}
if (h == 24) {
d++;
h = 0;
}
if (prime == 1) {
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(1,0);
display.println("N: ");
display.setCursor(17,0);
display.println(found);
display.setCursor(1,11);
display.println("P: ");
display.setCursor(17,11);
display.println(i);
display.setCursor(1,22);
display.println("T: ");
display.setCursor(17,22);
display.println(d);
display.setCursor(49,22);
display.println(h);
display.setCursor(61,22);
display.println(":");
display.setCursor(66,22);
display.println(m);
display.setCursor(78,22);
display.println(":");
display.setCursor(83,22);
display.println(s);
display.setCursor(100,22);
display.println(".");
display.setCursor(105,22);
display.println(y);
display.display();
found++;
}
i++;
}
long is_prime(long num) {
long upper = sqrt(num);
for (long cnum = 2; cnum <= upper; cnum++) {
long mod = num % cnum;
if (mod == 0) {
return 0;
}
}
return 1;
}