├── Binary ├── bbMonitor.ino.bin ├── bbMonitor.ino.bootloader.bin ├── bbMonitor.ino.partitions.bin ├── boot_app0.bin └── upload.bat ├── CAD ├── bbMonitor_Back_2mm.dxf ├── bbMonitor_Bot_2mm.dxf ├── bbMonitor_Front_2mm.dxf ├── bbMonitor_Holder_L_3mm.dxf └── bbMonitor_Holder_R_3mm.dxf ├── IMG └── bbMonitor.jpg ├── PCB ├── Gerber_PCB1_Board.zip ├── Gerber_PCB2_LED.zip ├── SCH_Schematic1_Board.pdf └── SCH_Schematic2_LED.pdf ├── README.md ├── README_EN.md ├── Test └── FunctionTest.py └── bbMonitor.ino /Binary/bbMonitor.ino.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RealCorebb/bbMonitor/0dd7b7945d7f808087aa2997a5806a2289f9bd2c/Binary/bbMonitor.ino.bin -------------------------------------------------------------------------------- /Binary/bbMonitor.ino.bootloader.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RealCorebb/bbMonitor/0dd7b7945d7f808087aa2997a5806a2289f9bd2c/Binary/bbMonitor.ino.bootloader.bin -------------------------------------------------------------------------------- /Binary/bbMonitor.ino.partitions.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RealCorebb/bbMonitor/0dd7b7945d7f808087aa2997a5806a2289f9bd2c/Binary/bbMonitor.ino.partitions.bin -------------------------------------------------------------------------------- /Binary/boot_app0.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RealCorebb/bbMonitor/0dd7b7945d7f808087aa2997a5806a2289f9bd2c/Binary/boot_app0.bin -------------------------------------------------------------------------------- /Binary/upload.bat: -------------------------------------------------------------------------------- 1 | "C:\Users\coreb\AppData\Local\Arduino15\packages\esp32\tools\esptool_py\4.5.1/esptool.exe" --chip esp32s3 --port "COM14" --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size 4MB 0x0 "bbMonitor.ino.bootloader.bin" 0x8000 "bbMonitor.ino.partitions.bin" 0xe000 "boot_app0.bin" 0x10000 "bbMonitor.ino.bin" -------------------------------------------------------------------------------- /CAD/bbMonitor_Back_2mm.dxf: -------------------------------------------------------------------------------- 1 | 0 2 | SECTION 3 | 2 4 | HEADER 5 | 9 6 | $INSUNITS 7 | 70 8 | 4 9 | 9 10 | $ACADVER 11 | 1 12 | AC1014 13 | 9 14 | $HANDSEED 15 | 5 16 | FFFF 17 | 0 18 | ENDSEC 19 | 0 20 | SECTION 21 | 2 22 | TABLES 23 | 0 24 | TABLE 25 | 2 26 | VPORT 27 | 5 28 | 8 29 | 100 30 | AcDbSymbolTable 31 | 0 32 | ENDTAB 33 | 0 34 | TABLE 35 | 2 36 | LTYPE 37 | 5 38 | 5 39 | 100 40 | AcDbSymbolTable 41 | 0 42 | LTYPE 43 | 5 44 | 14 45 | 100 46 | AcDbSymbolTableRecord 47 | 100 48 | AcDbLinetypeTableRecord 49 | 2 50 | BYBLOCK 51 | 70 52 | 0 53 | 0 54 | LTYPE 55 | 5 56 | 15 57 | 100 58 | AcDbSymbolTableRecord 59 | 100 60 | AcDbLinetypeTableRecord 61 | 2 62 | BYLAYER 63 | 70 64 | 0 65 | 0 66 | ENDTAB 67 | 0 68 | TABLE 69 | 2 70 | LAYER 71 | 5 72 | 2 73 | 100 74 | AcDbSymbolTable 75 | 70 76 | 2 77 | 0 78 | LAYER 79 | 5 80 | 50 81 | 100 82 | AcDbSymbolTableRecord 83 | 100 84 | AcDbLayerTableRecord 85 | 2 86 | 0 87 | 70 88 | 0 89 | 6 90 | CONTINUOUS 91 | 0 92 | ENDTAB 93 | 0 94 | TABLE 95 | 2 96 | STYLE 97 | 5 98 | 3 99 | 100 100 | AcDbSymbolTable 101 | 70 102 | 1 103 | 0 104 | STYLE 105 | 5 106 | 11 107 | 100 108 | AcDbSymbolTableRecord 109 | 100 110 | AcDbTextStyleTableRecord 111 | 2 112 | STANDARD 113 | 70 114 | 0 115 | 0 116 | ENDTAB 117 | 0 118 | TABLE 119 | 2 120 | VIEW 121 | 5 122 | 6 123 | 100 124 | AcDbSymbolTable 125 | 70 126 | 0 127 | 0 128 | ENDTAB 129 | 0 130 | TABLE 131 | 2 132 | UCS 133 | 5 134 | 7 135 | 100 136 | AcDbSymbolTable 137 | 70 138 | 0 139 | 0 140 | ENDTAB 141 | 0 142 | TABLE 143 | 2 144 | APPID 145 | 5 146 | 9 147 | 100 148 | AcDbSymbolTable 149 | 70 150 | 2 151 | 0 152 | APPID 153 | 5 154 | 12 155 | 100 156 | AcDbSymbolTableRecord 157 | 100 158 | AcDbRegAppTableRecord 159 | 2 160 | ACAD 161 | 70 162 | 0 163 | 0 164 | ENDTAB 165 | 0 166 | TABLE 167 | 2 168 | DIMSTYLE 169 | 5 170 | A 171 | 100 172 | AcDbSymbolTable 173 | 70 174 | 1 175 | 0 176 | ENDTAB 177 | 0 178 | TABLE 179 | 2 180 | BLOCK_RECORD 181 | 5 182 | 1 183 | 100 184 | AcDbSymbolTable 185 | 70 186 | 1 187 | 0 188 | BLOCK_RECORD 189 | 5 190 | 1F 191 | 100 192 | AcDbSymbolTableRecord 193 | 100 194 | AcDbBlockTableRecord 195 | 2 196 | *MODEL_SPACE 197 | 0 198 | BLOCK_RECORD 199 | 5 200 | 1B 201 | 100 202 | AcDbSymbolTableRecord 203 | 100 204 | AcDbBlockTableRecord 205 | 2 206 | *PAPER_SPACE 207 | 0 208 | ENDTAB 209 | 0 210 | ENDSEC 211 | 0 212 | SECTION 213 | 2 214 | BLOCKS 215 | 0 216 | BLOCK 217 | 5 218 | 20 219 | 100 220 | AcDbEntity 221 | 100 222 | AcDbBlockBegin 223 | 2 224 | *MODEL_SPACE 225 | 0 226 | ENDBLK 227 | 5 228 | 21 229 | 100 230 | AcDbEntity 231 | 100 232 | AcDbBlockEnd 233 | 0 234 | BLOCK 235 | 5 236 | 1C 237 | 100 238 | AcDbEntity 239 | 100 240 | AcDbBlockBegin 241 | 2 242 | *PAPER_SPACE 243 | 0 244 | ENDBLK 245 | 5 246 | 1D 247 | 100 248 | AcDbEntity 249 | 100 250 | AcDbBlockEnd 251 | 0 252 | ENDSEC 253 | 0 254 | SECTION 255 | 2 256 | ENTITIES 257 | 0 258 | LWPOLYLINE 259 | 5 260 | 100 261 | 100 262 | AcDbEntity 263 | 8 264 | 0 265 | 100 266 | AcDbPolyline 267 | 90 268 | 13 269 | 70 270 | 1 271 | 43 272 | 0.0 273 | 10 274 | -184.49999999999994 275 | 20 276 | -9.5027626614691982 277 | 10 278 | -184.50000000000003 279 | 20 280 | -15.502762661469207 281 | 10 282 | -2.9999999999999716 283 | 20 284 | -15.5027626614692 285 | 10 286 | -2.9999999999999649 287 | 20 288 | -9.5027626614691965 289 | 10 290 | 3.5527136788005009e-14 291 | 20 292 | -9.5027626614691982 293 | 10 294 | 3.5527136788005009e-14 295 | 20 296 | 74.578237338530784 297 | 10 298 | -2.9999999999999649 299 | 20 300 | 74.578237338530769 301 | 10 302 | -2.9999999999999649 303 | 20 304 | 80.578237338530769 305 | 10 306 | -184.49999999999994 307 | 20 308 | 80.578237338530784 309 | 10 310 | -184.49999999999994 311 | 20 312 | 74.578237338530769 313 | 10 314 | -184.5000028014183 315 | 20 316 | 74.578001236796368 317 | 10 318 | -187.49999999999997 319 | 20 320 | 74.578001236796354 321 | 10 322 | -187.49999999999997 323 | 20 324 | -9.502762661469184 325 | 0 326 | ELLIPSE 327 | 5 328 | 101 329 | 100 330 | AcDbEntity 331 | 8 332 | 0 333 | 100 334 | AcDbEllipse 335 | 10 336 | -97.5 337 | 20 338 | -8.0652220526415999 339 | 30 340 | 0 341 | 11 342 | 3.3029134982598407e-13 343 | 21 344 | -1.0003966118435457 345 | 31 346 | 0.0 347 | 40 348 | 0.99960354539504648 349 | 41 350 | 4.7123889803843682 351 | 42 352 | 6.2831853071792594 353 | 0 354 | LINE 355 | 5 356 | 102 357 | 100 358 | AcDbEntity 359 | 8 360 | 0 361 | 100 362 | AcDbLine 363 | 10 364 | -98.5 365 | 20 366 | -8.065222052641607 367 | 30 368 | -8.9819523497849832e-30 369 | 11 370 | -98.499999999999972 371 | 21 372 | -6.8647461184293457 373 | 31 374 | 3.4694469519536142e-17 375 | 0 376 | ELLIPSE 377 | 5 378 | 103 379 | 100 380 | AcDbEntity 381 | 8 382 | 0 383 | 100 384 | AcDbEllipse 385 | 10 386 | -97.5 387 | 20 388 | -6.8647461184293492 389 | 30 390 | 8.8817841970012523e-15 391 | 11 392 | 3.3029134982598407e-13 393 | 21 394 | 1.0003966118435457 395 | 31 396 | 0.0 397 | 40 398 | 0.99960354539504648 399 | 41 400 | 3.1263880373444353e-13 401 | 42 402 | 1.5707963267952225 403 | 0 404 | LINE 405 | 5 406 | 104 407 | 100 408 | AcDbEntity 409 | 8 410 | 0 411 | 100 412 | AcDbLine 413 | 10 414 | -97.499999999999986 415 | 20 416 | -5.8643495065858033 417 | 30 418 | 8.8540176131956099e-15 419 | 11 420 | -90.5 421 | 21 422 | -5.8643495065858016 423 | 31 424 | 8.8817841970012523e-15 425 | 0 426 | ELLIPSE 427 | 5 428 | 105 429 | 100 430 | AcDbEntity 431 | 8 432 | 0 433 | 100 434 | AcDbEllipse 435 | 10 436 | -90.5 437 | 20 438 | -6.8647461184293492 439 | 30 440 | 8.8817841970012523e-15 441 | 11 442 | -3.3029134982598407e-13 443 | 21 444 | 1.0003966118435457 445 | 31 446 | 0.0 447 | 40 448 | 0.99960354539504648 449 | 41 450 | 4.7123889803843673 451 | 42 452 | 6.2831853071792594 453 | 0 454 | LINE 455 | 5 456 | 106 457 | 100 458 | AcDbEntity 459 | 8 460 | 0 461 | 100 462 | AcDbLine 463 | 10 464 | -89.500000000000014 465 | 20 466 | -6.8647461184293421 467 | 30 468 | 8.8817841970012618e-15 469 | 11 470 | -89.5 471 | 21 472 | -8.0652220526416034 473 | 31 474 | 8.8470897274817162e-15 475 | 0 476 | ELLIPSE 477 | 5 478 | 107 479 | 100 480 | AcDbEntity 481 | 8 482 | 0 483 | 100 484 | AcDbEllipse 485 | 10 486 | -90.5 487 | 20 488 | -8.0652220526415999 489 | 30 490 | 0 491 | 11 492 | -3.3029134982598407e-13 493 | 21 494 | -1.0003966118435457 495 | 31 496 | 0.0 497 | 40 498 | 0.99960354539504648 499 | 41 500 | 2.9842794901924157e-13 501 | 42 502 | 1.5707963267952216 503 | 0 504 | LINE 505 | 5 506 | 108 507 | 100 508 | AcDbEntity 509 | 8 510 | 0 511 | 100 512 | AcDbLine 513 | 10 514 | -90.500000000000028 515 | 20 516 | -9.0656186644851449 517 | 30 518 | 2.7766583805642499e-17 519 | 11 520 | -97.499999999999986 521 | 21 522 | -9.0656186644851449 523 | 31 524 | 2.7766583805642499e-17 525 | 0 526 | ENDSEC 527 | 0 528 | SECTION 529 | 2 530 | OBJECTS 531 | 0 532 | DICTIONARY 533 | 5 534 | C 535 | 100 536 | AcDbDictionary 537 | 3 538 | ACAD_GROUP 539 | 350 540 | D 541 | 3 542 | ACAD_MLINESTYLE 543 | 350 544 | 17 545 | 0 546 | DICTIONARY 547 | 5 548 | D 549 | 100 550 | AcDbDictionary 551 | 0 552 | DICTIONARY 553 | 5 554 | 1A 555 | 330 556 | C 557 | 100 558 | AcDbDictionary 559 | 0 560 | DICTIONARY 561 | 5 562 | 17 563 | 100 564 | AcDbDictionary 565 | 0 566 | ENDSEC 567 | 0 568 | EOF 569 | -------------------------------------------------------------------------------- /CAD/bbMonitor_Bot_2mm.dxf: -------------------------------------------------------------------------------- 1 | 0 2 | SECTION 3 | 2 4 | HEADER 5 | 9 6 | $INSUNITS 7 | 70 8 | 4 9 | 9 10 | $ACADVER 11 | 1 12 | AC1014 13 | 9 14 | $HANDSEED 15 | 5 16 | FFFF 17 | 0 18 | ENDSEC 19 | 0 20 | SECTION 21 | 2 22 | TABLES 23 | 0 24 | TABLE 25 | 2 26 | VPORT 27 | 5 28 | 8 29 | 100 30 | AcDbSymbolTable 31 | 0 32 | ENDTAB 33 | 0 34 | TABLE 35 | 2 36 | LTYPE 37 | 5 38 | 5 39 | 100 40 | AcDbSymbolTable 41 | 0 42 | LTYPE 43 | 5 44 | 14 45 | 100 46 | AcDbSymbolTableRecord 47 | 100 48 | AcDbLinetypeTableRecord 49 | 2 50 | BYBLOCK 51 | 70 52 | 0 53 | 0 54 | LTYPE 55 | 5 56 | 15 57 | 100 58 | AcDbSymbolTableRecord 59 | 100 60 | AcDbLinetypeTableRecord 61 | 2 62 | BYLAYER 63 | 70 64 | 0 65 | 0 66 | ENDTAB 67 | 0 68 | TABLE 69 | 2 70 | LAYER 71 | 5 72 | 2 73 | 100 74 | AcDbSymbolTable 75 | 70 76 | 2 77 | 0 78 | LAYER 79 | 5 80 | 50 81 | 100 82 | AcDbSymbolTableRecord 83 | 100 84 | AcDbLayerTableRecord 85 | 2 86 | 0 87 | 70 88 | 0 89 | 6 90 | CONTINUOUS 91 | 0 92 | ENDTAB 93 | 0 94 | TABLE 95 | 2 96 | STYLE 97 | 5 98 | 3 99 | 100 100 | AcDbSymbolTable 101 | 70 102 | 1 103 | 0 104 | STYLE 105 | 5 106 | 11 107 | 100 108 | AcDbSymbolTableRecord 109 | 100 110 | AcDbTextStyleTableRecord 111 | 2 112 | STANDARD 113 | 70 114 | 0 115 | 0 116 | ENDTAB 117 | 0 118 | TABLE 119 | 2 120 | VIEW 121 | 5 122 | 6 123 | 100 124 | AcDbSymbolTable 125 | 70 126 | 0 127 | 0 128 | ENDTAB 129 | 0 130 | TABLE 131 | 2 132 | UCS 133 | 5 134 | 7 135 | 100 136 | AcDbSymbolTable 137 | 70 138 | 0 139 | 0 140 | ENDTAB 141 | 0 142 | TABLE 143 | 2 144 | APPID 145 | 5 146 | 9 147 | 100 148 | AcDbSymbolTable 149 | 70 150 | 2 151 | 0 152 | APPID 153 | 5 154 | 12 155 | 100 156 | AcDbSymbolTableRecord 157 | 100 158 | AcDbRegAppTableRecord 159 | 2 160 | ACAD 161 | 70 162 | 0 163 | 0 164 | ENDTAB 165 | 0 166 | TABLE 167 | 2 168 | DIMSTYLE 169 | 5 170 | A 171 | 100 172 | AcDbSymbolTable 173 | 70 174 | 1 175 | 0 176 | ENDTAB 177 | 0 178 | TABLE 179 | 2 180 | BLOCK_RECORD 181 | 5 182 | 1 183 | 100 184 | AcDbSymbolTable 185 | 70 186 | 1 187 | 0 188 | BLOCK_RECORD 189 | 5 190 | 1F 191 | 100 192 | AcDbSymbolTableRecord 193 | 100 194 | AcDbBlockTableRecord 195 | 2 196 | *MODEL_SPACE 197 | 0 198 | BLOCK_RECORD 199 | 5 200 | 1B 201 | 100 202 | AcDbSymbolTableRecord 203 | 100 204 | AcDbBlockTableRecord 205 | 2 206 | *PAPER_SPACE 207 | 0 208 | ENDTAB 209 | 0 210 | ENDSEC 211 | 0 212 | SECTION 213 | 2 214 | BLOCKS 215 | 0 216 | BLOCK 217 | 5 218 | 20 219 | 100 220 | AcDbEntity 221 | 100 222 | AcDbBlockBegin 223 | 2 224 | *MODEL_SPACE 225 | 0 226 | ENDBLK 227 | 5 228 | 21 229 | 100 230 | AcDbEntity 231 | 100 232 | AcDbBlockEnd 233 | 0 234 | BLOCK 235 | 5 236 | 1C 237 | 100 238 | AcDbEntity 239 | 100 240 | AcDbBlockBegin 241 | 2 242 | *PAPER_SPACE 243 | 0 244 | ENDBLK 245 | 5 246 | 1D 247 | 100 248 | AcDbEntity 249 | 100 250 | AcDbBlockEnd 251 | 0 252 | ENDSEC 253 | 0 254 | SECTION 255 | 2 256 | ENTITIES 257 | 0 258 | LWPOLYLINE 259 | 5 260 | 100 261 | 100 262 | AcDbEntity 263 | 8 264 | 0 265 | 100 266 | AcDbPolyline 267 | 90 268 | 12 269 | 70 270 | 1 271 | 43 272 | 0.0 273 | 10 274 | -187.49999999999997 275 | 20 276 | 41.047344169333272 277 | 10 278 | -187.49999999999997 279 | 20 280 | 29.047344169333272 281 | 10 282 | -184.49999999999994 283 | 20 284 | 29.047344169333272 285 | 10 286 | -184.49999999999994 287 | 20 288 | 11.797344169333265 289 | 10 290 | -2.9999999999999716 291 | 20 292 | 11.797344169333265 293 | 10 294 | -3.0000000000000004 295 | 20 296 | 29.047344169333265 297 | 10 298 | 0 299 | 20 300 | 29.047344169333265 301 | 10 302 | 0 303 | 20 304 | 41.047344169333265 305 | 10 306 | -3.0000000000000004 307 | 20 308 | 41.047344169333265 309 | 10 310 | -2.9999999999999716 311 | 20 312 | 58.297344169333272 313 | 10 314 | -184.49999999999994 315 | 20 316 | 58.297344169333272 317 | 10 318 | -184.49999999999994 319 | 20 320 | 41.047344169333272 321 | 0 322 | ENDSEC 323 | 0 324 | SECTION 325 | 2 326 | OBJECTS 327 | 0 328 | DICTIONARY 329 | 5 330 | C 331 | 100 332 | AcDbDictionary 333 | 3 334 | ACAD_GROUP 335 | 350 336 | D 337 | 3 338 | ACAD_MLINESTYLE 339 | 350 340 | 17 341 | 0 342 | DICTIONARY 343 | 5 344 | D 345 | 100 346 | AcDbDictionary 347 | 0 348 | DICTIONARY 349 | 5 350 | 1A 351 | 330 352 | C 353 | 100 354 | AcDbDictionary 355 | 0 356 | DICTIONARY 357 | 5 358 | 17 359 | 100 360 | AcDbDictionary 361 | 0 362 | ENDSEC 363 | 0 364 | EOF 365 | -------------------------------------------------------------------------------- /CAD/bbMonitor_Front_2mm.dxf: -------------------------------------------------------------------------------- 1 | 0 2 | SECTION 3 | 2 4 | HEADER 5 | 9 6 | $INSUNITS 7 | 70 8 | 4 9 | 9 10 | $ACADVER 11 | 1 12 | AC1014 13 | 9 14 | $HANDSEED 15 | 5 16 | FFFF 17 | 0 18 | ENDSEC 19 | 0 20 | SECTION 21 | 2 22 | TABLES 23 | 0 24 | TABLE 25 | 2 26 | VPORT 27 | 5 28 | 8 29 | 100 30 | AcDbSymbolTable 31 | 0 32 | ENDTAB 33 | 0 34 | TABLE 35 | 2 36 | LTYPE 37 | 5 38 | 5 39 | 100 40 | AcDbSymbolTable 41 | 0 42 | LTYPE 43 | 5 44 | 14 45 | 100 46 | AcDbSymbolTableRecord 47 | 100 48 | AcDbLinetypeTableRecord 49 | 2 50 | BYBLOCK 51 | 70 52 | 0 53 | 0 54 | LTYPE 55 | 5 56 | 15 57 | 100 58 | AcDbSymbolTableRecord 59 | 100 60 | AcDbLinetypeTableRecord 61 | 2 62 | BYLAYER 63 | 70 64 | 0 65 | 0 66 | ENDTAB 67 | 0 68 | TABLE 69 | 2 70 | LAYER 71 | 5 72 | 2 73 | 100 74 | AcDbSymbolTable 75 | 70 76 | 2 77 | 0 78 | LAYER 79 | 5 80 | 50 81 | 100 82 | AcDbSymbolTableRecord 83 | 100 84 | AcDbLayerTableRecord 85 | 2 86 | 0 87 | 70 88 | 0 89 | 6 90 | CONTINUOUS 91 | 0 92 | ENDTAB 93 | 0 94 | TABLE 95 | 2 96 | STYLE 97 | 5 98 | 3 99 | 100 100 | AcDbSymbolTable 101 | 70 102 | 1 103 | 0 104 | STYLE 105 | 5 106 | 11 107 | 100 108 | AcDbSymbolTableRecord 109 | 100 110 | AcDbTextStyleTableRecord 111 | 2 112 | STANDARD 113 | 70 114 | 0 115 | 0 116 | ENDTAB 117 | 0 118 | TABLE 119 | 2 120 | VIEW 121 | 5 122 | 6 123 | 100 124 | AcDbSymbolTable 125 | 70 126 | 0 127 | 0 128 | ENDTAB 129 | 0 130 | TABLE 131 | 2 132 | UCS 133 | 5 134 | 7 135 | 100 136 | AcDbSymbolTable 137 | 70 138 | 0 139 | 0 140 | ENDTAB 141 | 0 142 | TABLE 143 | 2 144 | APPID 145 | 5 146 | 9 147 | 100 148 | AcDbSymbolTable 149 | 70 150 | 2 151 | 0 152 | APPID 153 | 5 154 | 12 155 | 100 156 | AcDbSymbolTableRecord 157 | 100 158 | AcDbRegAppTableRecord 159 | 2 160 | ACAD 161 | 70 162 | 0 163 | 0 164 | ENDTAB 165 | 0 166 | TABLE 167 | 2 168 | DIMSTYLE 169 | 5 170 | A 171 | 100 172 | AcDbSymbolTable 173 | 70 174 | 1 175 | 0 176 | ENDTAB 177 | 0 178 | TABLE 179 | 2 180 | BLOCK_RECORD 181 | 5 182 | 1 183 | 100 184 | AcDbSymbolTable 185 | 70 186 | 1 187 | 0 188 | BLOCK_RECORD 189 | 5 190 | 1F 191 | 100 192 | AcDbSymbolTableRecord 193 | 100 194 | AcDbBlockTableRecord 195 | 2 196 | *MODEL_SPACE 197 | 0 198 | BLOCK_RECORD 199 | 5 200 | 1B 201 | 100 202 | AcDbSymbolTableRecord 203 | 100 204 | AcDbBlockTableRecord 205 | 2 206 | *PAPER_SPACE 207 | 0 208 | ENDTAB 209 | 0 210 | ENDSEC 211 | 0 212 | SECTION 213 | 2 214 | BLOCKS 215 | 0 216 | BLOCK 217 | 5 218 | 20 219 | 100 220 | AcDbEntity 221 | 100 222 | AcDbBlockBegin 223 | 2 224 | *MODEL_SPACE 225 | 0 226 | ENDBLK 227 | 5 228 | 21 229 | 100 230 | AcDbEntity 231 | 100 232 | AcDbBlockEnd 233 | 0 234 | BLOCK 235 | 5 236 | 1C 237 | 100 238 | AcDbEntity 239 | 100 240 | AcDbBlockBegin 241 | 2 242 | *PAPER_SPACE 243 | 0 244 | ENDBLK 245 | 5 246 | 1D 247 | 100 248 | AcDbEntity 249 | 100 250 | AcDbBlockEnd 251 | 0 252 | ENDSEC 253 | 0 254 | SECTION 255 | 2 256 | ENTITIES 257 | 0 258 | LWPOLYLINE 259 | 5 260 | 100 261 | 100 262 | AcDbEntity 263 | 8 264 | 0 265 | 100 266 | AcDbPolyline 267 | 90 268 | 20 269 | 70 270 | 1 271 | 43 272 | 0.0 273 | 10 274 | 3.000000044703484 275 | 20 276 | 1.8840402866513384 277 | 10 278 | 90.750000044703469 279 | 20 280 | 1.8840402866513393 281 | 10 282 | 90.750000044703469 283 | 20 284 | 2.1840403313548178 285 | 42 286 | -0.41421356237309437 287 | 10 288 | 91.250000044703484 289 | 20 290 | 2.6840403313548173 291 | 10 292 | 96.250000044703484 293 | 20 294 | 2.684040331354824 295 | 42 296 | -0.41421356237309459 297 | 10 298 | 96.750000044703484 299 | 20 300 | 2.1840403313548178 301 | 10 302 | 96.750000044703484 303 | 20 304 | 1.8840402866513388 305 | 10 306 | 184.50000278651714 307 | 20 308 | 1.8840402866513404 309 | 10 310 | 184.50000278651714 311 | 20 312 | 3.3289449972783034 313 | 10 314 | 184.49999999999994 315 | 20 316 | 6.6839999552965068 317 | 10 318 | 184.50000004470348 319 | 20 320 | 6.6840402866513422 321 | 10 322 | 187.49999999999997 323 | 20 324 | 6.6840402866513422 325 | 10 326 | 187.49999999999997 327 | 20 328 | 93.684040286651395 329 | 10 330 | 184.50000004470348 331 | 20 332 | 93.684040286651395 333 | 10 334 | 184.49999999999994 335 | 20 336 | 99.684040286651367 337 | 10 338 | 3.0000000447034836 339 | 20 340 | 99.684040286651395 341 | 10 342 | 3.0000000447034836 343 | 20 344 | 93.684040286651395 345 | 10 346 | 4.4703483137453759e-08 347 | 20 348 | 93.684040286651395 349 | 10 350 | 4.4703483137453759e-08 351 | 20 352 | 6.6840402866513493 353 | 10 354 | 3.0000000447034836 355 | 20 356 | 6.6840402866513422 357 | 0 358 | LWPOLYLINE 359 | 5 360 | 101 361 | 100 362 | AcDbEntity 363 | 8 364 | 0 365 | 100 366 | AcDbPolyline 367 | 90 368 | 8 369 | 70 370 | 1 371 | 43 372 | 0.0 373 | 10 374 | 96.250000044703484 375 | 20 376 | 51.184040331354872 377 | 10 378 | 96.250000044703484 379 | 20 380 | 49.184040331354865 381 | 42 382 | -0.41421356237309503 383 | 10 384 | 95.750000044703469 385 | 20 386 | 48.684040331354865 387 | 10 388 | 91.750000044703484 389 | 20 390 | 48.684040331354851 391 | 42 392 | -0.41421356237309503 393 | 10 394 | 91.250000044703484 395 | 20 396 | 49.184040331354865 397 | 10 398 | 91.250000044703484 399 | 20 400 | 51.184040331354872 401 | 42 402 | -0.41421356237309503 403 | 10 404 | 91.750000044703484 405 | 20 406 | 51.684040331354872 407 | 10 408 | 95.750000044703469 409 | 20 410 | 51.684040331354879 411 | 42 412 | -0.41421356237309503 413 | 0 414 | CIRCLE 415 | 5 416 | 102 417 | 100 418 | AcDbEntity 419 | 8 420 | 0 421 | 100 422 | AcDbCircle 423 | 10 424 | 146.00000011920929 425 | 20 426 | 57.384040405860652 427 | 30 428 | 2.203098814490545e-15 429 | 40 430 | 1.6999999999999997 431 | 210 432 | 0 433 | 220 434 | -5.5511151231257827e-17 435 | 230 436 | 1 437 | 0 438 | CIRCLE 439 | 5 440 | 103 441 | 100 442 | AcDbEntity 443 | 8 444 | 0 445 | 100 446 | AcDbCircle 447 | 10 448 | 133.50000064074996 449 | 20 450 | 9.3840404058606293 451 | 30 452 | 5.377642775528102e-16 453 | 40 454 | 1.6999999999999997 455 | 210 456 | 0 457 | 220 458 | -5.5511151231257827e-17 459 | 230 460 | 1 461 | 0 462 | CIRCLE 463 | 5 464 | 104 465 | 100 466 | AcDbEntity 467 | 8 468 | 0 469 | 100 470 | AcDbCircle 471 | 10 472 | 116.75000004470348 473 | 20 474 | 74.184040331354851 475 | 30 476 | -1.7347234759768071e-17 477 | 40 478 | 19.000000000000011 479 | 210 480 | 0 481 | 220 482 | -1.1102230246251564e-16 483 | 230 484 | 1 485 | 0 486 | CIRCLE 487 | 5 488 | 105 489 | 100 490 | AcDbEntity 491 | 8 492 | 0 493 | 100 494 | AcDbCircle 495 | 10 496 | 54.00000011920929 497 | 20 498 | 57.384040405860652 499 | 30 500 | 2.203098814490545e-15 501 | 40 502 | 1.6999999999999997 503 | 210 504 | 0 505 | 220 506 | -5.5511151231257827e-17 507 | 230 508 | 1 509 | 0 510 | CIRCLE 511 | 5 512 | 106 513 | 100 514 | AcDbEntity 515 | 8 516 | 0 517 | 100 518 | AcDbCircle 519 | 10 520 | 41.500000640749938 521 | 20 522 | 9.3840404058606293 523 | 30 524 | 5.377642775528102e-16 525 | 40 526 | 1.6999999999999997 527 | 210 528 | 0 529 | 220 530 | -5.5511151231257827e-17 531 | 230 532 | 1 533 | 0 534 | CIRCLE 535 | 5 536 | 107 537 | 100 538 | AcDbEntity 539 | 8 540 | 0 541 | 100 542 | AcDbCircle 543 | 10 544 | 41.500000640749938 545 | 20 546 | 57.384040405860652 547 | 30 548 | 2.203098814490545e-15 549 | 40 550 | 1.6999999999999997 551 | 210 552 | 0 553 | 220 554 | -5.5511151231257827e-17 555 | 230 556 | 1 557 | 0 558 | CIRCLE 559 | 5 560 | 108 561 | 100 562 | AcDbEntity 563 | 8 564 | 0 565 | 100 566 | AcDbCircle 567 | 10 568 | 8.0000001192092878 569 | 20 570 | 57.384040405860652 571 | 30 572 | 2.203098814490545e-15 573 | 40 574 | 1.6999999999999997 575 | 210 576 | 0 577 | 220 578 | -5.5511151231257827e-17 579 | 230 580 | 1 581 | 0 582 | CIRCLE 583 | 5 584 | 109 585 | 100 586 | AcDbEntity 587 | 8 588 | 0 589 | 100 590 | AcDbCircle 591 | 10 592 | 54.00000011920929 593 | 20 594 | 9.3840404058606293 595 | 30 596 | 5.377642775528102e-16 597 | 40 598 | 1.6999999999999997 599 | 210 600 | 0 601 | 220 602 | -5.5511151231257827e-17 603 | 230 604 | 1 605 | 0 606 | CIRCLE 607 | 5 608 | 110 609 | 100 610 | AcDbEntity 611 | 8 612 | 0 613 | 100 614 | AcDbCircle 615 | 10 616 | 70.750000044703484 617 | 20 618 | 74.184040331354851 619 | 30 620 | -1.7347234759768071e-17 621 | 40 622 | 19.000000000000011 623 | 210 624 | 0 625 | 220 626 | -1.1102230246251564e-16 627 | 230 628 | 1 629 | 0 630 | CIRCLE 631 | 5 632 | 111 633 | 100 634 | AcDbEntity 635 | 8 636 | 0 637 | 100 638 | AcDbCircle 639 | 10 640 | 133.50000064074996 641 | 20 642 | 57.384040405860652 643 | 30 644 | 2.203098814490545e-15 645 | 40 646 | 1.6999999999999997 647 | 210 648 | 0 649 | 220 650 | -5.5511151231257827e-17 651 | 230 652 | 1 653 | 0 654 | CIRCLE 655 | 5 656 | 112 657 | 100 658 | AcDbEntity 659 | 8 660 | 0 661 | 100 662 | AcDbCircle 663 | 10 664 | 146.00000011920929 665 | 20 666 | 9.3840404058606293 667 | 30 668 | 5.377642775528102e-16 669 | 40 670 | 1.6999999999999997 671 | 210 672 | 0 673 | 220 674 | -5.5511151231257827e-17 675 | 230 676 | 1 677 | 0 678 | CIRCLE 679 | 5 680 | 113 681 | 100 682 | AcDbEntity 683 | 8 684 | 0 685 | 100 686 | AcDbCircle 687 | 10 688 | 162.75000004470348 689 | 20 690 | 74.184040331354851 691 | 30 692 | -1.7347234759768071e-17 693 | 40 694 | 19.000000000000025 695 | 210 696 | 0 697 | 220 698 | 0 699 | 230 700 | 1 701 | 0 702 | CIRCLE 703 | 5 704 | 114 705 | 100 706 | AcDbEntity 707 | 8 708 | 0 709 | 100 710 | AcDbCircle 711 | 10 712 | 162.75000004470348 713 | 20 714 | 26.184040331354833 715 | 30 716 | -1.7347234759768071e-17 717 | 40 718 | 19.000000000000025 719 | 210 720 | 0 721 | 220 722 | 0 723 | 230 724 | 1 725 | 0 726 | CIRCLE 727 | 5 728 | 115 729 | 100 730 | AcDbEntity 731 | 8 732 | 0 733 | 100 734 | AcDbCircle 735 | 10 736 | 100.0000001192093 737 | 20 738 | 9.3840404058606293 739 | 30 740 | 5.377642775528102e-16 741 | 40 742 | 1.6999999999999997 743 | 210 744 | 0 745 | 220 746 | -5.5511151231257827e-17 747 | 230 748 | 1 749 | 0 750 | CIRCLE 751 | 5 752 | 116 753 | 100 754 | AcDbEntity 755 | 8 756 | 0 757 | 100 758 | AcDbCircle 759 | 10 760 | 100.0000001192093 761 | 20 762 | 57.384040405860652 763 | 30 764 | 2.203098814490545e-15 765 | 40 766 | 1.6999999999999997 767 | 210 768 | 0 769 | 220 770 | -5.5511151231257827e-17 771 | 230 772 | 1 773 | 0 774 | CIRCLE 775 | 5 776 | 117 777 | 100 778 | AcDbEntity 779 | 8 780 | 0 781 | 100 782 | AcDbCircle 783 | 10 784 | 70.750000044703484 785 | 20 786 | 26.184040331354833 787 | 30 788 | -1.7347234759768071e-17 789 | 40 790 | 19.000000000000011 791 | 210 792 | 0 793 | 220 794 | -1.1102230246251564e-16 795 | 230 796 | 1 797 | 0 798 | CIRCLE 799 | 5 800 | 118 801 | 100 802 | AcDbEntity 803 | 8 804 | 0 805 | 100 806 | AcDbCircle 807 | 10 808 | 8.0000001192092878 809 | 20 810 | 9.3840404058606293 811 | 30 812 | 5.377642775528102e-16 813 | 40 814 | 1.6999999999999997 815 | 210 816 | 0 817 | 220 818 | -5.5511151231257827e-17 819 | 230 820 | 1 821 | 0 822 | CIRCLE 823 | 5 824 | 119 825 | 100 826 | AcDbEntity 827 | 8 828 | 0 829 | 100 830 | AcDbCircle 831 | 10 832 | 24.750000044703484 833 | 20 834 | 74.184040331354851 835 | 30 836 | -1.7347234759768071e-17 837 | 40 838 | 19.000000000000018 839 | 210 840 | 0 841 | 220 842 | -5.5511151231257815e-17 843 | 230 844 | 1 845 | 0 846 | CIRCLE 847 | 5 848 | 120 849 | 100 850 | AcDbEntity 851 | 8 852 | 0 853 | 100 854 | AcDbCircle 855 | 10 856 | 24.750000044703484 857 | 20 858 | 26.184040331354833 859 | 30 860 | -1.7347234759768071e-17 861 | 40 862 | 19.000000000000018 863 | 210 864 | 0 865 | 220 866 | -5.5511151231257815e-17 867 | 230 868 | 1 869 | 0 870 | CIRCLE 871 | 5 872 | 121 873 | 100 874 | AcDbEntity 875 | 8 876 | 0 877 | 100 878 | AcDbCircle 879 | 10 880 | 87.500000640749946 881 | 20 882 | 9.3840404058606293 883 | 30 884 | 5.377642775528102e-16 885 | 40 886 | 1.6999999999999997 887 | 210 888 | 0 889 | 220 890 | -5.5511151231257827e-17 891 | 230 892 | 1 893 | 0 894 | CIRCLE 895 | 5 896 | 122 897 | 100 898 | AcDbEntity 899 | 8 900 | 0 901 | 100 902 | AcDbCircle 903 | 10 904 | 87.500000640749946 905 | 20 906 | 57.384040405860652 907 | 30 908 | 2.203098814490545e-15 909 | 40 910 | 1.6999999999999997 911 | 210 912 | 0 913 | 220 914 | -5.5511151231257827e-17 915 | 230 916 | 1 917 | 0 918 | CIRCLE 919 | 5 920 | 123 921 | 100 922 | AcDbEntity 923 | 8 924 | 0 925 | 100 926 | AcDbCircle 927 | 10 928 | 116.75000004470348 929 | 20 930 | 26.184040331354833 931 | 30 932 | -1.7347234759768071e-17 933 | 40 934 | 19.000000000000011 935 | 210 936 | 0 937 | 220 938 | -1.1102230246251564e-16 939 | 230 940 | 1 941 | 0 942 | CIRCLE 943 | 5 944 | 124 945 | 100 946 | AcDbEntity 947 | 8 948 | 0 949 | 100 950 | AcDbCircle 951 | 10 952 | 179.50000064074999 953 | 20 954 | 9.3840404058606293 955 | 30 956 | 5.377642775528102e-16 957 | 40 958 | 1.6999999999999997 959 | 210 960 | 0 961 | 220 962 | -5.5511151231257827e-17 963 | 230 964 | 1 965 | 0 966 | CIRCLE 967 | 5 968 | 125 969 | 100 970 | AcDbEntity 971 | 8 972 | 0 973 | 100 974 | AcDbCircle 975 | 10 976 | 179.50000064074999 977 | 20 978 | 57.384040405860652 979 | 30 980 | 2.203098814490545e-15 981 | 40 982 | 1.6999999999999997 983 | 210 984 | 0 985 | 220 986 | -5.5511151231257827e-17 987 | 230 988 | 1 989 | 0 990 | ENDSEC 991 | 0 992 | SECTION 993 | 2 994 | OBJECTS 995 | 0 996 | DICTIONARY 997 | 5 998 | C 999 | 100 1000 | AcDbDictionary 1001 | 3 1002 | ACAD_GROUP 1003 | 350 1004 | D 1005 | 3 1006 | ACAD_MLINESTYLE 1007 | 350 1008 | 17 1009 | 0 1010 | DICTIONARY 1011 | 5 1012 | D 1013 | 100 1014 | AcDbDictionary 1015 | 0 1016 | DICTIONARY 1017 | 5 1018 | 1A 1019 | 330 1020 | C 1021 | 100 1022 | AcDbDictionary 1023 | 0 1024 | DICTIONARY 1025 | 5 1026 | 17 1027 | 100 1028 | AcDbDictionary 1029 | 0 1030 | ENDSEC 1031 | 0 1032 | EOF 1033 | -------------------------------------------------------------------------------- /CAD/bbMonitor_Holder_L_3mm.dxf: -------------------------------------------------------------------------------- 1 | 0 2 | SECTION 3 | 2 4 | HEADER 5 | 9 6 | $INSUNITS 7 | 70 8 | 4 9 | 9 10 | $ACADVER 11 | 1 12 | AC1014 13 | 9 14 | $HANDSEED 15 | 5 16 | FFFF 17 | 0 18 | ENDSEC 19 | 0 20 | SECTION 21 | 2 22 | TABLES 23 | 0 24 | TABLE 25 | 2 26 | VPORT 27 | 5 28 | 8 29 | 100 30 | AcDbSymbolTable 31 | 0 32 | ENDTAB 33 | 0 34 | TABLE 35 | 2 36 | LTYPE 37 | 5 38 | 5 39 | 100 40 | AcDbSymbolTable 41 | 0 42 | LTYPE 43 | 5 44 | 14 45 | 100 46 | AcDbSymbolTableRecord 47 | 100 48 | AcDbLinetypeTableRecord 49 | 2 50 | BYBLOCK 51 | 70 52 | 0 53 | 0 54 | LTYPE 55 | 5 56 | 15 57 | 100 58 | AcDbSymbolTableRecord 59 | 100 60 | AcDbLinetypeTableRecord 61 | 2 62 | BYLAYER 63 | 70 64 | 0 65 | 0 66 | ENDTAB 67 | 0 68 | TABLE 69 | 2 70 | LAYER 71 | 5 72 | 2 73 | 100 74 | AcDbSymbolTable 75 | 70 76 | 2 77 | 0 78 | LAYER 79 | 5 80 | 50 81 | 100 82 | AcDbSymbolTableRecord 83 | 100 84 | AcDbLayerTableRecord 85 | 2 86 | 0 87 | 70 88 | 0 89 | 6 90 | CONTINUOUS 91 | 0 92 | ENDTAB 93 | 0 94 | TABLE 95 | 2 96 | STYLE 97 | 5 98 | 3 99 | 100 100 | AcDbSymbolTable 101 | 70 102 | 1 103 | 0 104 | STYLE 105 | 5 106 | 11 107 | 100 108 | AcDbSymbolTableRecord 109 | 100 110 | AcDbTextStyleTableRecord 111 | 2 112 | STANDARD 113 | 70 114 | 0 115 | 0 116 | ENDTAB 117 | 0 118 | TABLE 119 | 2 120 | VIEW 121 | 5 122 | 6 123 | 100 124 | AcDbSymbolTable 125 | 70 126 | 0 127 | 0 128 | ENDTAB 129 | 0 130 | TABLE 131 | 2 132 | UCS 133 | 5 134 | 7 135 | 100 136 | AcDbSymbolTable 137 | 70 138 | 0 139 | 0 140 | ENDTAB 141 | 0 142 | TABLE 143 | 2 144 | APPID 145 | 5 146 | 9 147 | 100 148 | AcDbSymbolTable 149 | 70 150 | 2 151 | 0 152 | APPID 153 | 5 154 | 12 155 | 100 156 | AcDbSymbolTableRecord 157 | 100 158 | AcDbRegAppTableRecord 159 | 2 160 | ACAD 161 | 70 162 | 0 163 | 0 164 | ENDTAB 165 | 0 166 | TABLE 167 | 2 168 | DIMSTYLE 169 | 5 170 | A 171 | 100 172 | AcDbSymbolTable 173 | 70 174 | 1 175 | 0 176 | ENDTAB 177 | 0 178 | TABLE 179 | 2 180 | BLOCK_RECORD 181 | 5 182 | 1 183 | 100 184 | AcDbSymbolTable 185 | 70 186 | 1 187 | 0 188 | BLOCK_RECORD 189 | 5 190 | 1F 191 | 100 192 | AcDbSymbolTableRecord 193 | 100 194 | AcDbBlockTableRecord 195 | 2 196 | *MODEL_SPACE 197 | 0 198 | BLOCK_RECORD 199 | 5 200 | 1B 201 | 100 202 | AcDbSymbolTableRecord 203 | 100 204 | AcDbBlockTableRecord 205 | 2 206 | *PAPER_SPACE 207 | 0 208 | ENDTAB 209 | 0 210 | ENDSEC 211 | 0 212 | SECTION 213 | 2 214 | BLOCKS 215 | 0 216 | BLOCK 217 | 5 218 | 20 219 | 100 220 | AcDbEntity 221 | 100 222 | AcDbBlockBegin 223 | 2 224 | *MODEL_SPACE 225 | 0 226 | ENDBLK 227 | 5 228 | 21 229 | 100 230 | AcDbEntity 231 | 100 232 | AcDbBlockEnd 233 | 0 234 | BLOCK 235 | 5 236 | 1C 237 | 100 238 | AcDbEntity 239 | 100 240 | AcDbBlockBegin 241 | 2 242 | *PAPER_SPACE 243 | 0 244 | ENDBLK 245 | 5 246 | 1D 247 | 100 248 | AcDbEntity 249 | 100 250 | AcDbBlockEnd 251 | 0 252 | ENDSEC 253 | 0 254 | SECTION 255 | 2 256 | ENTITIES 257 | 0 258 | LWPOLYLINE 259 | 5 260 | 100 261 | 100 262 | AcDbEntity 263 | 8 264 | 0 265 | 100 266 | AcDbPolyline 267 | 90 268 | 29 269 | 70 270 | 1 271 | 43 272 | 0.0 273 | 10 274 | -66.502315256232706 275 | 20 276 | 6.0584587755858346 277 | 10 278 | -68.447975559076866 279 | 20 280 | 6.5214987154791695 281 | 10 282 | -69.619755234576118 283 | 20 284 | 1.5977653571349215 285 | 42 286 | 0.058476470414993702 287 | 10 288 | -69.837114023199518 289 | 20 290 | -0.2543944024384151 291 | 10 292 | -69.837114023199518 293 | 20 294 | -3.3159597133486662 295 | 42 296 | 0.4142135623730952 297 | 10 298 | -64.837114023199518 299 | 20 300 | -8.3159597133486702 301 | 10 302 | -61.837114023199504 303 | 20 304 | -8.3159597133486667 305 | 42 306 | 0.23606797749979047 307 | 10 308 | -57.837114023199504 309 | 20 310 | -6.3159597133486578 311 | 42 312 | -0.23606797749978925 313 | 10 314 | -53.837114023199504 315 | 20 316 | -4.315959713348664 317 | 10 318 | -41.047344169333265 319 | 20 320 | -4.3159597133486578 321 | 10 322 | -41.047344169333265 323 | 20 324 | -2.3159597133486582 325 | 10 326 | -29.047344169333265 327 | 20 328 | -2.3159597133486582 329 | 10 330 | -29.047344169333265 331 | 20 332 | -4.3159597133486578 333 | 10 334 | -16.120614758428182 335 | 20 336 | -4.3159597133486587 337 | 42 338 | -0.23606797749978972 339 | 10 340 | -12.120614758428182 341 | 20 342 | -6.3159597133486622 343 | 42 344 | 0.23606797749978978 345 | 10 346 | -8.1206147584281823 347 | 20 348 | -8.3159597133486614 349 | 10 350 | -5.1206147584281814 351 | 20 352 | -8.3159597133486578 353 | 42 354 | 0.4142135623730952 355 | 10 356 | -0.12061475842818303 357 | 20 358 | -3.3159597133486578 359 | 10 360 | -0.12061475842818359 361 | 20 362 | -1.9608644239756423 363 | 42 364 | 0.087488663525923313 365 | 10 366 | -1.0252254466395565 367 | 20 368 | 3.1694377259093862 369 | 10 370 | -2.1727356183821946 371 | 20 372 | 6.3221960113667919 373 | 10 374 | -4.0521208599540115 375 | 20 376 | 5.638155724715455 377 | 10 378 | -33.807873329287197 379 | 20 380 | 87.391413733089522 381 | 10 382 | -31.928488087715373 383 | 20 384 | 88.075454019740846 385 | 10 386 | -34.319916123261443 387 | 20 388 | 94.645848547654396 389 | 42 390 | 0.63130113605271698 391 | 10 392 | -46.901522851874169 393 | 20 394 | 95.8509970961085 395 | 42 396 | 0.076754299605320569 397 | 10 398 | -47.59242514631115 399 | 20 400 | 94.155011585730961 401 | 10 402 | -48.981544965991183 403 | 20 404 | 88.318030677198522 405 | 10 406 | -47.035884663147023 407 | 20 408 | 87.854990737305187 409 | 0 410 | CIRCLE 411 | 5 412 | 101 413 | 100 414 | AcDbEntity 415 | 8 416 | 0 417 | 100 418 | AcDbCircle 419 | 10 420 | -40.880608947669394 421 | 20 422 | 92.555516479333946 423 | 30 424 | 0 425 | 40 426 | 5.1500000000000004 427 | 210 428 | 0 429 | 220 430 | -0 431 | 230 432 | 1 433 | 0 434 | CIRCLE 435 | 5 436 | 102 437 | 100 438 | AcDbEntity 439 | 8 440 | 0 441 | 100 442 | AcDbCircle 443 | 10 444 | -6.8781560011706748 445 | 20 446 | -1.3159597133486622 447 | 30 448 | 0 449 | 40 450 | 5.1500000000000004 451 | 210 452 | 0 453 | 220 454 | -0 455 | 230 456 | 1 457 | 0 458 | CIRCLE 459 | 5 460 | 103 461 | 100 462 | AcDbEntity 463 | 8 464 | 0 465 | 100 466 | AcDbCircle 467 | 10 468 | -63.18060894766937 469 | 20 470 | -1.3159597133486578 471 | 30 472 | 0 473 | 40 474 | 5.1500000000000004 475 | 210 476 | 0 477 | 220 478 | -0 479 | 230 480 | 1 481 | 0 482 | ENDSEC 483 | 0 484 | SECTION 485 | 2 486 | OBJECTS 487 | 0 488 | DICTIONARY 489 | 5 490 | C 491 | 100 492 | AcDbDictionary 493 | 3 494 | ACAD_GROUP 495 | 350 496 | D 497 | 3 498 | ACAD_MLINESTYLE 499 | 350 500 | 17 501 | 0 502 | DICTIONARY 503 | 5 504 | D 505 | 100 506 | AcDbDictionary 507 | 0 508 | DICTIONARY 509 | 5 510 | 1A 511 | 330 512 | C 513 | 100 514 | AcDbDictionary 515 | 0 516 | DICTIONARY 517 | 5 518 | 17 519 | 100 520 | AcDbDictionary 521 | 0 522 | ENDSEC 523 | 0 524 | EOF 525 | -------------------------------------------------------------------------------- /CAD/bbMonitor_Holder_R_3mm.dxf: -------------------------------------------------------------------------------- 1 | 0 2 | SECTION 3 | 2 4 | HEADER 5 | 9 6 | $INSUNITS 7 | 70 8 | 4 9 | 9 10 | $ACADVER 11 | 1 12 | AC1014 13 | 9 14 | $HANDSEED 15 | 5 16 | FFFF 17 | 0 18 | ENDSEC 19 | 0 20 | SECTION 21 | 2 22 | TABLES 23 | 0 24 | TABLE 25 | 2 26 | VPORT 27 | 5 28 | 8 29 | 100 30 | AcDbSymbolTable 31 | 0 32 | ENDTAB 33 | 0 34 | TABLE 35 | 2 36 | LTYPE 37 | 5 38 | 5 39 | 100 40 | AcDbSymbolTable 41 | 0 42 | LTYPE 43 | 5 44 | 14 45 | 100 46 | AcDbSymbolTableRecord 47 | 100 48 | AcDbLinetypeTableRecord 49 | 2 50 | BYBLOCK 51 | 70 52 | 0 53 | 0 54 | LTYPE 55 | 5 56 | 15 57 | 100 58 | AcDbSymbolTableRecord 59 | 100 60 | AcDbLinetypeTableRecord 61 | 2 62 | BYLAYER 63 | 70 64 | 0 65 | 0 66 | ENDTAB 67 | 0 68 | TABLE 69 | 2 70 | LAYER 71 | 5 72 | 2 73 | 100 74 | AcDbSymbolTable 75 | 70 76 | 2 77 | 0 78 | LAYER 79 | 5 80 | 50 81 | 100 82 | AcDbSymbolTableRecord 83 | 100 84 | AcDbLayerTableRecord 85 | 2 86 | 0 87 | 70 88 | 0 89 | 6 90 | CONTINUOUS 91 | 0 92 | ENDTAB 93 | 0 94 | TABLE 95 | 2 96 | STYLE 97 | 5 98 | 3 99 | 100 100 | AcDbSymbolTable 101 | 70 102 | 1 103 | 0 104 | STYLE 105 | 5 106 | 11 107 | 100 108 | AcDbSymbolTableRecord 109 | 100 110 | AcDbTextStyleTableRecord 111 | 2 112 | STANDARD 113 | 70 114 | 0 115 | 0 116 | ENDTAB 117 | 0 118 | TABLE 119 | 2 120 | VIEW 121 | 5 122 | 6 123 | 100 124 | AcDbSymbolTable 125 | 70 126 | 0 127 | 0 128 | ENDTAB 129 | 0 130 | TABLE 131 | 2 132 | UCS 133 | 5 134 | 7 135 | 100 136 | AcDbSymbolTable 137 | 70 138 | 0 139 | 0 140 | ENDTAB 141 | 0 142 | TABLE 143 | 2 144 | APPID 145 | 5 146 | 9 147 | 100 148 | AcDbSymbolTable 149 | 70 150 | 2 151 | 0 152 | APPID 153 | 5 154 | 12 155 | 100 156 | AcDbSymbolTableRecord 157 | 100 158 | AcDbRegAppTableRecord 159 | 2 160 | ACAD 161 | 70 162 | 0 163 | 0 164 | ENDTAB 165 | 0 166 | TABLE 167 | 2 168 | DIMSTYLE 169 | 5 170 | A 171 | 100 172 | AcDbSymbolTable 173 | 70 174 | 1 175 | 0 176 | ENDTAB 177 | 0 178 | TABLE 179 | 2 180 | BLOCK_RECORD 181 | 5 182 | 1 183 | 100 184 | AcDbSymbolTable 185 | 70 186 | 1 187 | 0 188 | BLOCK_RECORD 189 | 5 190 | 1F 191 | 100 192 | AcDbSymbolTableRecord 193 | 100 194 | AcDbBlockTableRecord 195 | 2 196 | *MODEL_SPACE 197 | 0 198 | BLOCK_RECORD 199 | 5 200 | 1B 201 | 100 202 | AcDbSymbolTableRecord 203 | 100 204 | AcDbBlockTableRecord 205 | 2 206 | *PAPER_SPACE 207 | 0 208 | ENDTAB 209 | 0 210 | ENDSEC 211 | 0 212 | SECTION 213 | 2 214 | BLOCKS 215 | 0 216 | BLOCK 217 | 5 218 | 20 219 | 100 220 | AcDbEntity 221 | 100 222 | AcDbBlockBegin 223 | 2 224 | *MODEL_SPACE 225 | 0 226 | ENDBLK 227 | 5 228 | 21 229 | 100 230 | AcDbEntity 231 | 100 232 | AcDbBlockEnd 233 | 0 234 | BLOCK 235 | 5 236 | 1C 237 | 100 238 | AcDbEntity 239 | 100 240 | AcDbBlockBegin 241 | 2 242 | *PAPER_SPACE 243 | 0 244 | ENDBLK 245 | 5 246 | 1D 247 | 100 248 | AcDbEntity 249 | 100 250 | AcDbBlockEnd 251 | 0 252 | ENDSEC 253 | 0 254 | SECTION 255 | 2 256 | ENTITIES 257 | 0 258 | CIRCLE 259 | 5 260 | 100 261 | 100 262 | AcDbEntity 263 | 8 264 | 0 265 | 100 266 | AcDbCircle 267 | 10 268 | 63.18060894766937 269 | 20 270 | -1.3159597133486578 271 | 30 272 | 0 273 | 40 274 | 5.1500000000000004 275 | 210 276 | 0 277 | 220 278 | 0 279 | 230 280 | 1 281 | 0 282 | CIRCLE 283 | 5 284 | 101 285 | 100 286 | AcDbEntity 287 | 8 288 | 0 289 | 100 290 | AcDbCircle 291 | 10 292 | 40.880608947669394 293 | 20 294 | 92.555516479333946 295 | 30 296 | 0 297 | 40 298 | 5.1500000000000004 299 | 210 300 | 0 301 | 220 302 | 0 303 | 230 304 | 1 305 | 0 306 | LWPOLYLINE 307 | 5 308 | 102 309 | 100 310 | AcDbEntity 311 | 8 312 | 0 313 | 100 314 | AcDbPolyline 315 | 90 316 | 29 317 | 70 318 | 1 319 | 43 320 | 0.0 321 | 10 322 | 69.837114023199518 323 | 20 324 | -0.25439440243840927 325 | 42 326 | 0.058476470414993223 327 | 10 328 | 69.619755234576104 329 | 20 330 | 1.5977653571349204 331 | 10 332 | 68.447975559076866 333 | 20 334 | 6.5214987154791695 335 | 10 336 | 66.502315256232706 337 | 20 338 | 6.0584587755858346 339 | 10 340 | 47.035884663147023 341 | 20 342 | 87.854990737305187 343 | 10 344 | 48.981544965991183 345 | 20 346 | 88.318030677198522 347 | 10 348 | 47.59242514631115 349 | 20 350 | 94.155011585730961 351 | 42 352 | 0.076754299605321027 353 | 10 354 | 46.901522851874162 355 | 20 356 | 95.8509970961085 357 | 42 358 | 0.63130113605271676 359 | 10 360 | 34.319916123261443 361 | 20 362 | 94.645848547654396 363 | 10 364 | 31.928488087715397 365 | 20 366 | 88.075454019740846 367 | 10 368 | 33.807873329287197 369 | 20 370 | 87.391413733089522 371 | 10 372 | 4.0521208599540159 373 | 20 374 | 5.6381557247154568 375 | 10 376 | 2.1727356183822 377 | 20 378 | 6.3221960113667901 379 | 10 380 | 1.0252254466395549 381 | 20 382 | 3.1694377259093862 383 | 42 384 | 0.087488663525923965 385 | 10 386 | 0.12061475842818054 387 | 20 388 | -1.9608644239756385 389 | 10 390 | 0.12061475842818248 391 | 20 392 | -3.3159597133486596 393 | 42 394 | 0.41421356237309531 395 | 10 396 | 5.120614758428184 397 | 20 398 | -8.3159597133486596 399 | 10 400 | 8.120614758428184 401 | 20 402 | -8.3159597133486578 403 | 42 404 | 0.23606797749978922 405 | 10 406 | 12.120614758428182 407 | 20 408 | -6.3159597133486614 409 | 42 410 | -0.23606797749978958 411 | 10 412 | 16.120614758428182 413 | 20 414 | -4.3159597133486596 415 | 10 416 | 29.047344169333265 417 | 20 418 | -4.3159597133486578 419 | 10 420 | 29.047344169333265 421 | 20 422 | -2.3159597133486582 423 | 10 424 | 41.047344169333265 425 | 20 426 | -2.3159597133486582 427 | 10 428 | 41.047344169333265 429 | 20 430 | -4.3159597133486578 431 | 10 432 | 53.837114023199504 433 | 20 434 | -4.3159597133486658 435 | 42 436 | -0.23606797749978936 437 | 10 438 | 57.837114023199504 439 | 20 440 | -6.3159597133486596 441 | 42 442 | 0.236067977499791 443 | 10 444 | 61.837114023199504 445 | 20 446 | -8.3159597133486667 447 | 10 448 | 64.837114023199518 449 | 20 450 | -8.3159597133486667 451 | 42 452 | 0.4142135623730952 453 | 10 454 | 69.837114023199518 455 | 20 456 | -3.3159597133486658 457 | 0 458 | CIRCLE 459 | 5 460 | 103 461 | 100 462 | AcDbEntity 463 | 8 464 | 0 465 | 100 466 | AcDbCircle 467 | 10 468 | 6.8781560011706748 469 | 20 470 | -1.3159597133486622 471 | 30 472 | 0 473 | 40 474 | 5.1500000000000004 475 | 210 476 | 0 477 | 220 478 | 0 479 | 230 480 | 1 481 | 0 482 | ENDSEC 483 | 0 484 | SECTION 485 | 2 486 | OBJECTS 487 | 0 488 | DICTIONARY 489 | 5 490 | C 491 | 100 492 | AcDbDictionary 493 | 3 494 | ACAD_GROUP 495 | 350 496 | D 497 | 3 498 | ACAD_MLINESTYLE 499 | 350 500 | 17 501 | 0 502 | DICTIONARY 503 | 5 504 | D 505 | 100 506 | AcDbDictionary 507 | 0 508 | DICTIONARY 509 | 5 510 | 1A 511 | 330 512 | C 513 | 100 514 | AcDbDictionary 515 | 0 516 | DICTIONARY 517 | 5 518 | 17 519 | 100 520 | AcDbDictionary 521 | 0 522 | ENDSEC 523 | 0 524 | EOF 525 | -------------------------------------------------------------------------------- /IMG/bbMonitor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RealCorebb/bbMonitor/0dd7b7945d7f808087aa2997a5806a2289f9bd2c/IMG/bbMonitor.jpg -------------------------------------------------------------------------------- /PCB/Gerber_PCB1_Board.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RealCorebb/bbMonitor/0dd7b7945d7f808087aa2997a5806a2289f9bd2c/PCB/Gerber_PCB1_Board.zip -------------------------------------------------------------------------------- /PCB/Gerber_PCB2_LED.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RealCorebb/bbMonitor/0dd7b7945d7f808087aa2997a5806a2289f9bd2c/PCB/Gerber_PCB2_LED.zip -------------------------------------------------------------------------------- /PCB/SCH_Schematic1_Board.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RealCorebb/bbMonitor/0dd7b7945d7f808087aa2997a5806a2289f9bd2c/PCB/SCH_Schematic1_Board.pdf -------------------------------------------------------------------------------- /PCB/SCH_Schematic2_LED.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RealCorebb/bbMonitor/0dd7b7945d7f808087aa2997a5806a2289f9bd2c/PCB/SCH_Schematic2_LED.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # bbMonitor [English](https://github.com/RealCorebb/bbMonitor/blob/main/README_EN.md "English") 2 | ![image](https://github.com/RealCorebb/bbMonitor/blob/main/IMG/bbMonitor.jpg?raw=true) 3 | ## 来点表 4 | 如果把电脑任务管理器里的性能监视器和老式复古的指针表结合起来,做到现实中会怎么样呢?这就是bbMonitor。 5 | 想象一下,当你的电脑忙碌时,指针就像是一只活泼的小动物一样在仪表盘上跳跃;当它运行顺畅时,指针则轻盈地舞动。这种奇妙的互动,让你能够更直观地感受到你的电脑在做什么。 6 | 7 | 😄[以往更详细的教程](https://afdian.com/a/kuruibb "更详细的教程") 8 | 9 | 🐧QQ群(仅供交流):647186542 10 | 🐦[Twitter](https://twitter.com/RealCorebb "@RealCorebb") @RealCorebb 11 | ▶️视频(Video):[Youtube](https://www.youtube.com/watch?v=KMqlBF-dVS4 "Youtube")[ Bilibili](https://www.bilibili.com/video/BV1uM4m1f75z " Bilibili") 12 | # 禁止搬运到Gitee 13 | 14 | Designed By Corebb With Love From bbREALM! 15 | 16 | # 目录结构: 17 | **bbMonitor.ino** ESP32 Arduino主程序 18 | **PCB** PCB原理图、Gerber制板文件 19 | **CAD** 外壳图纸 20 | 21 | # 关于桌面软件: 22 | 这个软件称之为bbHome,是我为我自己做的东西做的一个平台,目前只有bbMonitor的设备。 23 | 相关地址:https://www.bbrealm.com 24 | 25 | # 购买方式: 26 | 本项目为开源的,你可以自己制作,也可以购买成品支持我的创作 27 | 已上架的平台:Bilibili工房 [链接](https://gf.bilibili.com/item/detail/1106032122) 、 淘宝 [链接](https://item.taobao.com/item.htm?abbucket=15&id=797425604374) 、 Tindie [链接](https://www.tindie.com/products/bbrealm/bbmonitor/) 28 | [![Bilibili](https://www.bbrealm.com/images/bilibili-gf.png)](https://gf.bilibili.com/item/detail/1106032122) 29 | [![Taobao](https://www.bbrealm.com/images/taobao.png)](https://item.taobao.com/item.htm?abbucket=3&id=797425604374&ns=1) 30 | [![I sell on Tindie](https://d2ss6ovg47m0r5.cloudfront.net/badges/tindie-larges.png)](https://www.tindie.com/stores/bbrealm/?ref=offsite_badges&utm_source=sellers_Corebbd&utm_medium=badges&utm_campaign=badge_large) 31 | -------------------------------------------------------------------------------- /README_EN.md: -------------------------------------------------------------------------------- 1 | # bbMonitor [中文](https://github.com/RealCorebb/bbMonitor/blob/main/README.md "中文") 2 | ![image](https://github.com/RealCorebb/bbMonitor/blob/main/IMG/bbMonitor.jpg?raw=true) 3 | ## A Dash of Gauges 4 | What if the performance monitor from your computer's task manager danced with vintage-style gauges? That's bbMonitor. 5 | Imagine, as your computer hustles and bustles, the pointer prances around the dashboard like a lively critter; when it's smooth sailing, it sways with finesse. This delightful interaction lets you intuitively grasp what your computer is up to. 6 | 7 | 🔗[PCB Engineering Files (EasyEDA)](https://oshwhub.com/corebb/bbmonitor "PCB Engineering Files") 8 | 😄[Detailed Tutorial](https://afdian.net/a/kuruibb "Detailed Tutorial") 9 | 10 | 🐧QQ Group (for Communication Only): 647186542 11 | 🐦[Twitter](https://twitter.com/RealCorebb "@RealCorebb") @RealCorebb 12 | ▶️Video: [Youtube](https://www.youtube.com/watch?v=KMqlBF-dVS4 "Youtube")[ Bilibili](https://www.bilibili.com/video/BV1uM4m1f75z " Bilibili") 13 | 14 | Designed By Corebb With Love From bbREALM! 15 | 16 | # Directory Structure: 17 | **bbMonitor.ino** ESP32 Arduino Main Program 18 | **PCB** PCB Schematics, Gerber Files 19 | **CAD** Casing Drawings 20 | 21 | # About Desktop Software: 22 | This software is called bbHome, a platform I've created for myself, currently only supporting bbMonitor devices. 23 | You can find that on my website: https://www.bbrealm.com 24 | 25 | # Buy it to support me: 26 | Available at:Bilibili [Link](https://gf.bilibili.com/item/detail/1106032122) 、 Taobao [Link](https://item.taobao.com/item.htm?abbucket=15&id=797425604374) 、 Tindie [Link](https://www.tindie.com/products/bbrealm/bbmonitor/) 27 | [![Bilibili](https://www.bbrealm.com/images/bilibili-gf2.png)](https://gf.bilibili.com/item/detail/1106032122) 28 | [![Taobao](https://www.bbrealm.com/images/taobao2.png)](https://item.taobao.com/item.htm?abbucket=3&id=797425604374&ns=1) 29 | [![I sell on Tindie](https://d2ss6ovg47m0r5.cloudfront.net/badges/tindie-larges.png)](https://www.tindie.com/stores/bbrealm/?ref=offsite_badges&utm_source=sellers_Corebbd&utm_medium=badges&utm_campaign=badge_large) 30 | 31 | -------------------------------------------------------------------------------- /Test/FunctionTest.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import json 3 | import websockets 4 | 5 | async def send_data(): 6 | uri = "ws://192.168.253.203" # Replace with the actual IP and port 7 | data_on = {"data": [1, 1, 1, 1, 1, 1, 1, 1]} 8 | data_half = {"data": [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]} 9 | data_off = {"data":[0, 0, 0, 0, 0, 0, 0, 0]} 10 | 11 | try: 12 | async with websockets.connect(uri) as websocket: 13 | while True: 14 | print("send") 15 | await websocket.send(json.dumps(data_half)) 16 | await asyncio.sleep(1) # Delay for 1 second 17 | await websocket.send(json.dumps(data_on)) 18 | await asyncio.sleep(1) # Delay for 1 second 19 | await websocket.send(json.dumps(data_half)) 20 | await asyncio.sleep(1) # Delay for 1 second 21 | await websocket.send(json.dumps(data_off)) 22 | await asyncio.sleep(1) # Delay for 1 second 23 | except websockets.ConnectionClosedError as e: 24 | print(f"Connection closed: {e}") 25 | except Exception as e: 26 | print(f"An error occurred: {e}") 27 | 28 | if __name__ == "__main__": 29 | asyncio.get_event_loop().run_until_complete(send_data()) 30 | -------------------------------------------------------------------------------- /bbMonitor.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | #define P1 38 12 | #define P2 5 13 | #define P3 6 14 | #define P4 7 15 | #define P5 15 16 | #define P6 16 17 | #define P7 17 18 | #define P8 18 19 | #define P9 8 20 | #define P10 9 21 | #define P11 10 22 | #define P12 11 23 | #define P13 12 24 | #define P14 13 25 | #define P15 14 26 | #define P16 21 27 | #define P17 35 28 | #define P18 36 29 | const int pins[] = {P1, P2, P3, P4, P5, P6, P7, P8}; 30 | int luminence = 128; 31 | int smoothTime = 0; 32 | bool isConfigingAnimation = false; 33 | 34 | #define LINES 2 35 | #define EACH_PIXEL_COUNT 2 36 | int cols = sizeof(pins) / sizeof(pins[0]) / LINES; 37 | 38 | #define STRIP1_PIN 39 // Example pin for strip 1, replace with your actual pin 39 | #define STRIP2_PIN 40 // Example pin for strip 2, replace with your actual pin 40 | #define PIXEL_COUNT 8 // Replace with the actual number of NeoPixels per strip 41 | 42 | NeoPixelBus strip1(PIXEL_COUNT, STRIP1_PIN); 43 | NeoPixelBus strip2(PIXEL_COUNT, STRIP2_PIN); 44 | 45 | NeoPixelAnimator animations1(PIXEL_COUNT); 46 | NeoPixelAnimator animations2(PIXEL_COUNT); 47 | NeoPixelAnimator animationsConfig(PIXEL_COUNT); 48 | 49 | AnimEaseFunction easing = NeoEase::CubicIn; 50 | 51 | #define MAX 250 52 | 53 | Preferences preferences; 54 | bool mdnsOn = false; 55 | 56 | AsyncWebServer server(80); 57 | AsyncWebSocket ws("/"); 58 | 59 | int targetPWMValues[sizeof(pins) / sizeof(pins[0])]; // Array to store target PWM values for pins 60 | int currentPWMValues[sizeof(pins) / sizeof(pins[0])]; // Array to store current PWM values for pins 61 | unsigned long smoothStartTime; 62 | 63 | DynamicJsonDocument jsonDoc(512); 64 | 65 | Ticker meter; 66 | Ticker configuring; 67 | Ticker ipStatus; 68 | 69 | void handleWebSocketMessage(void *arg, uint8_t *data, size_t len, AsyncWebSocketClient *client) { 70 | AwsFrameInfo *info = static_cast(arg); 71 | static String message; 72 | 73 | if (info->index == 0) { 74 | // This is a new message, clear our message string 75 | message = ""; 76 | } 77 | 78 | // Append the data from this frame to our message 79 | for(size_t i=0; ifinal) { 84 | // The final frame has been received, process the message 85 | handleWebSocketText((uint8_t *)message.c_str(), message.length(),client); 86 | } 87 | } 88 | 89 | void resetConfigingAnimation(){ 90 | isConfigingAnimation = false; 91 | ESP_LOGV("bbMonitor","reset isConfigingAnimation"); 92 | } 93 | 94 | 95 | void handleWebSocketText(uint8_t * payload, size_t length, AsyncWebSocketClient *client) { 96 | // Parse JSON data 97 | if (memcmp(payload, "getConfig", sizeof("getConfig") - 1) == 0) { 98 | ESP_LOGV("bbMonitor","getConfig"); 99 | String config_current = preferences.getString("config","{\"config\":{\"data\":[\"cpu_usage[0]\",\"cpu_usage[1]\",\"cpu_usage[2]\",\"cpu_usage[3]\",\"cpu_usage[4]\",\"cpu_usage[5]\",\"cpu_usage[6]\",\"cpu_usage[7]\"],\"brightNess\":128,\"smoothTime\":0}}"); 100 | client->text(config_current); 101 | } 102 | else if(memcmp(payload, "configuring", sizeof("configuring") - 1) == 0){ 103 | ESP_LOGV("bbMonitor","configuring"); 104 | setConfigAnimation(); 105 | configuring.once(2,resetConfigingAnimation); 106 | } 107 | else{ 108 | DeserializationError error = deserializeJson(jsonDoc, payload, length); 109 | 110 | if (error) { 111 | ESP_LOGV("bbMonitor","Failed to parse JSON"); 112 | return; 113 | } 114 | 115 | // Check if the "data" key exists 116 | if (jsonDoc.containsKey("data")) { 117 | JsonArray data = jsonDoc["data"]; 118 | 119 | // Iterate through the array and set analogWrite values for defined pins 120 | smoothStartTime = millis(); 121 | for (int i = 0; i < data.size(); i++) { 122 | // Ensure pinIndex is within bounds 123 | if (i < sizeof(pins) / sizeof(pins[0])) { 124 | float pinValue = data[i].as(); // Extract the value from the array element 125 | int pinIndex = i; 126 | 127 | targetPWMValues[i] = MAX * pinValue; 128 | 129 | ESP_LOGV("bbMonitor","Set PWM value for Pin "); 130 | 131 | // Determine the strip and pixel index based on pinIndex 132 | int stripIndex = pinIndex < cols ? 0 : 1; 133 | int pixelIndex = (pinIndex & cols - 1) * EACH_PIXEL_COUNT; 134 | 135 | // Set NeoPixel animation based on pinValue 136 | setNeoPixelAnimation(stripIndex, pixelIndex, pinValue); 137 | } else { 138 | ESP_LOGV("bbMonitor","Invalid Pin Index"); 139 | } 140 | } 141 | } 142 | else if(jsonDoc.containsKey("config")){ 143 | //write the entire json.config string to the preferences config 144 | luminence = jsonDoc["config"]["brightNess"].as(); 145 | smoothTime = jsonDoc["config"]["smoothTime"].as(); 146 | String jsonString; 147 | serializeJson(jsonDoc, jsonString); 148 | preferences.putString("config", jsonString); 149 | } 150 | else { 151 | ESP_LOGV("bbMonitor","No 'data' key found in JSON"); 152 | } 153 | } 154 | } 155 | 156 | void onEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, 157 | void *arg, uint8_t *data, size_t len) { 158 | switch (type) { 159 | case WS_EVT_CONNECT: 160 | ws.cleanupClients(); 161 | break; 162 | case WS_EVT_DISCONNECT: 163 | break; 164 | case WS_EVT_DATA: 165 | handleWebSocketMessage(arg, data, len, client); 166 | break; 167 | case WS_EVT_PONG: 168 | case WS_EVT_ERROR: 169 | break; 170 | } 171 | } 172 | 173 | void setup() { 174 | preferences.begin("bbMonitor", false); 175 | Serial.begin(115200); 176 | // put your setup code here, to run once: 177 | pinMode(P1,OUTPUT); 178 | pinMode(P2,OUTPUT); 179 | pinMode(P3,OUTPUT); 180 | pinMode(P4,OUTPUT); 181 | pinMode(P5,OUTPUT); 182 | pinMode(P6,OUTPUT); 183 | pinMode(P7,OUTPUT); 184 | pinMode(P8,OUTPUT); 185 | 186 | //Setup WiFi 187 | String ssid = preferences.getString("ssid","Hollyshit_A"); 188 | String passwd = preferences.getString("passwd","00197633"); 189 | String config = preferences.getString("config","{\"config\":{\"data\":[\"cpu_usage[0]\",\"cpu_usage[1]\",\"cpu_usage[2]\",\"cpu_usage[3]\",\"cpu_usage[4]\",\"cpu_usage[5]\",\"cpu_usage[6]\",\"cpu_usage[7]\"],\"brightNess\":128,\"smoothTime\":0}}"); 190 | if(ssid != "null" && passwd != "null"){ 191 | WiFi.begin(ssid.c_str(),passwd.c_str()); 192 | } 193 | 194 | //Load Config 195 | DeserializationError error = deserializeJson(jsonDoc, config.c_str()); 196 | if (error) { 197 | ESP_LOGV("bbMonitor","Failed to parse JSON"); 198 | } 199 | else{ 200 | luminence = jsonDoc["config"]["brightNess"].as(); 201 | smoothTime = jsonDoc["config"]["smoothTime"].as(); 202 | } 203 | 204 | // Setup LED 205 | strip1.Begin(); 206 | strip2.Begin(); 207 | RgbColor color = RgbColor(25, 25, luminence); 208 | for(int i = 0; i < PIXEL_COUNT; i ++) { 209 | strip1.SetPixelColor(i, color); 210 | strip2.SetPixelColor(i, color); 211 | } 212 | strip1.Show(); 213 | strip2.Show(); 214 | 215 | // Setup WebSocket 216 | ws.onEvent(onEvent); 217 | server.addHandler(&ws); 218 | server.begin(); 219 | 220 | meter.attach(0.01,tickMeter); //Update Meter @100Hz 221 | //ipStatus.attach(1,printIP); //print IP @1Hz 222 | ESP_LOGV("bbMonitor","bbMonitor Setup Done"); 223 | } 224 | 225 | int retryTimes = 0; 226 | void printIP() { 227 | DynamicJsonDocument docIP(256); // Create a JSON document 228 | 229 | // Get the local IP address 230 | String ip = WiFi.localIP().toString(); 231 | 232 | // Add the IP address to the JSON document 233 | docIP["ip"] = ip; 234 | 235 | // Serialize the JSON document to a string 236 | String serialized; 237 | serializeJson(docIP, serialized); 238 | 239 | // Print the serialized JSON 240 | Serial.println(serialized); 241 | retryTimes ++; 242 | if(ip != "0.0.0.0" || retryTimes >= 3){ 243 | ipStatus.detach(); 244 | retryTimes = 0; 245 | } 246 | } 247 | 248 | void setupMDNS(){ 249 | if (!MDNS.begin("bbMonitor")) { 250 | ESP_LOGV("bbMonitor","Error setting up MDNS responder!"); 251 | } 252 | else{ 253 | MDNS.addService("bbMonitor", "tcp", 80); 254 | mdnsOn = true; 255 | } 256 | } 257 | 258 | void tickMeter(){ 259 | unsigned long currentTime = millis(); 260 | 261 | for (int i = 0; i < sizeof(pins) / sizeof(pins[0]); i++) { 262 | int targetValue = targetPWMValues[i]; 263 | int currentValue = currentPWMValues[i]; 264 | 265 | float progress = (smoothTime > 0) ? float(currentTime - smoothStartTime) / smoothTime : 1.0; 266 | if(progress > 1.0) progress = 1.0; 267 | int newValue = currentValue + (targetValue - currentValue) * progress; 268 | analogWrite(pins[i], newValue); 269 | if(progress == 1.0){ //transition done 270 | currentPWMValues[i] = targetPWMValues[i]; 271 | } 272 | } 273 | } 274 | 275 | void loop() { 276 | // put your main code here, to run repeatedly: 277 | if(!mdnsOn) setupMDNS(); 278 | animations1.UpdateAnimations(); 279 | animations2.UpdateAnimations(); 280 | animationsConfig.UpdateAnimations(); 281 | strip1.Show(); 282 | strip2.Show(); 283 | if (Serial.available()) { 284 | // Read the serial data 285 | String serialData = Serial.readStringUntil('\n'); 286 | 287 | // Parse JSON 288 | StaticJsonDocument<512> doc; 289 | DeserializationError error = deserializeJson(doc, serialData); 290 | if (error) { 291 | ESP_LOGV("bbMonitor","Failed to parse JSON"); 292 | return; 293 | } 294 | if (doc.containsKey("ssid") && doc.containsKey("password")) { 295 | // Extract SSID and password from JSON 296 | const char* ssid = doc["ssid"]; 297 | const char* password = doc["password"]; 298 | 299 | // Store SSID and password in preferences 300 | preferences.putString("ssid", ssid); 301 | preferences.putString("passwd", password); 302 | 303 | // Connect to WiFi 304 | ESP_LOGV("bbMonitor","Connecting to new WiFi..."); 305 | WiFi.disconnect(); 306 | WiFi.begin(ssid, password); 307 | ipStatus.attach(3,printIP); 308 | } 309 | else if (doc.containsKey("data")){ 310 | JsonArray data = doc["data"]; 311 | 312 | // Iterate through the array and set analogWrite values for defined pins 313 | smoothStartTime = millis(); 314 | for (int i = 0; i < data.size(); i++) { 315 | // Ensure pinIndex is within bounds 316 | if (i < sizeof(pins) / sizeof(pins[0])) { 317 | float pinValue = data[i].as(); // Extract the value from the array element 318 | int pinIndex = i; 319 | 320 | targetPWMValues[i] = MAX * pinValue; 321 | 322 | ESP_LOGV("bbMonitor","Set PWM value for Pin "); 323 | 324 | // Determine the strip and pixel index based on pinIndex 325 | int stripIndex = pinIndex < cols ? 0 : 1; 326 | int pixelIndex = (pinIndex & cols - 1) * EACH_PIXEL_COUNT; 327 | 328 | // Set NeoPixel animation based on pinValue 329 | setNeoPixelAnimation(stripIndex, pixelIndex, pinValue); 330 | } else { 331 | ESP_LOGV("bbMonitor","Invalid Pin Index"); 332 | } 333 | } 334 | } 335 | else if (doc.containsKey("config")){ 336 | luminence = doc["config"]["brightNess"].as(); 337 | smoothTime = doc["config"]["smoothTime"].as(); 338 | String jsonString; 339 | serializeJson(doc, jsonString); 340 | preferences.putString("config", jsonString); 341 | } 342 | else if (doc.containsKey("command")){ 343 | const char* command = doc["command"]; 344 | if (strcmp(command, "getId") == 0) { 345 | Serial.println("{\"Id\":\"bbMonitor\"}"); 346 | } 347 | else if(strcmp(command, "getConfig") == 0) { 348 | String config_current = preferences.getString("config", "{\"config\":{\"data\":[\"cpu_usage[0]\",\"cpu_usage[1]\",\"cpu_usage[2]\",\"cpu_usage[3]\",\"cpu_usage[4]\",\"cpu_usage[5]\",\"cpu_usage[6]\",\"cpu_usage[7]\"],\"brightNess\":128,\"smoothTime\":0}}"); 349 | Serial.println(config_current); 350 | } 351 | else if(strcmp(command, "configuring") == 0) { 352 | setConfigAnimation(); 353 | configuring.once(2,resetConfigingAnimation); 354 | } 355 | } 356 | } 357 | } 358 | 359 | uint16_t hue = 0; 360 | unsigned long lastUpdate = 0; 361 | int animationInterval = 10; // Adjust animation speed here 362 | 363 | void setConfigAnimation() { 364 | // Implement your rainbow loop animation here 365 | isConfigingAnimation = true; 366 | animationsConfig.StartAnimation(0, 2000, [=](const AnimationParam& param) { 367 | 368 | int hue = (param.progress * 360); 369 | 370 | for (int i = 0; i < PIXEL_COUNT; i++) { 371 | float pixelHue = static_cast(hue + (i * 360 / PIXEL_COUNT)) / 360.0f; 372 | strip1.SetPixelColor(i, HsbColor(pixelHue, 1.0f, 1.0f)); 373 | } 374 | 375 | for (int i = 0; i < PIXEL_COUNT; i++) { 376 | float pixelHue = static_cast(hue + (i * 360 / PIXEL_COUNT)) / 360.0f; 377 | strip2.SetPixelColor(i, HsbColor(pixelHue, 1.0f, 1.0f)); 378 | } 379 | 380 | strip1.Show(); 381 | strip2.Show(); 382 | }); 383 | } 384 | 385 | 386 | void setNeoPixelAnimation(int stripIndex, int pixelIndex, float pinValue) { 387 | if(isConfigingAnimation == false){ 388 | // Define animation parameters 389 | RgbColor green(0, luminence, 0); 390 | RgbColor red(luminence, 0, 0); 391 | 392 | // Calculate color based on pinValue 393 | RgbColor targetColor = RgbColor::LinearBlend(green, red, pinValue); 394 | // Set animation 395 | if (stripIndex == 0) { 396 | AnimUpdateCallback animUpdate = [=](const AnimationParam& param) 397 | { 398 | float progress = easing(param.progress); 399 | RgbColor color = RgbColor::LinearBlend(strip1.GetPixelColor(pixelIndex), targetColor, progress); 400 | for(int i = 0; i < EACH_PIXEL_COUNT; i ++) { 401 | strip1.SetPixelColor(pixelIndex + i, color); 402 | } 403 | }; 404 | animations1.StartAnimation(pixelIndex, 1000, animUpdate); 405 | } else { 406 | animations2.StartAnimation(pixelIndex, 1000, [targetColor, pixelIndex](const AnimationParam& param) { 407 | RgbColor color = RgbColor::LinearBlend(strip2.GetPixelColor(pixelIndex), targetColor, param.progress); 408 | for(int i = 0; i < EACH_PIXEL_COUNT; i ++) { 409 | strip2.SetPixelColor(pixelIndex + i, color); 410 | } 411 | }); 412 | } 413 | } 414 | } 415 | --------------------------------------------------------------------------------