Part 6 - speaking to other nodes
Lets bring our buzzer back into play as shown in the circuit below.
The circuit:
We now want to receive a message from the sending unit and then pass it on to one of our neighbours, lets make our code a bit more interesting and make use of some of the bits we have already used. This time the sending unit will broadcast a message with a value between 0 and 1024 just like when we used a potentiometer to control things before.
Check the message is meant for your node and then use this 0-1024 value to:
- Control the LED colour with the colour mixing code we found at this resource. You might want to put it in a function of its own and call it from the main loop, remember to check the pins!
- Control the buzzer with the 'tone()' function by mapping the 0-1023 range to 220-4400 for frequency.
- Turn the LED and buzzer on for one second, then turn them both off
- Pass the input value on to the next node, look at the sender example in Part 5 if you are not sure how.
+ Hint 1
We have everything we need between the previous exercises:
- go back to the exercise 4 solution, it has the colour mixer and tone code in it and forms a great basis for this sketch
- extract the Serial reading and address/code matching stuff from the solution in exercise 5 and merge it into the part 4 sketch
- look at the sender example in part 5 to see how to send a message to another node
- you will need to set up your own address and the node you are going to send to!
+ The solution
/* * Receives serial, breaks two ints apart * and uses them as an address and code for LED * and tone playing. Then sends code to next * node. * * Luke Woodbury 25 Jan 2017 * dotLib.org */ //LED pins and variables to store values const int redPin = 10; const int grnPin = 6; const int bluPin = 9; int redVal = 0; int grnVal = 0; int bluVal = 0; //buzzer pin and variable const int buzzPin = 11; int toneVal = 100; int thisNode = 2; int nextNode = 3; void setup() { //set up serial for the xbee comms Serial1.begin(9600); //set up serial for printing to monitor etc //Serial.begin(9600); pinMode(redPin, OUTPUT); // sets the pins as output pinMode(grnPin, OUTPUT); pinMode(bluPin, OUTPUT); } void loop(){ if (Serial1.available() >= 3) { //use 'parseInt' to set the address/code variable int address = Serial1.parseInt(); int code = Serial1.parseInt(); //Serial.print(address); //Serial.print(" "); //Serial.println(code); //if address matches our node number if(address == thisNode){ //use to animate LED and buzzer LEDanimate(code); playTone(code); delay(1000); allStop(); //Send to the next node Serial1.print(nextNode); //Serial.print(nextNode); //send a space Serial1.print(' '); //Serial.print(' '); //... then send the code Serial1.print(code); //Serial.println(code); //...then another space to stop parseInt waiting Serial1.print(' '); } } } void LEDanimate(int LEDval){ if (LEDval < 341) // Lowest third of the pot range (0-340) { LEDval = (LEDval * 3) / 4; // Normalize to 0-255 redVal = 256 - LEDval; // Red from full to off grnVal = LEDval; // Green from off to full bluVal = 1; // Blue off } else if (LEDval < 682) // Middle third of pot range (341-681) { LEDval = ( (LEDval-341) * 3) / 4; // Normalize to 0-255 redVal = 1; // Red off grnVal = 256 - LEDval; // Green from full to off bluVal = LEDval; // Blue from off to full } else // Upper third of potentiometer"s range (682-1023) { LEDval = ( (LEDval-683) * 3) / 4; // Normalize to 0-255 redVal = LEDval; // Red from off to full grnVal = 1; // Green off bluVal = 256 - LEDval; // Blue from full to off } analogWrite(redPin, redVal); // Write values to LED pins analogWrite(grnPin, grnVal); analogWrite(bluPin, bluVal); } void playTone(int toneVal){ toneVal = map(toneVal, 0, 1023, 220, 4400); tone(buzzPin, toneVal); } void allStop(){ analogWrite(redPin,0); analogWrite(grnPin,0); analogWrite(bluPin,0); noTone(buzzPin); }