Skip to content
Snippets Groups Projects
Commit 7ed70d7e authored by Sebastian Pape's avatar Sebastian Pape
Browse files

Code for Calibratio 1.1

parent 32743b7d
No related branches found
No related tags found
No related merge requests found
#include <ESP32Servo.h>
#include "MotionToPhotonServer.h" #include "MotionToPhotonServer.h"
#include "esp_task_wdt.h" #include "esp_task_wdt.h"
/* Enums */
enum Status {Ready = 0, Measuring = 1};
String Status_Text[2] = {"Ready", "Measuring"};
enum InternalStatus {DefaultReady, Moved};
/* Forward Declarations */ /* Forward Declarations */
void startMeasureing(unsigned int numberOfSamples); void startMeasurements(unsigned int numberOfSamples);
unsigned int getPhotoDiodeReading(); unsigned int getPhotoDiodeReading();
void setThresholdValue(unsigned int newThreshold); void setThresholdValue(unsigned int newThreshold);
unsigned int getDeflectionValue();
void setDeflectionValue(unsigned int newDeflection);
unsigned int getThresholdValue(); unsigned int getThresholdValue();
String getStatus(); String getStatus();
unsigned int getCurrentNumberOfResults(); unsigned int getCurrentNumberOfResults();
void zeroServo(); void setLEDExternal(bool LedMoved);
void setLED(InternalStatus Status);
void abortMeasurement(); void abortMeasurement();
/* Enums */
enum Status {Ready = 0, Measuring = 1};
String Status_Text[2] = {"Ready", "Measuring"};
enum InternalStatus {Zeroed, NotZeroed, Stopping};
/* Hardware */ /* Hardware */
Servo rotation_servo; #define PhotoPin 32
#define PhotoPin 33 #define Marker1Pin 16
#define ServoPin 12 #define Marker2Pin 17
#define SensePin 4
#define ButtonPin 23
/* Global Values */ /* Global Values */
int zeroValueForServo = 0;
unsigned int deflection = 10;
long startTime = -1; long startTime = -1;
int triggerValue = 2500; int triggerValue = 2500;
#define Timeout 10000000L #define Timeout 10000000L
unsigned int requested_measurements = -1; unsigned int requested_measurements = -1;
Status current_status = Status::Ready; Status current_status = Status::Ready;
InternalStatus current_internal_status = InternalStatus::NotZeroed; InternalStatus current_internal_status = InternalStatus::DefaultReady;
/* Result Storage */ /* Result Storage */
#define result_buffer_length 10000 #define result_buffer_length 10000
...@@ -42,7 +36,7 @@ unsigned long result_buffer[result_buffer_length]; ...@@ -42,7 +36,7 @@ unsigned long result_buffer[result_buffer_length];
unsigned int result_number = 0; unsigned int result_number = 0;
/* Server */ /* Server */
MotionToPhotonServer server(result_buffer, result_buffer_length, getPhotoDiodeReading, getThresholdValue, setThresholdValue, getDeflectionValue, setDeflectionValue, getStatus, startMeasureing, getCurrentNumberOfResults, abortMeasurement); MotionToPhotonServer server(result_buffer, result_buffer_length, getPhotoDiodeReading, getThresholdValue, setThresholdValue, getStatus, startMeasurements, getCurrentNumberOfResults, abortMeasurement, setLEDExternal);
/* Multicore */ /* Multicore */
TaskHandle_t TaskCore0; TaskHandle_t TaskCore0;
...@@ -50,34 +44,32 @@ TaskHandle_t TaskCore1; ...@@ -50,34 +44,32 @@ TaskHandle_t TaskCore1;
void core1( void * pvParameters ){ void core1( void * pvParameters ){
while(true){ while(true){
if(current_status != Status::Measuring){ //just small delay while not measuring to not spend to much power in idle
delay(5); //just small delay if(current_status == Status::Ready){
delay(5);
continue; continue;
} }
if(current_internal_status == InternalStatus::NotZeroed // Starting next measurement
&& result_number < requested_measurements){ if(current_internal_status == InternalStatus::DefaultReady && result_number < requested_measurements){
zeroServo(); //Rearm //Wait for screen to become black again and prevent false resets
for(int i = 0; i < 10; i++){
do{ do{
delay(2000 + random(1,11)); // Two seconds + random delay delay(100 + random(1,20));
}while(getPhotoDiodeReading() < triggerValue); //Prevent false resets }while(getPhotoDiodeReading() < triggerValue);
rotation_servo.write(zeroValueForServo - deflection); //deflection movement
} }
if((current_internal_status == InternalStatus::Zeroed || current_internal_status == InternalStatus::Stopping) //Switch marker location and start clock
&& digitalRead(SensePin)){ setLED(InternalStatus::Moved);
current_internal_status = InternalStatus::Stopping;
startTime = micros(); startTime = micros();
} }
if(current_internal_status == InternalStatus::Stopping //Stop/Record measurement value
&& getPhotoDiodeReading() < triggerValue){ if(current_internal_status == InternalStatus::Moved && getPhotoDiodeReading() < triggerValue){
result_buffer[result_number] = micros() - startTime; result_buffer[result_number] = micros() - startTime;
Serial.println("Time: " + String(result_buffer[result_number])); Serial.println("Time: " + String(result_buffer[result_number]));
result_number++; result_number++;
current_internal_status = InternalStatus::NotZeroed; setLED(InternalStatus::DefaultReady); //Reset to ready
//Finished Measurements //Finished Measurements
if(result_number >= requested_measurements){ if(result_number >= requested_measurements){
...@@ -86,9 +78,9 @@ void core1( void * pvParameters ){ ...@@ -86,9 +78,9 @@ void core1( void * pvParameters ){
} }
} }
// Timeout // Timeout, Reset without Measurement
if(current_internal_status == InternalStatus::Stopping && (micros() - startTime) > Timeout){ if(current_internal_status == InternalStatus::Moved && (micros() - startTime) > Timeout){
current_internal_status = InternalStatus::NotZeroed; setLED(InternalStatus::DefaultReady);
} }
} }
} }
...@@ -102,13 +94,11 @@ void core0( void * pvParameters ){ ...@@ -102,13 +94,11 @@ void core0( void * pvParameters ){
void setup() { void setup() {
Serial.begin(115200); Serial.begin(115200);
rotation_servo.setPeriodHertz(50); // standard 50 hz servo
rotation_servo.attach(ServoPin, 540, 2470);
rotation_servo.write(0);
pinMode(PhotoPin, INPUT); pinMode(PhotoPin, INPUT);
pinMode(SensePin, INPUT_PULLDOWN); pinMode(Marker1Pin, OUTPUT);
pinMode(Marker2Pin, OUTPUT);
setLED(InternalStatus::DefaultReady);
randomSeed(analogRead(PhotoPin) + analogRead(0)); //Initalize Random seed randomSeed(analogRead(PhotoPin) + analogRead(0)); //Initalize Random seed
...@@ -139,11 +129,14 @@ void setup() { ...@@ -139,11 +129,14 @@ void setup() {
void loop(){} //Still needed for arduino core to work void loop(){} //Still needed for arduino core to work
void startMeasureing(unsigned int numberOfSamples){ void startMeasurements(unsigned int numberOfSamples){
if(numberOfSamples > result_buffer_length) return; if(numberOfSamples > result_buffer_length) return;
memset(result_buffer, 0l, result_buffer_length * sizeof(long)); //clear buffer memset(result_buffer, 0l, result_buffer_length * sizeof(long)); //clear buffer
result_number = 0; result_number = 0;
requested_measurements = numberOfSamples; requested_measurements = numberOfSamples;
setLED(InternalStatus::DefaultReady);
current_status = Status::Measuring; current_status = Status::Measuring;
} }
...@@ -154,24 +147,32 @@ unsigned int getPhotoDiodeReading(){ ...@@ -154,24 +147,32 @@ unsigned int getPhotoDiodeReading(){
void abortMeasurement(){ void abortMeasurement(){
current_status = Status::Ready; current_status = Status::Ready;
requested_measurements = -1; requested_measurements = -1;
rotation_servo.write(0);
current_internal_status = InternalStatus::NotZeroed; setLED(InternalStatus::DefaultReady);
} }
void setThresholdValue(unsigned int newThreshold){ void setThresholdValue(unsigned int newThreshold){
triggerValue = newThreshold; triggerValue = newThreshold;
} }
unsigned int getThresholdValue(){ void setLED(InternalStatus Status){
return triggerValue; if(Status == InternalStatus::DefaultReady){
digitalWrite(Marker1Pin, HIGH);
digitalWrite(Marker2Pin, LOW);
} else {
digitalWrite(Marker1Pin, LOW);
digitalWrite(Marker2Pin, HIGH);
}
current_internal_status = Status;
} }
unsigned int getDeflectionValue(){ void setLEDExternal(bool LedMoved){
return deflection; if(current_status == Status::Measuring) return; //Do not set while measuring
setLED(LedMoved ? InternalStatus::Moved : InternalStatus::DefaultReady);
} }
void setDeflectionValue(unsigned int newDeflection){ unsigned int getThresholdValue(){
deflection = newDeflection; return triggerValue;
} }
String getStatus(){ String getStatus(){
...@@ -181,19 +182,3 @@ String getStatus(){ ...@@ -181,19 +182,3 @@ String getStatus(){
unsigned int getCurrentNumberOfResults(){ unsigned int getCurrentNumberOfResults(){
return max(result_number, 0u); return max(result_number, 0u);
} }
void zeroServo(){
//start a little lower than last time
zeroValueForServo -= 5;
rotation_servo.write(zeroValueForServo);
delay(50);
do{
zeroValueForServo++;
rotation_servo.write(zeroValueForServo);
delay(100);
} while (!digitalRead(SensePin));
Serial.println("Servo zeroed at: " + String(zeroValueForServo));
current_internal_status = InternalStatus::Zeroed;
}
...@@ -2,16 +2,26 @@ ...@@ -2,16 +2,26 @@
/* Server Setup */ /* Server Setup */
MotionToPhotonServer::MotionToPhotonServer(unsigned long* result_buffer_, unsigned int result_buffer_length_, unsigned int (* getPhotodiodeReadingFunction)(), unsigned int (* getThresholdFunction)(), void (* setThresholdFunction)(unsigned int), unsigned int (* getDeflectionFunction)(), void (* setDeflectionFunction)(unsigned int), String (* getStatusFunction)(), void (* startMeasureFunction)(unsigned int), unsigned int (* getCurrentNumberOfResultsFunction)(), void (* abortMeasurementFunction)()) { MotionToPhotonServer::MotionToPhotonServer(
unsigned long* result_buffer_,
unsigned int result_buffer_length_,
unsigned int (* getPhotodiodeReadingFunction)(),
unsigned int (* getThresholdFunction)(),
void (* setThresholdFunction)(unsigned int),
String (* getStatusFunction)(),
void (* startMeasureFunction)(unsigned int),
unsigned int (* getCurrentNumberOfResultsFunction)(),
void (* abortMeasurementFunction)(),
void (* setLedMovedFunction)(bool)
) {
getPhotodiodeReading = getPhotodiodeReadingFunction; getPhotodiodeReading = getPhotodiodeReadingFunction;
getThreshold = getThresholdFunction; getThreshold = getThresholdFunction;
setThreshold = setThresholdFunction; setThreshold = setThresholdFunction;
getDeflection = getDeflectionFunction;
setDeflection = setDeflectionFunction;
getStatus = getStatusFunction; getStatus = getStatusFunction;
startMeasure = startMeasureFunction; startMeasure = startMeasureFunction;
abortMeasurement = abortMeasurementFunction; abortMeasurement = abortMeasurementFunction;
getCurrentNumberOfResults = getCurrentNumberOfResultsFunction; getCurrentNumberOfResults = getCurrentNumberOfResultsFunction;
setLedMoved = setLedMovedFunction;
result_buffer = result_buffer_; result_buffer = result_buffer_;
result_buffer_length = result_buffer_length_; result_buffer_length = result_buffer_length_;
} }
...@@ -34,8 +44,8 @@ ...@@ -34,8 +44,8 @@
server.on("/sensor", [this](){this->pageSensor();}); server.on("/sensor", [this](){this->pageSensor();});
server.on("/setThreshold", [this](){this->pageSetThreshold();}); server.on("/setThreshold", [this](){this->pageSetThreshold();});
server.on("/getThreshold", [this](){this->pageGetThreshold();}); server.on("/getThreshold", [this](){this->pageGetThreshold();});
server.on("/setDeflection", [this](){this->pageSetDeflection();}); server.on("/setLedDefault", [this](){this->pageSetLedDefault();});
server.on("/getDeflection", [this](){this->pageGetDeflection();}); server.on("/setLedMoved", [this](){this->pageSetLedMoved();});
server.on("/abort", [this](){this->pageAbort();}); server.on("/abort", [this](){this->pageAbort();});
server.onNotFound([this](){this->pageNotFound();}); server.onNotFound([this](){this->pageNotFound();});
...@@ -73,19 +83,14 @@ ...@@ -73,19 +83,14 @@
server.send(200, "text/plain", String(getThreshold())); server.send(200, "text/plain", String(getThreshold()));
} }
void MotionToPhotonServer::pageSetDeflection(){ void MotionToPhotonServer::pageSetLedDefault(){
if(server.args() <= 0){ setLedMoved(false);
server.send(400, "text/plain", "No parameters given. Give d=<deflection>");
return;
}
unsigned int deflection = String(server.arg(0)).toInt();
setDeflection(deflection);
server.send(200, "text/plain", "Ok."); server.send(200, "text/plain", "Ok.");
} }
void MotionToPhotonServer::pageGetDeflection(){ void MotionToPhotonServer::pageSetLedMoved(){
server.send(200, "text/plain", String(getDeflection())); setLedMoved(true);
server.send(200, "text/plain", "Ok.");
} }
void MotionToPhotonServer::pageSensor(){ void MotionToPhotonServer::pageSensor(){
......
...@@ -10,11 +10,10 @@ class MotionToPhotonServer ...@@ -10,11 +10,10 @@ class MotionToPhotonServer
private: private:
unsigned int (* getPhotodiodeReading)(); unsigned int (* getPhotodiodeReading)();
unsigned int (* getThreshold)(); unsigned int (* getThreshold)();
unsigned int (* getDeflection)();
unsigned int (* getCurrentNumberOfResults)(); unsigned int (* getCurrentNumberOfResults)();
String (* getStatus)(); String (* getStatus)();
void (* setThreshold)(unsigned int); void (* setThreshold)(unsigned int);
void (* setDeflection)(unsigned int); void (* setLedMoved)(bool);
void (* startMeasure)(unsigned int); void (* startMeasure)(unsigned int);
void (* abortMeasurement)(); void (* abortMeasurement)();
...@@ -41,8 +40,8 @@ class MotionToPhotonServer ...@@ -41,8 +40,8 @@ class MotionToPhotonServer
void pageStatus(); void pageStatus();
void pageSetThreshold(); void pageSetThreshold();
void pageGetThreshold(); void pageGetThreshold();
void pageSetDeflection(); void pageSetLedDefault();
void pageGetDeflection(); void pageSetLedMoved();
void pageMeasure(); void pageMeasure();
void pageResults(); void pageResults();
void pageIndex(); void pageIndex();
...@@ -54,7 +53,15 @@ class MotionToPhotonServer ...@@ -54,7 +53,15 @@ class MotionToPhotonServer
public: public:
/* Server functions */ /* Server functions */
MotionToPhotonServer(unsigned long* result_buffer_, unsigned int result_buffer_length_, unsigned int (* getPhotodiodeReadingFunction)(), unsigned int (* getThresholdFunction)(), void (* setThresholdFunction)(unsigned int), unsigned int (* getDeflectionFunction)(), void (* setDeflectionFunction)(unsigned int), String (* getStatusFunction)(), void (* startMeasureFunction)(unsigned int), unsigned int (* getCurrentNumberOfResultsFunction)(), void (* abortMeasurementFunction)()); MotionToPhotonServer(unsigned long* result_buffer_, unsigned int result_buffer_length_,
unsigned int (* getPhotodiodeReadingFunction)(),
unsigned int (* getThresholdFunction)(),
void (* setThresholdFunction)(unsigned int),
String (* getStatusFunction)(),
void (* startMeasureFunction)(unsigned int),
unsigned int (* getCurrentNumberOfResultsFunction)(),
void (* abortMeasurementFunction)(),
void (* setLedMoved)(bool));
void setup(); void setup();
void serve(); void serve();
......
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
<html> <html>
<head> <head>
<meta charset="ISO-8859-1"> <meta charset="ISO-8859-1">
<title>Calibratio V1.1</title>
<!-- Hello you there, reading the code! This was coded by Sebastian Pape aka PapeCoding.de -->
<style> <style>
* { * {
font-family: Arial, Helvetica, sans-serif; font-family: Arial, Helvetica, sans-serif;
...@@ -65,6 +67,14 @@ ...@@ -65,6 +67,14 @@
document.getElementById("lightSensor").textContent = makeRequest("sensor"); document.getElementById("lightSensor").textContent = makeRequest("sensor");
} }
function setLEDDefault(){
makeRequest("setLedDefault");
}
function setLEDMoved(){
makeRequest("setLedMoved");
}
function setThreshold(){ function setThreshold(){
if(document.getElementById("sensorThreshold").checkValidity()){ if(document.getElementById("sensorThreshold").checkValidity()){
makeRequest('setThreshold?t=' + document.getElementById("sensorThreshold").value); makeRequest('setThreshold?t=' + document.getElementById("sensorThreshold").value);
...@@ -75,16 +85,6 @@ ...@@ -75,16 +85,6 @@
document.getElementById("sensorThreshold").value = makeRequest('getThreshold'); document.getElementById("sensorThreshold").value = makeRequest('getThreshold');
} }
function setDeflection(){
if(document.getElementById("servoDeflection").checkValidity()){
makeRequest('setDeflection?d=' + document.getElementById("servoDeflection").value);
}
}
function getDeflection(){
document.getElementById("servoDeflection").value = makeRequest('getDeflection');
}
/* Statistics */ /* Statistics */
function sum(array) { function sum(array) {
var num = 0; var num = 0;
...@@ -132,7 +132,6 @@ ...@@ -132,7 +132,6 @@
document.addEventListener('DOMContentLoaded', (event) => { document.addEventListener('DOMContentLoaded', (event) => {
getThreshold(); getThreshold();
getDeflection();
getStatus(); getStatus();
getSensor(); getSensor();
}); });
...@@ -140,8 +139,8 @@ ...@@ -140,8 +139,8 @@
</head> </head>
<body style="display: flex; flex-direction: row; align-items: center; flex-wrap: wrap; justify-content: center;"> <body style="display: flex; flex-direction: row; align-items: center; flex-wrap: wrap; justify-content: center;">
<div class="box niceBorder" style="flex: 0 1 75%; text-align: center; padding: 20px;"> <div class="box niceBorder" style="flex: 0 1 75%; text-align: center; padding: 20px;">
<div style="font-size: 3em">Calibratio</div><br /> <div style="font-size: 3em">Calibratio V1.1</div><br />
This device measures the movement to photon latency! This device measures the movement to photon latency. No moving parts this time!
</div> </div>
<div style="display: flex; flex-direction: column; align-items: stretch; flex-wrap: wrap; justify-content: center;"> <div style="display: flex; flex-direction: column; align-items: stretch; flex-wrap: wrap; justify-content: center;">
<div id="statistics" class="box niceBorder" style="width: 500px; height: 80px;"></div> <div id="statistics" class="box niceBorder" style="width: 500px; height: 80px;"></div>
...@@ -164,9 +163,9 @@ ...@@ -164,9 +163,9 @@
<div class="button" onclick="setThreshold()">Set!</div> <div class="button" onclick="setThreshold()">Set!</div>
</div> </div>
<div class="box niceBorder"> <div class="box niceBorder">
<div style="padding: 5px;">Servo Deflection:</div> <div style="padding: 5px;">Manual LED Setting:</div>
<input type="number" id="servoDeflection" min="1" max="360"> <div class="button" style="display:inline-block" onclick="setLEDDefault()">Default</div>
<div class="button" onclick="setDeflection()">Set!</div> <div class="button" style="display:inline-block" onclick="setLEDMoved()">Moved</div>
</div> </div>
<div class="box niceBorder"> <div class="box niceBorder">
<div style="padding: 5px;">Times to Meassure:</div> <div style="padding: 5px;">Times to Meassure:</div>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment