This program simulates a dual dice throw by pushing the 2 buttons on the QW dev kit. The results of the throw are shown in binary on the leds, printed in the console window and transmitted via Sigfox.

Dependencies:   mbed

Fork of QW-BinaryDices by Quicksand

QW Binary Dices

This program simulates a dual dice throw by pushing the 2 buttons on the QW dev kit. The results of the throw are shown in binary on the leds, printed in the console window and transmitted via Sigfox.

Code explanation

The program starts with the initialisation/declaration of the leds and pushbuttons. Also the necessary function prototypes and serial communications are declared. After that, the program enters an infinite loop and waits till both buttons have been pushed. Once both buttons have been pushed, the result is shown in binary on the leds (LED_3 = LSB), printed in the console window and transmitted via Sigfox. When the Sigfox message is transmitted, the program is ready to throw the dices again.

Sigfox message payload

First there is the "04", this is the Quicksand ID of the example program. This is used by Quicksand to keep track of our example programs. The second value that is transmitted is the number that was thrown by the dices.

More information and other example code can be found on the component page by clicking the link below: https://developer.mbed.org/components/QW-SIGFOX-Development-Kit/

Committer:
quicksandjonas
Date:
Tue Dec 13 16:52:23 2016 +0000
Revision:
1:00a17f5a247c
Parent:
0:6c17d1a79f75
This program simulates a dual dice throw. The result is shown in binary on the 4 leds and is transmitted via Sigfox.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
quicksandjonas 1:00a17f5a247c 1 /* This program demonstrates how to use the board to simulate a dual dice throw.
quicksandjonas 1:00a17f5a247c 2 * The result is displayed in binary on the leds and transmitted via Sigfox.
quicksandjonas 1:00a17f5a247c 3 * Open a serial console to the board to see extra info.
quicksandjonas 1:00a17f5a247c 4 */
quicksandjonas 1:00a17f5a247c 5
quicksand 0:6c17d1a79f75 6 #include "mbed.h"
quicksandjonas 1:00a17f5a247c 7
quicksandjonas 1:00a17f5a247c 8 #include <stdio.h>
quicksandjonas 1:00a17f5a247c 9 #include <stdlib.h>
quicksand 0:6c17d1a79f75 10
quicksandjonas 1:00a17f5a247c 11 #define SER_BUFFER_SIZE 32
quicksandjonas 1:00a17f5a247c 12
quicksandjonas 1:00a17f5a247c 13 /* The 4 onboard LEDs */
quicksand 0:6c17d1a79f75 14 DigitalOut LED_0 (PB_6);
quicksand 0:6c17d1a79f75 15 DigitalOut LED_1 (PA_7);
quicksand 0:6c17d1a79f75 16 DigitalOut LED_2 (PA_6);
quicksand 0:6c17d1a79f75 17 DigitalOut LED_3 (PA_5);
quicksandjonas 1:00a17f5a247c 18
quicksandjonas 1:00a17f5a247c 19 /* The 2 user buttons */
quicksandjonas 1:00a17f5a247c 20 InterruptIn SW1(PA_8);
quicksandjonas 1:00a17f5a247c 21 InterruptIn SW2(PB_10);
quicksandjonas 1:00a17f5a247c 22
quicksandjonas 1:00a17f5a247c 23
quicksandjonas 1:00a17f5a247c 24
quicksandjonas 1:00a17f5a247c 25 /* Function prototypes */
quicksandjonas 1:00a17f5a247c 26 void sw1interrupt();
quicksandjonas 1:00a17f5a247c 27 void sw2interrupt();
quicksandjonas 1:00a17f5a247c 28 void sertmout();
quicksandjonas 1:00a17f5a247c 29 bool modem_command_check_ok(char * command);
quicksandjonas 1:00a17f5a247c 30 void modem_setup();
quicksandjonas 1:00a17f5a247c 31
quicksandjonas 1:00a17f5a247c 32 bool ser_timeout = false;
quicksandjonas 1:00a17f5a247c 33
quicksandjonas 1:00a17f5a247c 34
quicksandjonas 1:00a17f5a247c 35 /* Serial port over USB */
quicksand 0:6c17d1a79f75 36 Serial pc(USBTX, USBRX);
quicksandjonas 1:00a17f5a247c 37
quicksandjonas 1:00a17f5a247c 38 /* Serial connection to sigfox modem */
quicksand 0:6c17d1a79f75 39 Serial modem(PA_9, PA_10);
quicksand 0:6c17d1a79f75 40
quicksandjonas 1:00a17f5a247c 41 bool dice1 = false;
quicksandjonas 1:00a17f5a247c 42 bool dice2 = false;
quicksandjonas 1:00a17f5a247c 43 uint8_t dice1val;
quicksandjonas 1:00a17f5a247c 44 uint8_t dice2val;
quicksandjonas 1:00a17f5a247c 45 uint8_t number;
quicksand 0:6c17d1a79f75 46
quicksand 0:6c17d1a79f75 47
quicksandjonas 1:00a17f5a247c 48 int main() {
quicksandjonas 1:00a17f5a247c 49
quicksandjonas 1:00a17f5a247c 50 time_t t;
quicksand 0:6c17d1a79f75 51
quicksandjonas 1:00a17f5a247c 52 /* Setup TD120x */
quicksandjonas 1:00a17f5a247c 53 wait(3);
quicksandjonas 1:00a17f5a247c 54 modem_setup();
quicksandjonas 1:00a17f5a247c 55
quicksandjonas 1:00a17f5a247c 56 /* Turn off all LED */
quicksand 0:6c17d1a79f75 57 LED_0 = 1;
quicksand 0:6c17d1a79f75 58 LED_1 = 1;
quicksand 0:6c17d1a79f75 59 LED_2 = 1;
quicksand 0:6c17d1a79f75 60 LED_3 = 1;
quicksand 0:6c17d1a79f75 61
quicksandjonas 1:00a17f5a247c 62 /* Setup button interrupts */
quicksandjonas 1:00a17f5a247c 63 SW1.fall(&sw1interrupt);
quicksandjonas 1:00a17f5a247c 64 SW2.fall(&sw2interrupt);
quicksandjonas 1:00a17f5a247c 65
quicksandjonas 1:00a17f5a247c 66 /* Intializes random number generator */
quicksandjonas 1:00a17f5a247c 67 srand((unsigned) time(&t));
quicksand 0:6c17d1a79f75 68
quicksand 0:6c17d1a79f75 69 while(1) {
quicksandjonas 1:00a17f5a247c 70
quicksandjonas 1:00a17f5a247c 71 if(dice1 == true && dice2 == true){
quicksandjonas 1:00a17f5a247c 72 number = dice1val + dice2val;
quicksandjonas 1:00a17f5a247c 73 pc.printf("\nThe number is: %d\n\r", number);
quicksandjonas 1:00a17f5a247c 74
quicksandjonas 1:00a17f5a247c 75 switch(number) {
quicksandjonas 1:00a17f5a247c 76 case 2 :
quicksandjonas 1:00a17f5a247c 77 LED_0 = 1;
quicksandjonas 1:00a17f5a247c 78 LED_1 = 1;
quicksandjonas 1:00a17f5a247c 79 LED_2 = 0;
quicksandjonas 1:00a17f5a247c 80 LED_3 = 1;
quicksandjonas 1:00a17f5a247c 81 break;
quicksandjonas 1:00a17f5a247c 82 case 3 :
quicksandjonas 1:00a17f5a247c 83 LED_0 = 1;
quicksandjonas 1:00a17f5a247c 84 LED_1 = 1;
quicksandjonas 1:00a17f5a247c 85 LED_2 = 0;
quicksandjonas 1:00a17f5a247c 86 LED_3 = 0;
quicksandjonas 1:00a17f5a247c 87 break;
quicksandjonas 1:00a17f5a247c 88 case 4 :
quicksandjonas 1:00a17f5a247c 89 LED_0 = 1;
quicksandjonas 1:00a17f5a247c 90 LED_1 = 0;
quicksandjonas 1:00a17f5a247c 91 LED_2 = 1;
quicksandjonas 1:00a17f5a247c 92 LED_3 = 1;
quicksandjonas 1:00a17f5a247c 93 break;
quicksandjonas 1:00a17f5a247c 94 case 5 :
quicksandjonas 1:00a17f5a247c 95 LED_0 = 1;
quicksandjonas 1:00a17f5a247c 96 LED_1 = 0;
quicksandjonas 1:00a17f5a247c 97 LED_2 = 1;
quicksandjonas 1:00a17f5a247c 98 LED_3 = 0;
quicksandjonas 1:00a17f5a247c 99 break;
quicksandjonas 1:00a17f5a247c 100 case 6 :
quicksandjonas 1:00a17f5a247c 101 LED_0 = 1;
quicksandjonas 1:00a17f5a247c 102 LED_1 = 0;
quicksandjonas 1:00a17f5a247c 103 LED_2 = 0;
quicksandjonas 1:00a17f5a247c 104 LED_3 = 1;
quicksandjonas 1:00a17f5a247c 105 break;
quicksandjonas 1:00a17f5a247c 106 case 7 :
quicksandjonas 1:00a17f5a247c 107 LED_0 = 1;
quicksandjonas 1:00a17f5a247c 108 LED_1 = 0;
quicksandjonas 1:00a17f5a247c 109 LED_2 = 0;
quicksandjonas 1:00a17f5a247c 110 LED_3 = 0;
quicksandjonas 1:00a17f5a247c 111 break;
quicksandjonas 1:00a17f5a247c 112 case 8 :
quicksandjonas 1:00a17f5a247c 113 LED_0 = 0;
quicksandjonas 1:00a17f5a247c 114 LED_1 = 1;
quicksandjonas 1:00a17f5a247c 115 LED_2 = 1;
quicksandjonas 1:00a17f5a247c 116 LED_3 = 1;
quicksandjonas 1:00a17f5a247c 117 break;
quicksandjonas 1:00a17f5a247c 118 case 9 :
quicksandjonas 1:00a17f5a247c 119 LED_0 = 0;
quicksandjonas 1:00a17f5a247c 120 LED_1 = 1;
quicksandjonas 1:00a17f5a247c 121 LED_2 = 1;
quicksandjonas 1:00a17f5a247c 122 LED_3 = 0;
quicksandjonas 1:00a17f5a247c 123 break;
quicksandjonas 1:00a17f5a247c 124 case 10 :
quicksandjonas 1:00a17f5a247c 125 LED_0 = 0;
quicksandjonas 1:00a17f5a247c 126 LED_1 = 1;
quicksandjonas 1:00a17f5a247c 127 LED_2 = 0;
quicksandjonas 1:00a17f5a247c 128 LED_3 = 1;
quicksandjonas 1:00a17f5a247c 129 break;
quicksandjonas 1:00a17f5a247c 130 case 11 :
quicksandjonas 1:00a17f5a247c 131 LED_0 = 0;
quicksandjonas 1:00a17f5a247c 132 LED_1 = 1;
quicksandjonas 1:00a17f5a247c 133 LED_2 = 0;
quicksandjonas 1:00a17f5a247c 134 LED_3 = 0;
quicksandjonas 1:00a17f5a247c 135 break;
quicksandjonas 1:00a17f5a247c 136 case 12 :
quicksandjonas 1:00a17f5a247c 137 LED_0 = 0;
quicksandjonas 1:00a17f5a247c 138 LED_1 = 0;
quicksandjonas 1:00a17f5a247c 139 LED_2 = 1;
quicksandjonas 1:00a17f5a247c 140 LED_3 = 1;
quicksandjonas 1:00a17f5a247c 141 break;
quicksandjonas 1:00a17f5a247c 142 default :
quicksandjonas 1:00a17f5a247c 143 pc.printf("\nImpossible number!!\n\r");
quicksandjonas 1:00a17f5a247c 144 LED_0 = 1;
quicksandjonas 1:00a17f5a247c 145 LED_1 = 1;
quicksandjonas 1:00a17f5a247c 146 LED_2 = 1;
quicksandjonas 1:00a17f5a247c 147 LED_3 = 1;
quicksandjonas 1:00a17f5a247c 148 }
quicksandjonas 1:00a17f5a247c 149 char command[SER_BUFFER_SIZE];
quicksandjonas 1:00a17f5a247c 150 sprintf(command, "AT$SF=04%04x,2,0\n", (int) number );
quicksandjonas 1:00a17f5a247c 151 pc.printf("Sending thrown number = %i over Sigfox using modem command: %s\n", number , command);
quicksandjonas 1:00a17f5a247c 152 modem_command_check_ok(command);
quicksandjonas 1:00a17f5a247c 153 //wait_ms(5000);
quicksandjonas 1:00a17f5a247c 154 LED_0 = 1;
quicksandjonas 1:00a17f5a247c 155 LED_1 = 1;
quicksandjonas 1:00a17f5a247c 156 LED_2 = 1;
quicksandjonas 1:00a17f5a247c 157 LED_3 = 1;
quicksandjonas 1:00a17f5a247c 158 dice1 = false;
quicksandjonas 1:00a17f5a247c 159 dice2 = false;
quicksandjonas 1:00a17f5a247c 160 }
quicksandjonas 1:00a17f5a247c 161
quicksand 0:6c17d1a79f75 162 }
quicksandjonas 1:00a17f5a247c 163 }
quicksandjonas 1:00a17f5a247c 164 void modem_setup()
quicksandjonas 1:00a17f5a247c 165 {
quicksandjonas 1:00a17f5a247c 166 /* Reset to factory defaults */
quicksandjonas 1:00a17f5a247c 167 if(modem_command_check_ok("AT&F"))
quicksandjonas 1:00a17f5a247c 168 {
quicksandjonas 1:00a17f5a247c 169 pc.printf("Factory reset succesfull\r\n");
quicksandjonas 1:00a17f5a247c 170 }
quicksandjonas 1:00a17f5a247c 171 else
quicksandjonas 1:00a17f5a247c 172 {
quicksandjonas 1:00a17f5a247c 173 pc.printf("Factory reset TD120x failed\r\n");
quicksandjonas 1:00a17f5a247c 174 }
quicksandjonas 1:00a17f5a247c 175 /* Disable local echo */
quicksandjonas 1:00a17f5a247c 176 modem.printf("ATE0\n");
quicksandjonas 1:00a17f5a247c 177 if(modem_command_check_ok("ATE0"))
quicksandjonas 1:00a17f5a247c 178 {
quicksandjonas 1:00a17f5a247c 179 pc.printf("Local echo disabled\r\n");
quicksandjonas 1:00a17f5a247c 180 }
quicksandjonas 1:00a17f5a247c 181 /* Write to mem */
quicksandjonas 1:00a17f5a247c 182 if(modem_command_check_ok("AT&W"))
quicksandjonas 1:00a17f5a247c 183 {
quicksandjonas 1:00a17f5a247c 184 pc.printf("Settings saved!\r\n");
quicksandjonas 1:00a17f5a247c 185 }
quicksandjonas 1:00a17f5a247c 186 }
quicksandjonas 1:00a17f5a247c 187
quicksandjonas 1:00a17f5a247c 188 bool modem_command_check_ok(char * command)
quicksandjonas 1:00a17f5a247c 189 {
quicksandjonas 1:00a17f5a247c 190 /* first clear serial data buffers */
quicksandjonas 1:00a17f5a247c 191 while(modem.readable()) modem.getc();
quicksandjonas 1:00a17f5a247c 192 /* Timeout for response of the modem */
quicksandjonas 1:00a17f5a247c 193 Timeout tmout;
quicksandjonas 1:00a17f5a247c 194 ser_timeout = false;
quicksandjonas 1:00a17f5a247c 195 /* Buffer for incoming data */
quicksandjonas 1:00a17f5a247c 196 char responsebuffer[6];
quicksandjonas 1:00a17f5a247c 197 /* Flag to set when we get 'OK' response */
quicksandjonas 1:00a17f5a247c 198 bool ok = false;
quicksandjonas 1:00a17f5a247c 199 bool error = false;
quicksandjonas 1:00a17f5a247c 200 /* Print command to TD120x */
quicksandjonas 1:00a17f5a247c 201 modem.printf(command);
quicksandjonas 1:00a17f5a247c 202 /* Newline to activate command */
quicksandjonas 1:00a17f5a247c 203 modem.printf("\n");
quicksandjonas 1:00a17f5a247c 204 /* Wait untill serial feedback, min 7 seconds before timeout */
quicksandjonas 1:00a17f5a247c 205 tmout.attach(&sertmout, 7.0);
quicksandjonas 1:00a17f5a247c 206 while(!modem.readable()&& ser_timeout == false);
quicksandjonas 1:00a17f5a247c 207 while(!ok && !ser_timeout && !error)
quicksandjonas 1:00a17f5a247c 208 {
quicksandjonas 1:00a17f5a247c 209 if(modem.readable())
quicksandjonas 1:00a17f5a247c 210 {
quicksandjonas 1:00a17f5a247c 211 for(int i = 0; i < 5; i++)
quicksandjonas 1:00a17f5a247c 212 {
quicksandjonas 1:00a17f5a247c 213 responsebuffer[i] = responsebuffer[i+1];
quicksandjonas 1:00a17f5a247c 214 }
quicksandjonas 1:00a17f5a247c 215 responsebuffer[5] = modem.getc();
quicksandjonas 1:00a17f5a247c 216 if(responsebuffer[0] == '\r' && responsebuffer[1] == '\n' && responsebuffer[2] == 'O' && responsebuffer[3] == 'K' && responsebuffer[4] == '\r' && responsebuffer[5] == '\n' )
quicksandjonas 1:00a17f5a247c 217 {
quicksandjonas 1:00a17f5a247c 218 ok = true;
quicksandjonas 1:00a17f5a247c 219 }
quicksandjonas 1:00a17f5a247c 220 else if(responsebuffer[0] == '\r' && responsebuffer[1] == '\n' && responsebuffer[2] == 'E' && responsebuffer[3] == 'R' && responsebuffer[4] == 'R' && responsebuffer[5] == 'O' )
quicksandjonas 1:00a17f5a247c 221 {
quicksandjonas 1:00a17f5a247c 222 error = true;
quicksandjonas 1:00a17f5a247c 223 }
quicksandjonas 1:00a17f5a247c 224 }
quicksandjonas 1:00a17f5a247c 225 }
quicksandjonas 1:00a17f5a247c 226 tmout.detach();
quicksandjonas 1:00a17f5a247c 227 return ok;
quicksandjonas 1:00a17f5a247c 228 }
quicksandjonas 1:00a17f5a247c 229 /* Button 1 ISR */
quicksandjonas 1:00a17f5a247c 230 void sw1interrupt()
quicksandjonas 1:00a17f5a247c 231 {
quicksandjonas 1:00a17f5a247c 232 if(dice1 == false){
quicksandjonas 1:00a17f5a247c 233 pc.printf("\nDice 1 has been thrown\n\r");
quicksandjonas 1:00a17f5a247c 234 dice1 = true;
quicksandjonas 1:00a17f5a247c 235 dice1val = (rand() % 6)+1;
quicksandjonas 1:00a17f5a247c 236 }
quicksandjonas 1:00a17f5a247c 237 else{
quicksandjonas 1:00a17f5a247c 238 pc.printf("\nDice 1 has already been thrown\n\r");
quicksandjonas 1:00a17f5a247c 239 }
quicksandjonas 1:00a17f5a247c 240
quicksandjonas 1:00a17f5a247c 241 }
quicksandjonas 1:00a17f5a247c 242
quicksandjonas 1:00a17f5a247c 243 /* Button 2 ISR */
quicksandjonas 1:00a17f5a247c 244 void sw2interrupt()
quicksandjonas 1:00a17f5a247c 245 {
quicksandjonas 1:00a17f5a247c 246 if(dice2 == false){
quicksandjonas 1:00a17f5a247c 247 pc.printf("\nDice 2 has been thrown\n\r");
quicksandjonas 1:00a17f5a247c 248 dice2 = true;
quicksandjonas 1:00a17f5a247c 249 dice2val = (rand() % 6)+1;
quicksandjonas 1:00a17f5a247c 250 }
quicksandjonas 1:00a17f5a247c 251 else{
quicksandjonas 1:00a17f5a247c 252 pc.printf("\nDice 2 has already been thrown\n\r");
quicksandjonas 1:00a17f5a247c 253 }
quicksandjonas 1:00a17f5a247c 254 }
quicksandjonas 1:00a17f5a247c 255
quicksandjonas 1:00a17f5a247c 256 /* ISR for serial timeout */
quicksandjonas 1:00a17f5a247c 257 void sertmout()
quicksandjonas 1:00a17f5a247c 258 {
quicksandjonas 1:00a17f5a247c 259 ser_timeout = true;
quicksandjonas 1:00a17f5a247c 260 }
quicksandjonas 1:00a17f5a247c 261
quicksandjonas 1:00a17f5a247c 262
quicksandjonas 1:00a17f5a247c 263