Hello! I am a beginner trying to make my code work the way I want it to. I am building a circuit on Tinkercad which is an online website for building circuits. What I am trying to do with my circuit is make the LEDs light up when the x-axis value on the accelerometer is 0 and the LEDs should not flash but should stay on. As of now this code here works but I do not know where to make the adjustments or what else to add so that I get it to work on how I want.
The code:
//set ovulation temperature range
const int ovulation_a = 90;
const int ovulation_b = 120;
//set variables
const int x_pin = A0;
const int y_pin = A1;
const int z_pin = A3;
const float sensitivity = 0.8; //given in datasheet
const float Vref = 5.0; //voltage reference
const float Vzerog = 1.8; //voltage at zero G (as given in datasheet)
float x;
float y;
float z;
//circuit setup
void setup()
{
pinMode(A2, INPUT); //sensor
pinMode(2, OUTPUT); //blue LED
pinMode(3, OUTPUT); //green LED
pinMode(4, OUTPUT); //red LED
analogReference(EXTERNAL);
Serial.begin(9600);
}
//circuit behaviour
void loop()
{
//motion sensor
{
x = (analogRead(x_pin) - 512) * 3.3 / (sensitivity * 1023);
Serial.print("x: ");
Serial.println(x);
delay(1000); //take a reading every second (ms)
}
//temperature sensor
{
int sensor = analogRead(A2);
float voltage = (sensor / 1024.0) * 5.0;
float tempC = (voltage - 0.5) * 100;
float tempF = (tempC * 1.8) + 32;
Serial.print("temp: ");
Serial.print(tempF);
delay(1000);
//only show results if resting
if (tempF >= ovulation_a && tempF <= ovulation_b && x > 0)
{ //ovulating
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
Serial.println(" Ovulating");
}
else
{ //not ovulating
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
Serial.println(" Not Ovulating");
}
}
}
The tempF range the LEDs should light up is 90-120. This is fine. As for the accelerometer when x=0 it should indicate that the person is not moving hence if the temperature is within the range 90-120 the LEDs should light up which they are not. I have to move the accelerometer and then the LEDs will light up. Once the accelerometer goes back to x=0 the LEDs do not light up anymore.
The new code after removing 1 delay:
//set ovulation temperature range
const int ovulation_a = 90;
const int ovulation_b = 120;
//set variables
const int x_pin = A0;
const int y_pin = A1;
const int z_pin = A3;
const float sensitivity = 0.8; //given in datasheet
const float Vref = 5.0; //voltage reference
const float Vzerog = 1.8; //voltage at zero G (as given in datasheet)
float x;
float y;
float z;
//circuit setup
void setup()
{
pinMode(A2, INPUT); //sensor
pinMode(2, OUTPUT); //blue LED
pinMode(3, OUTPUT); //green LED
pinMode(4, OUTPUT); //red LED
analogReference(EXTERNAL);
Serial.begin(9600);
}
//circuit behaviour
void loop()
{
//motion sensor
{
x = (analogRead(x_pin) - 512) * 3.3 / (sensitivity * 1023);
Serial.print("x: ");
Serial.println(x);
}
//temperature sensor
{
int sensor = analogRead(A2);
float voltage = (sensor / 1024.0) * 5.0;
float tempC = (voltage - 0.5) * 100;
float tempF = (tempC * 1.8) + 32;
Serial.print("temp: ");
Serial.print(tempF);
delay(1000);
//only show results if resting
if (tempF >= ovulation_a && tempF <= ovulation_b && x > 0)
{ //ovulating
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
Serial.println(" Ovulating");
//wait for 100 miliseconds
}
else
{ //not ovulating
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
Serial.println(" Not Ovulating");
}
}
}
not sure in which case, ovulating or not ovulating, the LEDs light up.
since x presumably represents some acceleration in a particular direction, the ovulating case will only be true while accelerating in one direction (i.e. x > 0)
since x is a float, i doubt its value is every actually 0.0000. it would be better to test that its absolute value is less than some small value (ABS(x) < 0.1) (don't remember if it ABS() or abs())
Thank you! That works now! I have another question. How can I create an array of all the temperatures recorded when the body is in resting state. That would be as we said abs(x)<0.1
I want this so that I can be able to store and calculate the average body temperature when the person is at rest.
The new code:
//set ovulation temperature range
const int ovulation_a = 90;
const int ovulation_b = 120;
//set variables
const int x_pin = A0;
const int y_pin = A1;
const int z_pin = A3;
const float sensitivity = 0.8; //given in datasheet
const float Vref = 5.0; //voltage reference
const float Vzerog = 1.8; //voltage at zero G (as given in datasheet)
float x;
float y;
float z;
//circuit setup
void setup()
{
pinMode(A2, INPUT); //sensor
pinMode(2, OUTPUT); //blue LED
pinMode(3, OUTPUT); //green LED
pinMode(4, OUTPUT); //red LED
analogReference(EXTERNAL);
Serial.begin(9600);
}
//circuit behaviour
void loop()
{
//motion sensor
{
x = (analogRead(x_pin) - 512) * 3.3 / (sensitivity * 1023);
Serial.print("x: ");
Serial.println(x);
}
//temperature sensor
{
int sensor = analogRead(A2);
float voltage = (sensor / 1024.0) * 5.0;
float tempC = (voltage - 0.5) * 100;
float tempF = (tempC * 1.8) + 32;
Serial.print("temp: ");
Serial.print(tempF);
delay(1000);
//only show results if resting
if (tempF >= ovulation_a && tempF <= ovulation_b && abs(x) < 0.1)
{ //ovulating
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
Serial.println(" Ovulating");
//wait for 100 miliseconds
}
else
{ //not ovulating
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
Serial.println(" Not Ovulating");
}
}
}
I tried rearranging and putting the code where I think it should be. However I am not sure if it is keeping track of different temperatures in the array and I do not know ow to check. I guess the next step after getting the array to work would be calculating the average temperature and would need a code like: