Skip to content

Commit

Permalink
included visual feedback with led
Browse files Browse the repository at this point in the history
  • Loading branch information
kreier committed Dec 12, 2023
1 parent 93814a0 commit cf8d6b4
Show file tree
Hide file tree
Showing 5 changed files with 590 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ void elapsed_time(int seconds) {
}

void setup() {
Serial.begin(115200);
Serial.begin(74880);
pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
Expand Down Expand Up @@ -63,9 +64,16 @@ void loop() {
Serial.print(".");
dot = millis();
column += 1;
if(column % 2 == 0) {
digitalWrite(LED_BUILTIN, HIGH);
}
else
{
digitalWrite(LED_BUILTIN, LOW);
}
if(column > 40) {
column = 0;
elapsed_time(dot/1000);
elapsed_time((micros() - start)/1000000);
Serial.print("- ");
Serial.print(number);
Serial.print(" ");
Expand Down
106 changes: 106 additions & 0 deletions arduino/v2.0.2022/prime_logging_millis/prime_logging_millis.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
/* Prime numbers in Arduino C v2.0 2023/12/12 */
#include <time.h>
#include <math.h>

double start;
int column = 10;

void elapsed_time(int seconds) {
int hours = (int)seconds/3600;
int minutes = (int)(seconds/60 - hours*60);
int sec = (int)(seconds - minutes*60 - hours*3600);
Serial.print(" ");
Serial.print(hours);
Serial.print("h ");
Serial.print(minutes);
Serial.print("min ");
Serial.print(sec);
Serial.print("s ");
}

void setup() {
Serial.begin(74880);
pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
for (int i = 0; i < 3; i++) {
Serial.print(".");
delay(1000);
}
const int scope[] = {100, 1000, 10000, 100000, 1000000, 10000000, 25000000, 100000000, 1000000000};
const int reference[] = {25, 168, 1229, 9592, 78498, 664579, 1565927, 5761455, 50847534};
for (int i = 0; i < 9; i++) {
int last = scope[i];
int found = 4; // we already know 2, 3, 5, 7
Serial.println("\n\nPrime v2.0 in Arduino C 2023/12/05");
Serial.print("Calculating prime numbers until ");
Serial.println(last);
start = millis(); // use micros() for more precision
int dot = millis();
int column = 0;
for (int number = 11; number < last; number += 2) {
bool prime = true;
for (int divider = 3; divider < (int)(sqrt(number)) + 1; divider += 2) {
if (number % divider == 0) {
prime = false;
break;
}
}
if (prime) {
found += 1;
// if(found % 500 == 0) {
// Serial.print(number);
// Serial.print(" ");
// }
// if(found % 10000 == 0) {
// Serial.print(" - ");
// elapsed_time(dot/1000);
// Serial.print("- ");
// Serial.println(number);
// }
}
if((millis() - dot) > 1000) {
Serial.print(".");
dot = millis();
column += 1;
if(column % 2 == 0) {
digitalWrite(LED_BUILTIN, HIGH);
}
else
{
digitalWrite(LED_BUILTIN, LOW);
}
if(column > 40) {
column = 0;
elapsed_time((millis() - start)/1000);
Serial.print("- ");
Serial.print(number);
Serial.print(" ");
Serial.print(int(number * 100 / last));
Serial.print("% \n");
}
}
}
float duration = (millis() - start)/1000;
if(duration > 1) {
Serial.print("\n");
}
Serial.print("Found ");
Serial.print(found);
Serial.print(" prime numbers. It should be ");
Serial.print(reference[i]);
Serial.print(".\nThis took ");
Serial.print(duration, 3);
Serial.print(" seconds.");
elapsed_time(duration);
}
// program finished, just keep printing some dots
for(int line = 0; line < 24; line++){
for(int i = 0; i < 80; i++) {
Serial.print(".");
delay(2000);
}
Serial.print(".\n");
}
}
158 changes: 158 additions & 0 deletions arduino/v5.0.2023/prime_logging3/prime_logging3.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
/* Prime numbers in Arduino C v5.1 2023/12/12 */
#include <time.h>
#include <math.h>

double start;
int column = 10;
int found = 4; // we already know 2, 3, 5, 7
int divisors = found;
int primes[10000] = {3, 5, 7};

int is_prime(int number) {
int prime = 1;
for (int divider = 3; divider < (int)(sqrt(number)) + 1; divider += 2)
{
if (number % divider == 0)
{
prime = 0;
break;
}
}
return prime;
}

int find_primes(int limit) {
for(int number=11; number < limit + 1; number += 2) {
if( is_prime(number) == 1) {
primes[found - 1] = number;
found++;
}
}
primes[found - 1] = limit;
divisors = found - 1;
return 1;
}

int is_prime_fast(int number) {
int largest_divider = (int)(sqrt(number));
int flag_prime = 1;
// Serial.print(number);
// Serial.print(" - ");
for(int i=0; i < divisors; i++)
{
// Serial.print(primes[i]);
// Serial.print(" ");
if(number % primes[i] == 0)
{
flag_prime = 0;
break;
}
if(primes[i] > largest_divider)
{
break;
}
}
// Serial.print("\n");
return flag_prime;
}

void elapsed_time(int seconds) {
int hours = (int)seconds/3600;
int minutes = (int)(seconds/60 - hours*60);
int sec = (int)(seconds - minutes*60 - hours*3600);
Serial.print(" ");
Serial.print(hours);
Serial.print("h ");
Serial.print(minutes);
Serial.print("min ");
Serial.print(sec);
Serial.print("s ");
}

void setup() {
Serial.begin(74880);
pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
for (int i = 0; i < 3; i++) {
Serial.print(".");
delay(1000);
}
const int scope[] = {100, 1000, 10000, 100000, 1000000, 10000000, 25000000, 100000000, 1000000000};
const int reference[] = {25, 168, 1229, 9592, 78498, 664579, 1565927, 5761455, 50847534};
for (int i = 0; i < 9; i++) // 9
{
int last = scope[i];
found = 4; // we already know 2, 3, 5, 7
Serial.println("\n\nPrime v5.0 in Arduino C 2023/12/12");
Serial.print("Calculating prime numbers until ");
Serial.println(last);
start = micros(); // use micros() for more precision
// Serial.println(start/1000000, 6);
int largest_divider = (int)(sqrt(last));
if(largest_divider % 2 == 0)
{
largest_divider += 1;
}
find_primes(largest_divider);
Serial.print("Found ");
Serial.print(found);
Serial.print(" primes until ");
Serial.print(largest_divider);
Serial.print(" to use as divisors.\n");
int dot = millis();
int column = 0;
for(int number = largest_divider + 2; number < last; number += 2)
{
found += is_prime_fast(number);
if((millis() - dot) > 1000) {
Serial.print(".");
dot = millis();
column += 1;
if(column % 2 == 0) {
digitalWrite(LED_BUILTIN, HIGH);
}
else
{
digitalWrite(LED_BUILTIN, LOW);
}
if(column > 40) {
column = 0;
elapsed_time(dot/1000);
Serial.print(" - ");
Serial.print(number);
Serial.print(" ");
Serial.print((int)(number / (last / 100)));
Serial.print("% \n");
}
}
}
float duration = (micros() - start)/1000000;
if(duration > 2) {
Serial.print("\n");
}
Serial.print("Found ");
Serial.print(found);
Serial.print(" prime numbers. It should be ");
Serial.print(reference[i]);
Serial.print(".\nThis took ");
Serial.print(duration, 6);
Serial.print(" seconds.");
elapsed_time(duration);
}
// program finished, just keep printing some dots
for(int line = 0; line < 24; line++){
for(int i = 0; i < 80; i++) {
for(int x = 0; x < 10; x++) {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(50); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(50);
}
Serial.print(".");
delay(1000);
}
Serial.print(".\n");
}
}
Loading

0 comments on commit cf8d6b4

Please sign in to comment.