pra-utripalka/blink_prastevilo/blink_prastevilo.ino

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);
}