Sunday, January 31, 2016

How to Reset Your Arduino from Code

In this video we talk about how to reset your Arduino from code with no hands. You can find the schematic and code from this video below.

***************Arduino Code from Video************************************
// Pin 13 has an LED connected on most Arduino boards.
int led = 13;
//create a variable for detecting what mode you are in. If used in interrupt must be "volatile"
/*volatile*/ bool nMode = 1;

void setup() {
  pinMode(4, OUTPUT); //set up pin 4, which is connected to base of transistor
  digitalWrite(4,LOW); //set to low so transistor is off and doesn't trigger reset
  pinMode(led, OUTPUT); //set up the LED pin to output
  Serial.begin(57600); //start serial comm
  Serial.println("We just started back up"); //print quick message so we know we just went through setup code
  Serial.end(); //need to shut off serial comm because it uses interrupts
  //Create interrupt: 0 for pin 2, the name of the interrupt function or ISR, and condition to trigger interrupt 
  attachInterrupt(0, interruptFunction, CHANGE); 

void loop() {
    digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(400);               // wait 
    digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
    delay(400);               // wait 
  noInterrupts(); //disables interrupts
  // critical, time-sensitive code here
  interrupts();//enables interrupts

//This is the function called when the interrupt occurs (pin 2 goes high)
//this is often referred to as the interrupt service routine or ISR
//This cannot take any input arguments or return anything
void interruptFunction() {
  digitalWrite(4,HIGH); //with this variable set to 1 the LED will blink
 //detachInterrupt(0); this function call will turn the interrupt off

Wednesday, January 27, 2016

Utilizing the Arduino ADC Internal Reference

In this video we look at the ADC internal reference in an Arduino, why / when would you use it, how to ensure you get good measurement accuracy when using it, and how to use it to check your battery voltage.

**********************Arduino Code from the video****************************
float iREF = 1.08; //internal reference cal factor

void setup() {
  // put your setup code here, to run once:
  //burn some ADC readings after reference change
  for(int i=0; i<8; i++) analogRead(A0);

void loop() {
  // put your main code here, to run repeatedly:
  Serial.print("Measured battery voltage is: ");

//This function uses the known internal reference value of the 328p (~1.1V) to calculate the VCC value which comes from a battery
//This was leveraged from a great tutorial found at
float fReadVcc() {
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(3); //delay for 3 milliseconds
  ADCSRA |= _BV(ADSC); // Start ADC conversion
  while (bit_is_set(ADCSRA,ADSC)); //wait until conversion is complete
  int result = ADCL; //get first half of result
  result |= ADCH<<8; //get rest of the result
  float batVolt = (iREF / result)*1024; //Use the known iRef to calculate battery voltage
  return batVolt;

Wednesday, January 20, 2016

Building a Wireless Sensor Network with the nRF24L01 Part 4

In part 4 of Building a Wireless Sensor Network with the nRF24L01 we take a look at the design's PCB layout in Eagle software as well as cover some software and hardware updates to the design.

You can access the updated code and PCB files from GitHub:

Wednesday, January 6, 2016

Building a Wireless Sensor Network with the nRF24L01 Part 3

In part three we take a look at the updated hardware schematic of the router / end device design, how the router / end device settings work, and we go over the initial software of the router / end device. You can find the code from this video in GitHub at