Week 13 assignments:

  • design and build a wired and/or wireless network connecting at least two processors

Designing and build a wired network connecting two or more processors

My original plan was to connect two o more "hello world" boards with I2C testing a feature needed for my final project.
Unfortunately I wasn't able to establish a working I2C connection with this simple board: I'd like to use Arduino enviroment but "Wire" library is not compatible with ATtiny84 MCU and "TinyWire" library found on github doesn't seems to work "out of the box".
I'm on a tight schedule so i ditched the initial idea (looking for an ATmega for my final project) and elected to use a serial connection.


Connections.

The button of "hello world" board generates a "request" message

#include  
////////////////
// Setup vars //
////////////////

SoftwareSerial mySerial(1, 0);
// LED pins
const int greenPin =  7;
const int orangePin =  8;
const int redPin =  3;
// Button pin
const int buttonPin =  2;

// Local address
byte local_address = 001;

//default button state
int buttonState = 0;


////////////////////
// setup function //
////////////////////
void setup() {
    // initialize the LED pins as outputs
    pinMode(greenPin, OUTPUT);
    pinMode(orangePin, OUTPUT);
    pinMode(redPin, OUTPUT);

    // initialize the pushbutton pin as an input
    pinMode(buttonPin, INPUT);

    // Serial initialization
    mySerial.begin(9600);

    //default led state
    digitalWrite(greenPin, LOW);
    digitalWrite(orangePin, LOW);
    digitalWrite(redPin, LOW);
}


///////////////////
// loop function //
///////////////////
void loop() {
    // read the state of the pushbutton value:
    buttonState = digitalRead(buttonPin);

    if (buttonState == HIGH) {
        digitalWrite(greenPin, HIGH);
        digitalWrite(orangePin, HIGH);
        digitalWrite(redPin, HIGH);
        unsigned int count = 0;

        while (buttonState == HIGH) {
            buttonState = digitalRead(buttonPin);
            count ++;
            delay(50);
        }

        send_Message("002");

        digitalWrite(greenPin, LOW);
        digitalWrite(orangePin, LOW);
        digitalWrite(redPin, LOW);
        delay(250);
    }


    // Resetting command address
    byte command_address = 0;
    // Check if there is stuff available in serial buffer
    while (mySerial.available() > 0) {

        // Received raw command var
        String raw_command = "";
        // Extract raw command
        raw_command = mySerial.readStringUntil(';');

        // Read the address received in the command
        byte command_address = address_LookUp(raw_command);

        // If the command address is valid and match the local address then execute the next command
        if (command_address == 255 || command_address == local_address) {
            raw_command = mySerial.readStringUntil(';');
            request_LookUp(raw_command);
        } else {
            // Otherwise put the next command in the trash bin
            mySerial.readStringUntil(';');
        }
    }
}


///////////////////////////
// send_Message function //
///////////////////////////
void send_Message(String address) {
    mySerial.println("addr:"+ address +";request;");
}


/////////////////////////////
// address_LookUp function //
/////////////////////////////
byte address_LookUp(String raw) {
    // Look for valid "addr" command
    int address_command_pos = raw.lastIndexOf("addr:");
    // If there is a valid "address" command then read the value
    if (address_command_pos != -1 ) {
        String address_string_value = raw.substring(address_command_pos + 5, raw.length());
        // If the readed value is a string of only digits then convert it to int e return it
        if (isValidInt(address_string_value)) {
            return address_string_value.toInt();
        }
    }
    return 0;
}

/////////////////////////////
// request_LookUp function //
/////////////////////////////
void request_LookUp(String raw) {
    // Look for valid "dim_set" command
    int dimset_command_pos = raw.lastIndexOf("request");
    // If there is a valid "dim_set" command then handoff to dimSetCommand function
    if (dimset_command_pos != -1 ) {
        request_Sequence();
    }
}


/////////////////////////////
// request_LookUp function //
/////////////////////////////
void request_Sequence() {
      //GREEN
      digitalWrite(greenPin, HIGH);
      digitalWrite(orangePin, LOW);
      digitalWrite(redPin, LOW);
      delay(5000);
      //ORANGE
      digitalWrite(greenPin, LOW);
      digitalWrite(orangePin, HIGH);
      digitalWrite(redPin, LOW);
      delay(1000);
      //RED
      digitalWrite(greenPin, LOW);
      digitalWrite(orangePin, LOW);
      digitalWrite(redPin, HIGH);
}


/////////////////////////
// isValidInt function //
/////////////////////////
boolean isValidInt(String str) {
    boolean isInt = false;
    for(byte i = 0; i < str.length(); i++) {
        if(isDigit(str.charAt(i))) {
            isInt = true;
        } else {
            return false;
        }
    }
    return isInt;
}


                

Demo video.

Network firmware sources