// EPOCH PROJECT#32B - RECEIVING DATA USING OUR OWN TRANSFER PROTOCOL // THIS IS THE RECEIVER CODE. THIS WILL BE LOADED INTO CHIP-B ON THE EPOCH AND WILL ONLY RECEIVE DATE. IT WON'T TRANSMIT. WE'LL DO ANOTHER PROKECT // LATER THAT ALLOWS FOR US TO SEND DATA BACK AND FORTH BETWEEN TWO CHIPS. MAKE SURE THAT THE TRANSMITTER CODE (32A) IS LOADED INTO CHIP-1 // CONNECTIONS: // CONNECT GPIO PIN#2 ON CHIP-A TO GPIO PIN#3 ON CHIP-B #define inval 3 // inval IS OUR RECEIVER LINE, WHICH IS DEDICATED TO GPIO PIN #3 ON CHIP-A int val = 0; // val IS TE INTEGER THAT HOLDS THE INCOMING DATA int state = 0; // state IS AN INTEGER THAT CONTROLS WHEN A MAIN WHILE LOOP IN THE incoming() FUNCTON ENDS int timer = 0; // timer IS AN INTEGER THAT HOLDS TIMING DATA IN THE incoming() FUNCTION. IT LETS US KNOW WHEN THE TRANSMITTER HAS STOPPED SENDING PULSES. void setup(){ Serial.begin(9600); pinMode(inval,INPUT); } void loop(){ incoming(); } void incoming() // THIS FUNCTION ACTS TO WAIT FOR AN INSTRUCTION, AND WAIT FOR A SET OF PULSES, WHICH WILL EQUAL THE INSTRUCTION NUMBER. { val = 0; // Set int 'val' to 0. state = 0; // Set int 'state' state to 0 while(digitalRead(inval) == LOW){ // Wait until data on A1 line goes from 0v to 5v. Once there, this while loop will end. {} } while(state == 0){ // This new while loop will execute until 'state' not equal 0. ESSENTIALLY THE REST OF THIS FUNCTION IS IN THIS WHILE LOOP. { while(digitalRead(inval) == HIGH){ // This new while loop will wait until the 'inval' input line goes back to 0v from 1v. {} } val = val + 1; // Add 1 to the 'val' integer timer = 0; // 'timer' integer set to 0; while(digitalRead(inval) == LOW){ // This while loop is a timer. It waits for the 'inval' input line to go from 0v to 5v again. It counts pulses from the transmitter. { delay(1); // Wait 1ms timer = timer + 1; // Add 1 to 'timer' integer if(timer > 7) // If 'timer' value is higher than 7 (7 ms has elapsed), then to do the following { Serial.print("val#"); // Then write "val#" to the serial monitor Serial.println(val); // Write 'val', which is the instruction value state = 1; // state is changed to 1, which means that this function will end break; // EXIT } } } } } } // NOTES // NOTICE THE LINE "if(timer > 7){'. IN THE TRANSMITTER CODE, THE pulse() FUNCTON TURNS ON THE TRANSMITTER LINE FOR 5ms AND THEN OFF FOR 5ms // IF THE LINE HAS BEEN LOW FOR MORE THAN 7ms THEN WE KNOW THAT NO MORE PULSES ARE COMING. REALLY, YOU CAN CHANGE THIS TO 6. I JUST ADDED 2ms TO 5ms // FOR A BUFFER... // I2C AND SPI ARE MUCH, MUCH, MUCH FASTER WAYS TO COMMUNICATE WITH OTHER CHIPS. I JUST WANTED TO TEACH YOU THAT YOU CAN CREATE YOUR OWN PROTOCOLS. // THIS IS JUST A SIMPLE ONE THAT I CAME UP WITH AND USED FOR THE BOBBEEBOT TO COMMUNICATE BETWEEN TWO CHIPS. // When you receive data from the transmitter, you can customize your code to do something with it. For instance, // if received value is 6, execute a piece of code. If the value is 7, turn an LED on. If the value is 8, turn the LED off. // CHALLENGE: // IN THE TRANSMITTER CODE, YOU CAN NOW ADD ANY VALUE TO 'sendval' AND SEND IT. TRY MESSING WITH THAT CHANGE IT UP, AND SEND SAY 105. TRY AND VERIFY THAT // THE RECEIVER IS RECEIVING A VALUE OF 105 // CHALLENGE#2: // CAN YOU MAKE BOTH CHIPS SEND AND RECEIVE? YES. YOU NEED ONE DEDICATED INPUT AND OUTPUT ON BOTH CHIPS. WITH A LITTLE COPY AND PASTE, YOU CAN DO THIS. // GIVE IT A TRY!