93 lines
1.8 KiB
C++
93 lines
1.8 KiB
C++
#include "EEPROM.h"
|
|
|
|
// Interni LED - sekunde
|
|
#define iLED 13
|
|
|
|
// Zunanji LED - prastevila
|
|
#define eLED 5
|
|
|
|
// Splosni stevec
|
|
uint16_t stevec = 0;
|
|
|
|
// Polje za ze-izracunana prastevila
|
|
uint16_t prastevila[512];
|
|
uint16_t st_prastevil = 0;
|
|
// Naslednje prastevilo; 1 ni prastevilo, ampak funkcija za "naslednje" zacne z 2
|
|
uint16_t naslednje_prastevilo = 1;
|
|
|
|
bool je_prastevilo(uint16_t st) {
|
|
uint16_t polovica = st / 2;
|
|
|
|
for (uint16_t i = 0; i < st_prastevil; i += 1) {
|
|
if (prastevila[i] > polovica) {
|
|
return true;
|
|
}
|
|
if ((st % prastevila[i]) == 0) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Samo pr prvem - 2
|
|
return true;
|
|
}
|
|
|
|
uint16_t get_naslednje_prastevilo() {
|
|
uint16_t naslednje = naslednje_prastevilo + 1;
|
|
while (!je_prastevilo(naslednje)) {
|
|
naslednje += 1;
|
|
}
|
|
|
|
prastevila[st_prastevil] = naslednje;
|
|
naslednje_prastevilo = naslednje;
|
|
st_prastevil += 1;
|
|
|
|
Serial.println(naslednje);
|
|
|
|
return naslednje;
|
|
}
|
|
|
|
void zapisi_stevilo(int16_t st) {
|
|
EEPROM.write(0, st >> 8);
|
|
EEPROM.write(1, st & 0xFF);
|
|
}
|
|
|
|
uint16_t beri_stevilo() {
|
|
return (EEPROM.read(0) << 8) + EEPROM.read(1);
|
|
}
|
|
|
|
void setup() {
|
|
pinMode(iLED, INPUT_PULLUP);
|
|
pinMode(eLED, OUTPUT);
|
|
|
|
Serial.begin(9600);
|
|
|
|
uint16_t naslednje = 0;
|
|
uint16_t shranjeno = beri_stevilo();
|
|
if (shranjeno > 0) {
|
|
while (naslednje_prastevilo < shranjeno - 1) {
|
|
get_naslednje_prastevilo();
|
|
}
|
|
} else {
|
|
get_naslednje_prastevilo();
|
|
}
|
|
}
|
|
|
|
void loop() {
|
|
stevec += 1;
|
|
digitalWrite(iLED, HIGH);
|
|
|
|
// Je prastevilo?
|
|
if (stevec == naslednje_prastevilo) {
|
|
digitalWrite(eLED, HIGH);
|
|
stevec = 0;
|
|
naslednje_prastevilo = get_naslednje_prastevilo();
|
|
zapisi_stevilo(naslednje_prastevilo);
|
|
}
|
|
delay(500);
|
|
|
|
digitalWrite(iLED, LOW);
|
|
delay(500);
|
|
|
|
digitalWrite(eLED, LOW);
|
|
}
|