Made by ocr, jvanderv and Kashyap Nishtala

Found in DIoT 2018 2: Ambient Affect

Ambient device that tells you when your period is coming and when you are ovulating in a discreet way.

John Vanderveen -

Conceptual Design

Our design concept was to create a personal device that could be used in the home or workplace to help women track their period in a discrete way. The original design was to be comprised of a ping pong ball with an LED inside and a half sphere that spun around it. Olivia felt that we could make a 3D printed moon, so we decided to paint half of it black and half white. This approach necessitated that we move the LED to the outside, but allowed for a more stable connection of the moon to the servo.

We also realized that with the LED we could make the color change from white to amber, like the real moon. With this functionality, we decided to add a feature and incorporate an alert of the user's ovulation window.



Once we had our concept finalized, we had our work cut out for us. We found CAD for a moon and 3D printed it at 60mm in plastic. We spray painted the moon and started a draft of the code. While we worked on the code and moon, we created a foamcore box and hooked up the LED and Servo motor to our breadboard. The first test was to get the motor working and LED lighting up in the correct color. Once that was sorted, we added in the IFTTT applets and synced with Olivia's google calendar. Once the troubleshooting was done we integrated our parts into the box and finalized all of the pieces.



The final product is an illuminated moon that spins within an attractive box and shows the phases of the moon. The user interacts with the object by receiving the visual output and interpreting the data. The abstract nature of the representation makes it difficult for others to interpret, but obvious for the user. As the user's period approaches the moon moves toward full phase. When the user is ovulating the moon becomes amber instead of white. 

There were some areas that we would like to improve in the future if we were to revisit the project. The layout of the final box was a difficult task and we forgot to account for the off-center axis of the servo and the LED was difficult to package. If we were to do it again we would also add space into the housing to cover the breadboard.

//combined with 5 IFTTT applets, this code takes google calendar events
//describing a woman's period and translates them into ambient light and motion
//codified into phases of a 3D printed moon

//Reference for servo:

//establish LED pins and colors

int redPin = D1;    // RED pin of the LED to PWM pin **A0**
int greenPin = D2;  // GREEN pin of the LED to PWM pin **D0**
int bluePin = D3;   // BLUE pin of the LED to PWM pin **D1**
int redValue = 255; // Full brightness for an ANODE RGB LED is 0, and off 255
int greenValue = 255; // Full brightness for an ANODE RGB LED is 0, and off 255
int blueValue = 255; // Full brightness for an ANODE RGB LED is 0, and off 255</td>
bool ovulation = false; //ovulation variable

int servoPin = A5; //servo pin at A5
int servoPosition = 0;//set initial servo position to 0
int servoTarget = 0;//set target servo position to 0
Servo servo;

void setup()

   //Register our Particle to control the servo
   Particle.function( "pos", setPosition );
   Particle.function( "ovo", ovControl );
   servo.attach( servoPin );
   servo.write( servoPosition );

  // Set up our RGB LED pins for output
  pinMode( redPin, OUTPUT);
  pinMode( greenPin, OUTPUT);
  pinMode( bluePin, OUTPUT);

  //for debugging purposes, talk to the thing
  Serial.begin( 9600 );

// loop() runs over and over again, as quickly as it can execute.
void loop() {
  ovControl(ovulation); //call the ovulation control function
  //servo ease code from Lab class
  if( servoPosition != servoTarget )
      if( servoPosition > servoTarget ){
      servoPosition = constrain( servoPosition, 0, 255 );

      servo.write( servoPosition );
//RGB LED control code from first lab class
void setRGBColor( int r, int g, int b ){
  redValue = r;
  greenValue = g;
  blueValue = b;
  analogWrite(redPin, 255 - redValue);
  analogWrite(greenPin, 255 - greenValue);
  analogWrite(bluePin, 255 - blueValue);
//servo control function from lab
int setPosition( String command ){

  Serial.println( "setSpeed: " + command );

  int value = command.toInt();
  if( value < 0 ) return -1;
  if( value > 180 ) return -1;

  servoTarget = constrain( value, 0, 180 );
  return 1;

//ovulation control function
bool ovControl(bool ovo){
  if (ovo == true){
  return 1;
Click to Expand
Share this Project


49713 Designing for the Internet of Things

· 25 members

A hands-on introductory course exploring the Internet of Things and connected product experiences.

Focused on

Ambient device that tells you when your period is coming and when you are ovulating in a discreet way.


February 7th, 2018