Components and supplies
Resistor 680 ohm 0.4w
Green LED 565nm 2.2v 2...5mA
Resistor 68 ohm 0.4w
Rubber feets sticker 10 mm diameter 2 mm high
Shrink Tube
Resistor 560 ohm 0.4w
Temperature Sensor
Arduino Nano R3
Blue LED 455nm 3.8v 20mA
Red LED 625nm 1.8v 2..5mA
Tools and machines
3D Printer, ABS Filament
Soldering iron (generic)
Sidecutter
Apps and platforms
Visual Studio 2015
Fusion 360
Project description
Code
The sketch for the coaster
arduino
This program is loded into the coaster it is reading the temperature sensor and lighting the LEDs based on the given ranges.
1#include <EEPROM.h> 2 3#define AREF 3.3 // we tie 3.3V to ARef and measure it with a multimeter! 4 5//Vout TMP36 > A1 6//3.3V > V+ TMP36 > AREF 7//GND TMP36 > GND 8//D6 > Piezo > GND 9//D7 > Blue Led (+), Blue Led (-) > 60 Ohm > GND 10//D8 > Green Led (+), Green Led (-) > 560 Ohm > GND 11//D9 > Red Led (+), Red Led (-) > 640 Ohm > GND 12 13int iPinTemperature = 1; 14int iTemperatureReading; 15int iPinLedRed = 9; 16int iPinLedGreen = 8; 17int iPinLedBlue = 7; 18int iPinBuzzer = 6; 19String strSerialInput = ""; 20bool bSerialInputComplete = false; 21float fTopTemperature = 100; 22float fBottomTemperature = 0; 23int iEEPROMTopTemperature = 0; 24int iEEPROMBottomTemperature = 4; 25int iEEPROMDisplayCelcius = 8; 26int iEEPROMPlayTopTemperatureSound = 9; 27int iEEPROMPlayBottomTemperatureSound = 10; 28bool bPlayTopTemperatureSound = false; 29bool bPlayBottomTemperatureSound = false; 30bool bTempDisplaysCelcius = true; 31float fPreviousTemperature = 0; 32// Number of average temperatures in celcius 33#define AVGC 13 34#define POSCOUNT 10 35float fArrTemps[AVGC]; // Array used to calculate the average temperature 36float fArrTempsD[AVGC]; // Array used to calculate the average delta temperature 37int iLEDConfigCurrent = 0; // 1 = Red, 0 = Green, -1 = Blue 38int iLEDConfigPrevious = 0; // 1 = Red, 0 = Green, -1 = Blue 39bool bLEDsActive = false; 40bool bLEDsBlink = false; 41float fAverageTemp; 42float fAverageTempD; 43int iDeltaPositiveCount; 44bool bInitAverage = true; 45int iAvgIndex; 46long lMilliSecondsSinceBeep = -1; 47long iMilliSecondsSinceBeepCount = 50000; 48long iMilliSecondsSinceLastSwitchCount = 900000; 49long lMilliSecondsSinceLastSwitch = iMilliSecondsSinceLastSwitchCount; 50 51void setup(void) 52{ 53 // We'll send debugging information via the Serial monitor 54 Serial.begin(9600); 55 Serial.println("Setup"); 56 57 // If you want to set the aref to something other than 5v 58 analogReference(EXTERNAL); 59 pinMode(iPinLedRed, OUTPUT); 60 pinMode(iPinLedGreen, OUTPUT); 61 pinMode(iPinLedBlue, OUTPUT); 62 63 strSerialInput.reserve(20); 64 65 long lTop = EEPROMReadlong(iEEPROMTopTemperature); 66 if (lTop < 0 || lTop > 10000) 67 { 68 lTop = 4500; 69 } 70 long lBottom = EEPROMReadlong(iEEPROMBottomTemperature); 71 if (lBottom < 0 || lBottom > 10000) 72 { 73 lBottom = 3900; 74 } 75 76 if (lTop < lBottom) 77 { 78 lTop = 4500; 79 lBottom = 3900; 80 } 81 fTopTemperature = (float)lTop / (float)100; 82 fBottomTemperature = (float)lBottom / (float)100; 83 bTempDisplaysCelcius = EEPROM.read(iEEPROMDisplayCelcius) == 1; 84 85 bPlayTopTemperatureSound = EEPROM.read(iEEPROMPlayTopTemperatureSound) == 1; 86 bPlayBottomTemperatureSound = EEPROM.read(iEEPROMPlayBottomTemperatureSound) == 1; 87} 88 89 90void loop(void) 91{ 92 if (bSerialInputComplete) 93 { 94 Serial.println(strSerialInput); 95 strSerialInput = ""; 96 bSerialInputComplete = false; 97 } 98 99 iTemperatureReading = analogRead(iPinTemperature); 100 // Converting temperature voltage to temperature using AREF 101 float fTemperatureVoltage = iTemperatureReading * AREF; 102 fTemperatureVoltage /= 1024.0; 103 float fTemperatureC = (fTemperatureVoltage - 0.5) * 100 ; //converting from 10 mv per degree with 500 mV offset to degrees ((fTemperatureVoltage - 500mV) times 100 104 105 // Initialize average arrays etc 106 if (bInitAverage) 107 { 108 for (int j = 0; j < AVGC; j++) 109 { 110 fArrTemps[j] = fTemperatureC; 111 fArrTempsD[j] = (float)-0.01; 112 } 113 bInitAverage = false; 114 iAvgIndex = 0; 115 fAverageTemp = fTemperatureC; 116 fPreviousTemperature = fTemperatureC; 117 bLEDsActive = true; 118 lMilliSecondsSinceBeep = millis(); 119 iLEDConfigPrevious = -1; 120 } 121 122 // Point to next average in the arrays 123 iAvgIndex++; 124 if (iAvgIndex > AVGC - 1) 125 { 126 iAvgIndex = 0; 127 } 128 129 fArrTemps[iAvgIndex] = fTemperatureC; 130 131 // Calculate averages 132 fAverageTemp = 0; 133 int iPosCount = 0; 134 for (int j = 0; j < AVGC; j++) 135 { 136 if (fArrTempsD[j] > (float)0.0) 137 { 138 iPosCount++; 139 } 140 fAverageTemp += fArrTemps[j]; 141 fAverageTempD += fArrTempsD[j]; 142 } 143 144 fAverageTemp = fAverageTemp / (float)AVGC; 145 fAverageTempD = fAverageTempD / (float)AVGC; 146 147 Serial.print("[it:"); Serial.print(fTemperatureC);Serial.print(",tt:"); 148 Serial.print(fTopTemperature);Serial.print(",bt:"); 149 Serial.print(fBottomTemperature);Serial.print(",dc:"); 150 Serial.print(bTempDisplaysCelcius); 151 Serial.print(",at:");Serial.print(fAverageTemp); 152 Serial.print(",pt:");Serial.print(bPlayTopTemperatureSound); 153 Serial.print(",pb:");Serial.print(bPlayBottomTemperatureSound); 154 Serial.println("]"); 155 156 if (fAverageTemp >= fTopTemperature) 157 { 158 iLEDConfigCurrent = 1; // Red 159 } 160 if (fAverageTemp <= fBottomTemperature) 161 { 162 iLEDConfigCurrent = -1; // Blue 163 } 164 if (fAverageTemp > fBottomTemperature && fAverageTemp < fTopTemperature) 165 { 166 iLEDConfigCurrent = 0; // Green 167 } 168 169 if (iLEDConfigCurrent >= 0 || (iLEDConfigCurrent == -1 && fAverageTempD > 0 && iPosCount >= POSCOUNT)) 170 { 171 lMilliSecondsSinceLastSwitch = millis(); 172 } 173 174 bLEDsActive = ((millis() - lMilliSecondsSinceLastSwitch) < iMilliSecondsSinceLastSwitchCount); 175 176 if (iLEDConfigPrevious == 1 && iLEDConfigCurrent == 0) 177 { 178 PlayUp(); 179 } 180 181 if (iLEDConfigPrevious == 0 && iLEDConfigCurrent == -1) 182 { 183 PlayDown(); 184 } 185 186 if (!bLEDsActive || (fAverageTempD > 0 && iPosCount >= POSCOUNT && !bLEDsBlink)) 187 { 188 digitalWrite(iPinLedRed, LOW); 189 digitalWrite(iPinLedGreen, LOW); 190 digitalWrite(iPinLedBlue, LOW); 191 } 192 else 193 { 194 if (iLEDConfigCurrent == 1) 195 { 196 digitalWrite(iPinLedRed, HIGH); 197 digitalWrite(iPinLedGreen, LOW); 198 digitalWrite(iPinLedBlue, LOW); 199 } 200 if (iLEDConfigCurrent == 0) 201 { 202 digitalWrite(iPinLedRed, LOW); 203 digitalWrite(iPinLedGreen, HIGH); 204 digitalWrite(iPinLedBlue, LOW); 205 } 206 if (iLEDConfigCurrent == -1) 207 { 208 digitalWrite(iPinLedRed, LOW); 209 digitalWrite(iPinLedGreen, LOW); 210 digitalWrite(iPinLedBlue, HIGH); 211 } 212 } 213 214 fArrTempsD[iAvgIndex] = fAverageTemp - fPreviousTemperature; 215 fPreviousTemperature = fAverageTemp; 216 iLEDConfigPrevious = iLEDConfigCurrent; 217 bLEDsBlink = !bLEDsBlink; 218 delay(450); 219} 220 221void serialEvent() 222{ 223 while (Serial.available()) 224 { 225 // get the new byte: 226 char inChar = (char)Serial.read(); 227 // add it to the strSerialInput: 228 strSerialInput += inChar; 229 // if the incoming character is a newline, set a flag so the main loop can 230 // do something about it: 231 if (inChar == '\ 232') 233 { 234 bSerialInputComplete = true; 235 236 if (strSerialInput.startsWith("tt:")) 237 { 238 strSerialInput = strSerialInput.substring(3); 239 fTopTemperature = strSerialInput.toFloat(); 240 EEPROMWritelong(iEEPROMTopTemperature, (long)(fTopTemperature * (float)100)); 241 } 242 243 if (strSerialInput.startsWith("bt:")) 244 { 245 strSerialInput = strSerialInput.substring(3); 246 fBottomTemperature = strSerialInput.toFloat(); 247 EEPROMWritelong(iEEPROMBottomTemperature, (long)(fBottomTemperature * (float)100)); 248 } 249 250 bTempDisplaysCelcius = ParseSerialOfBoolIfMatchSetEEPROMAndReturnBool("dc:", bTempDisplaysCelcius, iEEPROMDisplayCelcius); 251 bPlayTopTemperatureSound = ParseSerialOfBoolIfMatchSetEEPROMAndReturnBool("pt:", bPlayTopTemperatureSound, iEEPROMPlayTopTemperatureSound); 252 bPlayBottomTemperatureSound = ParseSerialOfBoolIfMatchSetEEPROMAndReturnBool("pb:", bPlayBottomTemperatureSound, iEEPROMPlayBottomTemperatureSound); 253 } 254 } 255} 256 257bool ParseSerialOfBoolIfMatchSetEEPROMAndReturnBool(String ip_strCommand, bool ip_bOriginalValue, int ip_iEEPROM_Location) 258{ 259 bool _bResult = ip_bOriginalValue; 260 if (strSerialInput.startsWith(ip_strCommand)) 261 { 262 strSerialInput = strSerialInput.substring(3); 263 _bResult = (strSerialInput == "1\ 264"); 265 EEPROM.write(ip_iEEPROM_Location, _bResult); 266 } 267 return _bResult; 268} 269 270void EEPROMWritelong(int address, long value) 271{ 272 byte by; 273 for(int i=0;i< 4;i++) { 274 by = (value >> ((3-i)*8)) & 0x000000ff; 275 EEPROM.write(address+i, by); 276 } 277} 278 279 280long EEPROMReadlong(long address) 281{ 282 long lo=0; 283 284 for(int i=0;i< 3;i++){ 285 lo += EEPROM.read(address+i); 286 lo = lo << 8; 287 } 288 lo += EEPROM.read(address+3); 289 return lo; 290} 291 292void PlayUp() 293{ 294 if (bPlayTopTemperatureSound && (millis() - lMilliSecondsSinceBeep > iMilliSecondsSinceBeepCount)) 295 { 296 tone(iPinBuzzer, 440, 100); 297 delay(100); 298 tone(iPinBuzzer, 880, 100); 299 delay(100); 300 tone(iPinBuzzer, 1760, 100); 301 lMilliSecondsSinceBeep = millis(); 302 } 303} 304 305void PlayDown() 306{ 307 if (bPlayBottomTemperatureSound && (millis() - lMilliSecondsSinceBeep > iMilliSecondsSinceBeepCount)) 308 { 309 tone(iPinBuzzer, 1760, 100); 310 delay(100); 311 tone(iPinBuzzer, 880, 100); 312 delay(100); 313 tone(iPinBuzzer, 440, 100); 314 lMilliSecondsSinceBeep = millis(); 315 } 316} 317 318
The configuration program made with c# and Visual Studio 2017 community edition
csharp
This program displays the settings of the coaster and makes it possible to change the settings. Here is an archive with the solution and the icons, c# etc
1inary file (no preview
The configuration program made with c# and Visual Studio 2017 community edition
csharp
This program displays the settings of the coaster and makes it possible to change the settings. Here is an archive with the solution and the icons, c# etc
1inary file (no preview
The sketch for the coaster
arduino
This program is loded into the coaster it is reading the temperature sensor and lighting the LEDs based on the given ranges.
1#include <EEPROM.h> 2 3#define AREF 3.3 // we tie 3.3V to ARef and measure it with a multimeter! 4 5//Vout TMP36 > A1 6//3.3V > V+ TMP36 > AREF 7//GND TMP36 > GND 8//D6 > Piezo > GND 9//D7 > Blue Led (+), Blue Led (-) > 60 Ohm > GND 10//D8 > Green Led (+), Green Led (-) > 560 Ohm > GND 11//D9 > Red Led (+), Red Led (-) > 640 Ohm > GND 12 13int iPinTemperature = 1; 14int iTemperatureReading; 15int iPinLedRed = 9; 16int iPinLedGreen = 8; 17int iPinLedBlue = 7; 18int iPinBuzzer = 6; 19String strSerialInput = ""; 20bool bSerialInputComplete = false; 21float fTopTemperature = 100; 22float fBottomTemperature = 0; 23int iEEPROMTopTemperature = 0; 24int iEEPROMBottomTemperature = 4; 25int iEEPROMDisplayCelcius = 8; 26int iEEPROMPlayTopTemperatureSound = 9; 27int iEEPROMPlayBottomTemperatureSound = 10; 28bool bPlayTopTemperatureSound = false; 29bool bPlayBottomTemperatureSound = false; 30bool bTempDisplaysCelcius = true; 31float fPreviousTemperature = 0; 32// Number of average temperatures in celcius 33#define AVGC 13 34#define POSCOUNT 10 35float fArrTemps[AVGC]; // Array used to calculate the average temperature 36float fArrTempsD[AVGC]; // Array used to calculate the average delta temperature 37int iLEDConfigCurrent = 0; // 1 = Red, 0 = Green, -1 = Blue 38int iLEDConfigPrevious = 0; // 1 = Red, 0 = Green, -1 = Blue 39bool bLEDsActive = false; 40bool bLEDsBlink = false; 41float fAverageTemp; 42float fAverageTempD; 43int iDeltaPositiveCount; 44bool bInitAverage = true; 45int iAvgIndex; 46long lMilliSecondsSinceBeep = -1; 47long iMilliSecondsSinceBeepCount = 50000; 48long iMilliSecondsSinceLastSwitchCount = 900000; 49long lMilliSecondsSinceLastSwitch = iMilliSecondsSinceLastSwitchCount; 50 51void setup(void) 52{ 53 // We'll send debugging information via the Serial monitor 54 Serial.begin(9600); 55 Serial.println("Setup"); 56 57 // If you want to set the aref to something other than 5v 58 analogReference(EXTERNAL); 59 pinMode(iPinLedRed, OUTPUT); 60 pinMode(iPinLedGreen, OUTPUT); 61 pinMode(iPinLedBlue, OUTPUT); 62 63 strSerialInput.reserve(20); 64 65 long lTop = EEPROMReadlong(iEEPROMTopTemperature); 66 if (lTop < 0 || lTop > 10000) 67 { 68 lTop = 4500; 69 } 70 long lBottom = EEPROMReadlong(iEEPROMBottomTemperature); 71 if (lBottom < 0 || lBottom > 10000) 72 { 73 lBottom = 3900; 74 } 75 76 if (lTop < lBottom) 77 { 78 lTop = 4500; 79 lBottom = 3900; 80 } 81 fTopTemperature = (float)lTop / (float)100; 82 fBottomTemperature = (float)lBottom / (float)100; 83 bTempDisplaysCelcius = EEPROM.read(iEEPROMDisplayCelcius) == 1; 84 85 bPlayTopTemperatureSound = EEPROM.read(iEEPROMPlayTopTemperatureSound) == 1; 86 bPlayBottomTemperatureSound = EEPROM.read(iEEPROMPlayBottomTemperatureSound) == 1; 87} 88 89 90void loop(void) 91{ 92 if (bSerialInputComplete) 93 { 94 Serial.println(strSerialInput); 95 strSerialInput = ""; 96 bSerialInputComplete = false; 97 } 98 99 iTemperatureReading = analogRead(iPinTemperature); 100 // Converting temperature voltage to temperature using AREF 101 float fTemperatureVoltage = iTemperatureReading * AREF; 102 fTemperatureVoltage /= 1024.0; 103 float fTemperatureC = (fTemperatureVoltage - 0.5) * 100 ; //converting from 10 mv per degree with 500 mV offset to degrees ((fTemperatureVoltage - 500mV) times 100 104 105 // Initialize average arrays etc 106 if (bInitAverage) 107 { 108 for (int j = 0; j < AVGC; j++) 109 { 110 fArrTemps[j] = fTemperatureC; 111 fArrTempsD[j] = (float)-0.01; 112 } 113 bInitAverage = false; 114 iAvgIndex = 0; 115 fAverageTemp = fTemperatureC; 116 fPreviousTemperature = fTemperatureC; 117 bLEDsActive = true; 118 lMilliSecondsSinceBeep = millis(); 119 iLEDConfigPrevious = -1; 120 } 121 122 // Point to next average in the arrays 123 iAvgIndex++; 124 if (iAvgIndex > AVGC - 1) 125 { 126 iAvgIndex = 0; 127 } 128 129 fArrTemps[iAvgIndex] = fTemperatureC; 130 131 // Calculate averages 132 fAverageTemp = 0; 133 int iPosCount = 0; 134 for (int j = 0; j < AVGC; j++) 135 { 136 if (fArrTempsD[j] > (float)0.0) 137 { 138 iPosCount++; 139 } 140 fAverageTemp += fArrTemps[j]; 141 fAverageTempD += fArrTempsD[j]; 142 } 143 144 fAverageTemp = fAverageTemp / (float)AVGC; 145 fAverageTempD = fAverageTempD / (float)AVGC; 146 147 Serial.print("[it:"); Serial.print(fTemperatureC);Serial.print(",tt:"); 148 Serial.print(fTopTemperature);Serial.print(",bt:"); 149 Serial.print(fBottomTemperature);Serial.print(",dc:"); 150 Serial.print(bTempDisplaysCelcius); 151 Serial.print(",at:");Serial.print(fAverageTemp); 152 Serial.print(",pt:");Serial.print(bPlayTopTemperatureSound); 153 Serial.print(",pb:");Serial.print(bPlayBottomTemperatureSound); 154 Serial.println("]"); 155 156 if (fAverageTemp >= fTopTemperature) 157 { 158 iLEDConfigCurrent = 1; // Red 159 } 160 if (fAverageTemp <= fBottomTemperature) 161 { 162 iLEDConfigCurrent = -1; // Blue 163 } 164 if (fAverageTemp > fBottomTemperature && fAverageTemp < fTopTemperature) 165 { 166 iLEDConfigCurrent = 0; // Green 167 } 168 169 if (iLEDConfigCurrent >= 0 || (iLEDConfigCurrent == -1 && fAverageTempD > 0 && iPosCount >= POSCOUNT)) 170 { 171 lMilliSecondsSinceLastSwitch = millis(); 172 } 173 174 bLEDsActive = ((millis() - lMilliSecondsSinceLastSwitch) < iMilliSecondsSinceLastSwitchCount); 175 176 if (iLEDConfigPrevious == 1 && iLEDConfigCurrent == 0) 177 { 178 PlayUp(); 179 } 180 181 if (iLEDConfigPrevious == 0 && iLEDConfigCurrent == -1) 182 { 183 PlayDown(); 184 } 185 186 if (!bLEDsActive || (fAverageTempD > 0 && iPosCount >= POSCOUNT && !bLEDsBlink)) 187 { 188 digitalWrite(iPinLedRed, LOW); 189 digitalWrite(iPinLedGreen, LOW); 190 digitalWrite(iPinLedBlue, LOW); 191 } 192 else 193 { 194 if (iLEDConfigCurrent == 1) 195 { 196 digitalWrite(iPinLedRed, HIGH); 197 digitalWrite(iPinLedGreen, LOW); 198 digitalWrite(iPinLedBlue, LOW); 199 } 200 if (iLEDConfigCurrent == 0) 201 { 202 digitalWrite(iPinLedRed, LOW); 203 digitalWrite(iPinLedGreen, HIGH); 204 digitalWrite(iPinLedBlue, LOW); 205 } 206 if (iLEDConfigCurrent == -1) 207 { 208 digitalWrite(iPinLedRed, LOW); 209 digitalWrite(iPinLedGreen, LOW); 210 digitalWrite(iPinLedBlue, HIGH); 211 } 212 } 213 214 fArrTempsD[iAvgIndex] = fAverageTemp - fPreviousTemperature; 215 fPreviousTemperature = fAverageTemp; 216 iLEDConfigPrevious = iLEDConfigCurrent; 217 bLEDsBlink = !bLEDsBlink; 218 delay(450); 219} 220 221void serialEvent() 222{ 223 while (Serial.available()) 224 { 225 // get the new byte: 226 char inChar = (char)Serial.read(); 227 // add it to the strSerialInput: 228 strSerialInput += inChar; 229 // if the incoming character is a newline, set a flag so the main loop can 230 // do something about it: 231 if (inChar == '\n') 232 { 233 bSerialInputComplete = true; 234 235 if (strSerialInput.startsWith("tt:")) 236 { 237 strSerialInput = strSerialInput.substring(3); 238 fTopTemperature = strSerialInput.toFloat(); 239 EEPROMWritelong(iEEPROMTopTemperature, (long)(fTopTemperature * (float)100)); 240 } 241 242 if (strSerialInput.startsWith("bt:")) 243 { 244 strSerialInput = strSerialInput.substring(3); 245 fBottomTemperature = strSerialInput.toFloat(); 246 EEPROMWritelong(iEEPROMBottomTemperature, (long)(fBottomTemperature * (float)100)); 247 } 248 249 bTempDisplaysCelcius = ParseSerialOfBoolIfMatchSetEEPROMAndReturnBool("dc:", bTempDisplaysCelcius, iEEPROMDisplayCelcius); 250 bPlayTopTemperatureSound = ParseSerialOfBoolIfMatchSetEEPROMAndReturnBool("pt:", bPlayTopTemperatureSound, iEEPROMPlayTopTemperatureSound); 251 bPlayBottomTemperatureSound = ParseSerialOfBoolIfMatchSetEEPROMAndReturnBool("pb:", bPlayBottomTemperatureSound, iEEPROMPlayBottomTemperatureSound); 252 } 253 } 254} 255 256bool ParseSerialOfBoolIfMatchSetEEPROMAndReturnBool(String ip_strCommand, bool ip_bOriginalValue, int ip_iEEPROM_Location) 257{ 258 bool _bResult = ip_bOriginalValue; 259 if (strSerialInput.startsWith(ip_strCommand)) 260 { 261 strSerialInput = strSerialInput.substring(3); 262 _bResult = (strSerialInput == "1\ 263"); 264 EEPROM.write(ip_iEEPROM_Location, _bResult); 265 } 266 return _bResult; 267} 268 269void EEPROMWritelong(int address, long value) 270{ 271 byte by; 272 for(int i=0;i< 4;i++) { 273 by = (value >> ((3-i)*8)) & 0x000000ff; 274 EEPROM.write(address+i, by); 275 } 276} 277 278 279long EEPROMReadlong(long address) 280{ 281 long lo=0; 282 283 for(int i=0;i< 3;i++){ 284 lo += EEPROM.read(address+i); 285 lo = lo << 8; 286 } 287 lo += EEPROM.read(address+3); 288 return lo; 289} 290 291void PlayUp() 292{ 293 if (bPlayTopTemperatureSound && (millis() - lMilliSecondsSinceBeep > iMilliSecondsSinceBeepCount)) 294 { 295 tone(iPinBuzzer, 440, 100); 296 delay(100); 297 tone(iPinBuzzer, 880, 100); 298 delay(100); 299 tone(iPinBuzzer, 1760, 100); 300 lMilliSecondsSinceBeep = millis(); 301 } 302} 303 304void PlayDown() 305{ 306 if (bPlayBottomTemperatureSound && (millis() - lMilliSecondsSinceBeep > iMilliSecondsSinceBeepCount)) 307 { 308 tone(iPinBuzzer, 1760, 100); 309 delay(100); 310 tone(iPinBuzzer, 880, 100); 311 delay(100); 312 tone(iPinBuzzer, 440, 100); 313 lMilliSecondsSinceBeep = millis(); 314 } 315} 316 317
Downloadable files
Circuit Diagram
Diagram of the circuit
Circuit Diagram
Bread Board Layout
Before putting together you can try on a breadboard
Bread Board Layout
Circuit Diagram
Diagram of the circuit
Circuit Diagram
Bread Board Layout
Before putting together you can try on a breadboard
Bread Board Layout
Documentation
STL of the holder of the thermometer
Run this file through your slicer to produce gcode to be printed with your 3d printer
STL of the holder of the thermometer
STL of the bottom of the coaster
Run this file through your slicer to produce gcode to be printed with your 3d printer
STL of the bottom of the coaster
STL of top of the coaster
Run this file through your slicer to produce gcode to be printed with your 3d printer
STL of top of the coaster
STL of the bottom of the coaster
Run this file through your slicer to produce gcode to be printed with your 3d printer
STL of the bottom of the coaster
STL of the holder of the thermometer
Run this file through your slicer to produce gcode to be printed with your 3d printer
STL of the holder of the thermometer
Comments
Only logged in users can leave comments