denko 0.13.0 → 0.13.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/build_avr.yml +2 -4
- data/.github/workflows/build_esp32.yml +2 -3
- data/.github/workflows/build_esp8266.yml +2 -3
- data/.github/workflows/build_megaavr.yml +2 -4
- data/.github/workflows/build_ra4m1.yml +57 -0
- data/.github/workflows/build_rp2040.yml +2 -4
- data/.github/workflows/build_sam3x.yml +1 -3
- data/.github/workflows/build_samd.yml +2 -4
- data/CHANGELOG.md +60 -0
- data/DEPS_CLI.md +8 -6
- data/DEPS_IDE.md +9 -7
- data/HARDWARE.md +98 -75
- data/README.md +48 -59
- data/benchmarks/i2c_ssd1306_refresh.rb +74 -0
- data/examples/analog_io/ads1115.rb +57 -0
- data/examples/analog_io/ads1118.rb +8 -9
- data/examples/analog_io/dac_loopback.rb +6 -4
- data/examples/analog_io/input.rb +39 -36
- data/examples/connection/tcp.rb +1 -1
- data/examples/display/hd44780.rb +3 -3
- data/examples/display/ssd1306.rb +1 -1
- data/examples/pulse_io/buzzer.rb +40 -0
- data/examples/sensor/aht20.rb +1 -1
- data/lib/denko/analog_io/ads1115.rb +61 -0
- data/lib/denko/analog_io/ads1118.rb +10 -120
- data/lib/denko/analog_io/ads111x.rb +123 -0
- data/lib/denko/analog_io/output.rb +2 -1
- data/lib/denko/analog_io.rb +2 -0
- data/lib/denko/behaviors/bus_peripheral_addressed.rb +1 -1
- data/lib/denko/behaviors/component.rb +1 -1
- data/lib/denko/behaviors/input_pin.rb +3 -0
- data/lib/denko/behaviors/reader.rb +14 -13
- data/lib/denko/behaviors/single_pin.rb +1 -3
- data/lib/denko/behaviors/state.rb +1 -0
- data/lib/denko/behaviors/subcomponents.rb +2 -2
- data/lib/denko/board/core.rb +1 -1
- data/lib/denko/board/i2c.rb +1 -4
- data/lib/denko/board/map.rb +9 -0
- data/lib/denko/board/servo.rb +2 -6
- data/lib/denko/board.rb +32 -20
- data/lib/denko/connection/board_uart.rb +3 -3
- data/lib/denko/connection/flow_control.rb +10 -2
- data/lib/denko/digital_io/output.rb +1 -1
- data/lib/denko/display/hd44780.rb +18 -18
- data/lib/denko/led/seven_segment.rb +18 -19
- data/lib/denko/message.rb +6 -14
- data/lib/denko/one_wire/bus.rb +1 -1
- data/lib/denko/one_wire/{bus_enumeration.rb → bus_enumerator.rb} +16 -8
- data/lib/denko/one_wire/helper.rb +1 -1
- data/lib/denko/one_wire.rb +1 -1
- data/lib/denko/pulse_io/ir_transmitter.rb +1 -2
- data/lib/denko/sensor/ds18b20.rb +1 -1
- data/lib/denko/version.rb +1 -1
- data/lib/denko_cli/packages.rb +7 -1
- data/lib/denko_cli/targets.rb +8 -5
- data/lib/denko_cli/usage.txt +8 -4
- data/src/denko_ethernet.ino +15 -23
- data/src/denko_serial.ino +3 -14
- data/src/denko_wifi.ino +35 -50
- data/src/lib/Denko.cpp +23 -6
- data/src/lib/Denko.h +6 -16
- data/src/lib/DenkoCoreIO.cpp +3 -3
- data/src/lib/DenkoDefines.h +62 -16
- data/src/lib/DenkoEEPROM.cpp +9 -1
- data/src/lib/DenkoI2C.cpp +11 -9
- data/src/lib/DenkoLEDArray.cpp +1 -1
- data/target.yml +35 -1
- data/test/behaviors/reader_test.rb +8 -1
- data/test/board/helper_test.rb +0 -4
- data/test/display/hd44780_test.rb +10 -0
- data/test/led/seven_segment_test.rb +30 -8
- data/test/one_wire/bus_enumerator_test.rb +4 -0
- data/test/one_wire/helper_test.rb +5 -5
- data/test/sensor/ds18b20_test.rb +10 -0
- data/test/test_helper.rb +17 -2
- data/vendor/board-maps/.gitmodules +3 -0
- data/vendor/board-maps/BoardMap.h +40 -12
- data/vendor/board-maps/README.md +1 -0
- data/vendor/board-maps/lib/header_parser.rb +30 -5
- data/vendor/board-maps/run.rb +11 -1
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S3.yml +6 -1
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32S3_NOPSRAM.yml +6 -1
- data/vendor/board-maps/yaml/ADAFRUIT_FEATHER_ESP32_V2.yml +5 -1
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32S3_N4R2.yml +20 -0
- data/vendor/board-maps/yaml/ADAFRUIT_QTPY_ESP32_PICO.yml +2 -1
- data/vendor/board-maps/yaml/ARTRONSHOP_RP2_NANO.yml +32 -0
- data/vendor/board-maps/yaml/AVR_CIRCUITPLAY.yml +1 -1
- data/vendor/board-maps/yaml/AVR_ESPLORA.yml +1 -1
- data/vendor/board-maps/yaml/AVR_INDUSTRIAL101.yml +1 -1
- data/vendor/board-maps/yaml/AVR_LEONARDO.yml +1 -1
- data/vendor/board-maps/yaml/AVR_LEONARDO_ETH.yml +1 -1
- data/vendor/board-maps/yaml/AVR_LILYPAD_USB.yml +1 -1
- data/vendor/board-maps/yaml/AVR_LININO_ONE.yml +1 -1
- data/vendor/board-maps/yaml/AVR_MICRO.yml +1 -1
- data/vendor/board-maps/yaml/AVR_ROBOT_CONTROL.yml +1 -1
- data/vendor/board-maps/yaml/AVR_ROBOT_MOTOR.yml +1 -1
- data/vendor/board-maps/yaml/AVR_YUN.yml +1 -1
- data/vendor/board-maps/yaml/AVR_YUNMINI.yml +1 -1
- data/vendor/board-maps/yaml/BPI_LEAF_S3.yml +11 -1
- data/vendor/board-maps/yaml/BeeMotionS3.yml +6 -1
- data/vendor/board-maps/yaml/Bee_Motion.yml +3 -0
- data/vendor/board-maps/yaml/Bee_S3.yml +1 -1
- data/vendor/board-maps/yaml/CHALLENGER_2040_WIFI6_BLE_RP2040.yml +42 -0
- data/vendor/board-maps/yaml/CYTRON_MAKER_FEATHER_AIOT_S3.yml +4 -1
- data/vendor/board-maps/yaml/CoreESP32.yml +5 -1
- data/vendor/board-maps/yaml/D1_MINI32.yml +10 -1
- data/vendor/board-maps/yaml/DENKY.yml +10 -1
- data/vendor/board-maps/yaml/DENKY_PICOV3.yml +10 -1
- data/vendor/board-maps/yaml/DENKY_WROOM32.yml +10 -1
- data/vendor/board-maps/yaml/DFROBOT_FIREBEETLE_2_ESP32E.yml +6 -1
- data/vendor/board-maps/yaml/DPU_ESP32.yml +10 -1
- data/vendor/board-maps/yaml/D_Duino_32.yml +9 -1
- data/vendor/board-maps/yaml/ESP32S2_DEV.yml +11 -1
- data/vendor/board-maps/yaml/ESP32S2_THING_PLUS.yml +11 -1
- data/vendor/board-maps/yaml/ESP32S2_USB.yml +11 -1
- data/vendor/board-maps/yaml/ESP32_DEV.yml +10 -1
- data/vendor/board-maps/yaml/ESP32_DEVKIT_LIPO.yml +10 -1
- data/vendor/board-maps/yaml/ESP32_IOT_REDBOARD.yml +10 -1
- data/vendor/board-maps/yaml/ESP32_PICO.yml +10 -1
- data/vendor/board-maps/yaml/ESP32_S3_BOX.yml +4 -1
- data/vendor/board-maps/yaml/ESP32_THING.yml +10 -1
- data/vendor/board-maps/yaml/ESP32_THING_PLUS.yml +4 -1
- data/vendor/board-maps/yaml/ESP32_THING_PLUS_C.yml +4 -1
- data/vendor/board-maps/yaml/ESP32_WROOM_DA.yml +10 -1
- data/vendor/board-maps/yaml/ESP32_WROVER_KIT.yml +10 -1
- data/vendor/board-maps/yaml/ESPECTRO32.yml +10 -1
- data/vendor/board-maps/yaml/ESPea32.yml +10 -1
- data/vendor/board-maps/yaml/ESPino32.yml +10 -1
- data/vendor/board-maps/yaml/FEATHERS2.yml +11 -1
- data/vendor/board-maps/yaml/FEATHERS2NEO.yml +2 -1
- data/vendor/board-maps/yaml/FEATHERS3.yml +3 -0
- data/vendor/board-maps/yaml/FEATHER_ESP32.yml +5 -1
- data/vendor/board-maps/yaml/FRANZININHO_WIFI.yml +11 -1
- data/vendor/board-maps/yaml/FRANZININHO_WIFI_MSC.yml +11 -1
- data/vendor/board-maps/yaml/FROG_ESP32.yml +10 -1
- data/vendor/board-maps/yaml/HEALTHYPI_4.yml +10 -1
- data/vendor/board-maps/yaml/HONEYLEMON.yml +10 -1
- data/vendor/board-maps/yaml/HORNBILL_ESP32_DEV.yml +10 -1
- data/vendor/board-maps/yaml/HORNBILL_ESP32_MINIMA.yml +4 -1
- data/vendor/board-maps/yaml/IMBRIOS_LOGSENS_V1P1.yml +5 -1
- data/vendor/board-maps/yaml/LILYGO_T_DISPLAY_S3.yml +7 -1
- data/vendor/board-maps/yaml/LOLIN32.yml +10 -1
- data/vendor/board-maps/yaml/LOLIN32_LITE.yml +10 -1
- data/vendor/board-maps/yaml/LOLIN_D32.yml +10 -1
- data/vendor/board-maps/yaml/LOLIN_D32_PRO.yml +10 -1
- data/vendor/board-maps/yaml/LOLIN_S2_MINI.yml +11 -1
- data/vendor/board-maps/yaml/LOLIN_S2_PICO.yml +11 -1
- data/vendor/board-maps/yaml/LOLIN_S3.yml +9 -1
- data/vendor/board-maps/yaml/LOLIN_S3_MINI.yml +9 -1
- data/vendor/board-maps/yaml/LOLIN_S3_PRO.yml +9 -1
- data/vendor/board-maps/yaml/LoPy.yml +11 -1
- data/vendor/board-maps/yaml/LoPy4.yml +11 -1
- data/vendor/board-maps/yaml/MAGTAG29_ESP32S2.yml +11 -1
- data/vendor/board-maps/yaml/METRO_ESP32S2.yml +11 -1
- data/vendor/board-maps/yaml/MGBOT_IOTIK32A.yml +10 -1
- data/vendor/board-maps/yaml/MGBOT_IOTIK32B.yml +10 -1
- data/vendor/board-maps/yaml/MH_ET_LIVE_ESP32DEVKIT.yml +10 -1
- data/vendor/board-maps/yaml/MH_ET_LIVE_ESP32MINIKIT.yml +10 -1
- data/vendor/board-maps/yaml/MICROS2.yml +11 -1
- data/vendor/board-maps/yaml/MINIMA.yml +15 -0
- data/vendor/board-maps/yaml/NANO32.yml +10 -1
- data/vendor/board-maps/yaml/Node32s.yml +10 -1
- data/vendor/board-maps/yaml/NodeMCU_32S.yml +10 -1
- data/vendor/board-maps/yaml/ONEHORSE_ESP32_DEV.yml +11 -1
- data/vendor/board-maps/yaml/PIMORONI_PLASMA2040.yml +29 -0
- data/vendor/board-maps/yaml/PORTENTA_C33.yml +28 -0
- data/vendor/board-maps/yaml/PROS3.yml +6 -1
- data/vendor/board-maps/yaml/PYCOM_GPY.yml +11 -1
- data/vendor/board-maps/yaml/Piranha.yml +7 -1
- data/vendor/board-maps/yaml/Pocket32.yml +10 -1
- data/vendor/board-maps/yaml/QUANTUM.yml +10 -1
- data/vendor/board-maps/yaml/REDPILL_ESP32S3.yml +11 -1
- data/vendor/board-maps/yaml/RMP.yml +11 -1
- data/vendor/board-maps/yaml/SAMD_CIRCUITPLAYGROUND_EXPRESS.yml +0 -1
- data/vendor/board-maps/yaml/SAM_DUE.yml +3 -1
- data/vendor/board-maps/yaml/SONOFF_DUALR3.yml +10 -1
- data/vendor/board-maps/yaml/TAMC_TERMOD_S3.yml +11 -1
- data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1262.yml +6 -1
- data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1268.yml +6 -1
- data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1276.yml +6 -1
- data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1278.yml +6 -1
- data/vendor/board-maps/yaml/TBEAM_USE_RADIO_SX1280.yml +6 -1
- data/vendor/board-maps/yaml/TBeam.yml +6 -1
- data/vendor/board-maps/yaml/TINYPICO.yml +10 -1
- data/vendor/board-maps/yaml/TINYS2.yml +11 -1
- data/vendor/board-maps/yaml/TTGO_LoRa32_V1.yml +11 -1
- data/vendor/board-maps/yaml/TTGO_LoRa32_V2.yml +11 -1
- data/vendor/board-maps/yaml/TTGO_LoRa32_v21new.yml +11 -1
- data/vendor/board-maps/yaml/TTGO_T1.yml +10 -1
- data/vendor/board-maps/yaml/TTGO_T7_V13_Mini32.yml +10 -1
- data/vendor/board-maps/yaml/TTGO_T7_V14_Mini32.yml +10 -1
- data/vendor/board-maps/yaml/TWATCH_2020_V1.yml +0 -1
- data/vendor/board-maps/yaml/TWATCH_2020_V2.yml +0 -1
- data/vendor/board-maps/yaml/TWATCH_2020_V3.yml +0 -1
- data/vendor/board-maps/yaml/TWATCH_BASE.yml +0 -1
- data/vendor/board-maps/yaml/TWatch.yml +0 -1
- data/vendor/board-maps/yaml/UBLOX_NINA_W10.yml +10 -1
- data/vendor/board-maps/yaml/UNOWIFIR4.yml +17 -0
- data/vendor/board-maps/yaml/WIPY3.yml +11 -1
- data/vendor/board-maps/yaml/XIAO_ESP32S3.yml +2 -1
- data/vendor/board-maps/yaml/connaxio_espoir.yml +7 -1
- data/vendor/board-maps/yaml/esp32vn_iot_uno.yml +10 -1
- data/vendor/board-maps/yaml/heltec_wifi_32_lora_V3.yml +11 -1
- data/vendor/board-maps/yaml/heltec_wifi_kit_32.yml +11 -1
- data/vendor/board-maps/yaml/heltec_wifi_kit_32_V3.yml +11 -1
- data/vendor/board-maps/yaml/heltec_wifi_lora_32.yml +10 -1
- data/vendor/board-maps/yaml/heltec_wifi_lora_32_V2.yml +10 -1
- data/vendor/board-maps/yaml/heltec_wireless_stick.yml +10 -1
- data/vendor/board-maps/yaml/heltec_wireless_stick_LITE.yml +10 -1
- data/vendor/board-maps/yaml/openkb.yml +11 -1
- data/vendor/board-maps/yaml/roboheart_hercules.yml +10 -1
- data/vendor/board-maps/yaml/sensesiot_weizen.yml +10 -1
- data/vendor/board-maps/yaml/uPesy_WROOM.yml +10 -1
- data/vendor/board-maps/yaml/uPesy_WROVER.yml +10 -1
- data/vendor/board-maps/yaml/unphone8.yml +11 -1
- data/vendor/board-maps/yaml/unphone9.yml +11 -1
- metadata +15 -3
data/lib/denko_cli/usage.txt
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
|
2
2
|
Usage:
|
3
|
+
|
3
4
|
denko task [options]
|
4
5
|
|
5
6
|
Tasks:
|
7
|
+
|
6
8
|
sketch SKETCH [options]
|
7
9
|
help
|
8
10
|
targets
|
@@ -12,23 +14,25 @@
|
|
12
14
|
--target TARGET (default: mega. Run 'denko targets' for more info)
|
13
15
|
--debug (default: off)
|
14
16
|
|
15
|
-
Available sketches and
|
17
|
+
Available sketches and options specific to each sketch:
|
16
18
|
|
17
19
|
serial
|
18
|
-
--baud BAUD
|
20
|
+
--baud BAUD (default: 115200)
|
19
21
|
|
20
22
|
ethernet
|
21
23
|
--mac XX:XX:XX:XX:XX:XX (required)
|
22
24
|
--ip XXX.XXX.XXX.XXX (required, no DHCP)
|
23
25
|
--port PORT (default: 3466)
|
26
|
+
--baud BAUD (default: 115200, serial fallback)
|
24
27
|
|
25
28
|
wifi
|
26
29
|
--ssid SSID (required)
|
27
30
|
--password PASSWORD (required)
|
28
31
|
--port PORT (default: 3466)
|
32
|
+
--baud BAUD (default: 115200, serial fallback)
|
29
33
|
|
30
34
|
Examples:
|
31
35
|
|
32
36
|
denko sketch ethernet --mac 12:34:56:78:90:12 --ip 192.168.1.2
|
33
|
-
denko sketch serial
|
34
|
-
denko sketch serial
|
37
|
+
denko sketch serial --baud 57600 --target esp32
|
38
|
+
denko sketch serial --baud 9600 --target core
|
data/src/denko_ethernet.ino
CHANGED
@@ -2,17 +2,6 @@
|
|
2
2
|
#include <SPI.h>
|
3
3
|
#include <Ethernet.h>
|
4
4
|
|
5
|
-
// Define 'serial' as the serial interface to use.
|
6
|
-
// Uses SerialUSB (left port), which is native USB, on Arduino Due and Zero, or Serial otherwise.
|
7
|
-
// On many boards, eg. Arduino Due, RP2040, Serial may be native USB anyway.
|
8
|
-
#if defined(__SAM3X8E__) || defined(__SAMD21G18A__)
|
9
|
-
#define serial SerialUSB
|
10
|
-
// Use this for Programming USB port (right) on Due and Zero.
|
11
|
-
// #define serial Serial
|
12
|
-
#else
|
13
|
-
#define serial Serial
|
14
|
-
#endif
|
15
|
-
|
16
5
|
// Configure your MAC address, IP address, and HTTP port here.
|
17
6
|
byte mac[] = { 0xDE, 0xAD, 0xBE, 0x30, 0x31, 0x32 };
|
18
7
|
IPAddress ip(192,168,0,77);
|
@@ -31,8 +20,8 @@ void printEthernetStatus() {
|
|
31
20
|
|
32
21
|
void setup() {
|
33
22
|
// Wait for serial ready.
|
34
|
-
|
35
|
-
while(!
|
23
|
+
DENKO_SERIAL_IF.begin(115200);
|
24
|
+
while(!DENKO_SERIAL_IF);
|
36
25
|
|
37
26
|
// Explicitly disable the SD card.
|
38
27
|
pinMode(4,OUTPUT);
|
@@ -41,9 +30,7 @@ void setup() {
|
|
41
30
|
// Start up the network connection and server.
|
42
31
|
Ethernet.begin(mac, ip);
|
43
32
|
server.begin();
|
44
|
-
|
45
|
-
printEthernetStatus();
|
46
|
-
#endif
|
33
|
+
printEthernetStatus();
|
47
34
|
|
48
35
|
// Add listener callbacks for local logic.
|
49
36
|
denko.digitalListenCallback = onDigitalListen;
|
@@ -51,20 +38,25 @@ void setup() {
|
|
51
38
|
}
|
52
39
|
|
53
40
|
void loop() {
|
41
|
+
// End connection if client disconnects.
|
42
|
+
if (client && !client.connected()) {
|
43
|
+
client.stop();
|
44
|
+
}
|
45
|
+
|
54
46
|
// Allow one client at a time to be connected. Set it as the denko IO stream.
|
55
47
|
if (!client){
|
56
48
|
client = server.available();
|
57
|
-
if (client)
|
49
|
+
if (client) {
|
50
|
+
// TCP Client
|
51
|
+
denko.stream = &client;
|
52
|
+
} else {
|
53
|
+
// Serial fallback
|
54
|
+
denko.stream = &DENKO_SERIAL_IF;
|
55
|
+
}
|
58
56
|
}
|
59
57
|
|
60
58
|
// Main loop of the denko library.
|
61
59
|
denko.run();
|
62
|
-
|
63
|
-
// End the connection when client disconnects and revert to serial IO.
|
64
|
-
if (client && !client.connected()){
|
65
|
-
client.stop();
|
66
|
-
denko.stream = &serial;
|
67
|
-
}
|
68
60
|
}
|
69
61
|
|
70
62
|
// This runs every time a digital pin that denko is listening to changes value.
|
data/src/denko_serial.ino
CHANGED
@@ -2,24 +2,13 @@
|
|
2
2
|
|
3
3
|
Denko denko;
|
4
4
|
|
5
|
-
// Define 'serial' as the serial interface to use.
|
6
|
-
// Uses SerialUSB (left port), which is native USB, on Arduino Due and Zero, or Serial otherwise.
|
7
|
-
// On many boards, eg. Arduino Due, RP2040, Serial may be native USB anyway.
|
8
|
-
#if defined(__SAM3X8E__) || defined(__SAMD21G18A__)
|
9
|
-
#define serial SerialUSB
|
10
|
-
// Use this for Programming USB port (right) on Due and Zero.
|
11
|
-
// #define serial Serial
|
12
|
-
#else
|
13
|
-
#define serial Serial
|
14
|
-
#endif
|
15
|
-
|
16
5
|
void setup() {
|
17
6
|
// Wait for serial ready.
|
18
|
-
|
19
|
-
while(!
|
7
|
+
DENKO_SERIAL_IF.begin(115200);
|
8
|
+
while(!DENKO_SERIAL_IF);
|
20
9
|
|
21
10
|
// Pass serial stream to denko so it can read/write.
|
22
|
-
denko.stream = &
|
11
|
+
denko.stream = &DENKO_SERIAL_IF;
|
23
12
|
|
24
13
|
// Add listener callbacks for local logic.
|
25
14
|
denko.digitalListenCallback = onDigitalListen;
|
data/src/denko_wifi.ino
CHANGED
@@ -17,18 +17,6 @@
|
|
17
17
|
#define WIFI_STATUS_LED 13
|
18
18
|
#endif
|
19
19
|
|
20
|
-
|
21
|
-
// Define 'serial' as the serial interface to use.
|
22
|
-
// Uses SerialUSB (left port), which is native USB, on Arduino Due and Zero, or Serial otherwise.
|
23
|
-
// On many boards, eg. Arduino Due, RP2040, Serial may be native USB anyway.
|
24
|
-
#if defined(__SAM3X8E__) || defined(__SAMD21G18A__)
|
25
|
-
#define serial SerialUSB
|
26
|
-
// Use this for Programming USB port (right) on Due and Zero.
|
27
|
-
// #define serial Serial
|
28
|
-
#else
|
29
|
-
#define serial Serial
|
30
|
-
#endif
|
31
|
-
|
32
20
|
// Configure your WiFi options here. IP address is not configurable. Uses DHCP.
|
33
21
|
int port = 3466;
|
34
22
|
char* ssid = "yourNetwork";
|
@@ -50,16 +38,16 @@ void indicateWiFi(byte value) {
|
|
50
38
|
}
|
51
39
|
|
52
40
|
void printWifiStatus() {
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
41
|
+
DENKO_SERIAL_IF.println("WiFi Connected");
|
42
|
+
DENKO_SERIAL_IF.print("SSID: ");
|
43
|
+
DENKO_SERIAL_IF.println(WiFi.SSID());
|
44
|
+
DENKO_SERIAL_IF.print("Signal Strength (RSSI):");
|
45
|
+
DENKO_SERIAL_IF.print(WiFi.RSSI());
|
46
|
+
DENKO_SERIAL_IF.println(" dBm");
|
47
|
+
DENKO_SERIAL_IF.print("IP Address: ");
|
48
|
+
DENKO_SERIAL_IF.println(WiFi.localIP());
|
49
|
+
DENKO_SERIAL_IF.print("Denko TCP Port: ");
|
50
|
+
DENKO_SERIAL_IF.println(port);
|
63
51
|
indicateWiFi(true);
|
64
52
|
}
|
65
53
|
|
@@ -70,37 +58,29 @@ void connect(){
|
|
70
58
|
#endif
|
71
59
|
|
72
60
|
// Try to connect.
|
73
|
-
|
61
|
+
DENKO_SERIAL_IF.print("Connecting to WiFi ");
|
74
62
|
WiFi.begin(ssid, pass);
|
75
63
|
|
76
64
|
// Delay until connected.
|
77
65
|
while (WiFi.status() != WL_CONNECTED) {
|
78
66
|
delay(500);
|
79
|
-
|
67
|
+
DENKO_SERIAL_IF.print(".");
|
80
68
|
}
|
81
69
|
connected = true;
|
70
|
+
printWifiStatus();
|
82
71
|
}
|
83
72
|
|
84
73
|
void maintainWiFi(){
|
85
|
-
if (
|
86
|
-
if (WiFi.status() == WL_CONNECTED) return;
|
74
|
+
if (WiFi.status() != WL_CONNECTED) {
|
87
75
|
connected = false;
|
88
76
|
connect();
|
89
77
|
}
|
90
|
-
if (connected == false){
|
91
|
-
if (WiFi.status() != WL_CONNECTED) {
|
92
|
-
connect();
|
93
|
-
return;
|
94
|
-
}
|
95
|
-
connected = true;
|
96
|
-
printWifiStatus();
|
97
|
-
}
|
98
78
|
}
|
99
79
|
|
100
80
|
void setup() {
|
101
81
|
// Wait for serial ready.
|
102
|
-
|
103
|
-
while(!
|
82
|
+
DENKO_SERIAL_IF.begin(115200);
|
83
|
+
while(!DENKO_SERIAL_IF);
|
104
84
|
|
105
85
|
// Enable over the air updates on the ESP8266.
|
106
86
|
#if defined(ESP8266)
|
@@ -117,33 +97,38 @@ void setup() {
|
|
117
97
|
denko.digitalListenCallback = onDigitalListen;
|
118
98
|
denko.analogListenCallback = onAnalogListen;
|
119
99
|
|
120
|
-
// Use
|
121
|
-
denko.stream = &
|
100
|
+
// Use DENKO_SERIAL_IF as the denko IO stream until we get a TCP connection.
|
101
|
+
denko.stream = &DENKO_SERIAL_IF;
|
122
102
|
}
|
123
103
|
|
124
104
|
void loop() {
|
125
105
|
// Reconnect if we've lost WiFi.
|
126
106
|
maintainWiFi();
|
127
107
|
|
108
|
+
// Handle OTA updates.
|
109
|
+
#if defined(ESP8266)
|
110
|
+
ArduinoOTA.handle();
|
111
|
+
#endif
|
112
|
+
|
113
|
+
// End connection if client disconnects.
|
114
|
+
if (client && !client.connected()) {
|
115
|
+
client.stop();
|
116
|
+
}
|
117
|
+
|
128
118
|
// Allow one client at a time to be connected. Set it as the denko IO stream.
|
129
119
|
if (!client){
|
130
120
|
client = server.available();
|
131
|
-
if (client)
|
121
|
+
if (client) {
|
122
|
+
// TCP Client
|
123
|
+
denko.stream = &client;
|
124
|
+
} else {
|
125
|
+
// Serial fallback
|
126
|
+
denko.stream = &DENKO_SERIAL_IF;
|
127
|
+
}
|
132
128
|
}
|
133
129
|
|
134
130
|
// Main loop of the denko library.
|
135
131
|
denko.run();
|
136
|
-
|
137
|
-
// End the connection when client disconnects and revert to serial IO.
|
138
|
-
if (client && !client.connected()){
|
139
|
-
client.stop();
|
140
|
-
denko.stream = &serial;
|
141
|
-
}
|
142
|
-
|
143
|
-
// Handle OTA updates.
|
144
|
-
#if defined(ESP8266)
|
145
|
-
ArduinoOTA.handle();
|
146
|
-
#endif
|
147
132
|
}
|
148
133
|
|
149
134
|
// This runs every time a digital pin that denko is listening to changes value.
|
data/src/lib/Denko.cpp
CHANGED
@@ -36,7 +36,7 @@ void Denko::run(){
|
|
36
36
|
parse(stream->read());
|
37
37
|
rxBytes ++;
|
38
38
|
// Acknowledge when we've received half as many bytes as the serial buffer.
|
39
|
-
if (rxBytes >=
|
39
|
+
if (rxBytes >= DENKO_RX_ACK_INTERVAL) rxNotify();
|
40
40
|
}
|
41
41
|
|
42
42
|
#ifdef DENKO_UARTS
|
@@ -113,7 +113,7 @@ void Denko::process() {
|
|
113
113
|
case 6: setListener (pin, val, auxMsg[0], auxMsg[1], false); break;
|
114
114
|
|
115
115
|
// Implemented in DenkoEEPROM.cpp
|
116
|
-
#ifdef
|
116
|
+
#ifdef DENKO_EEPROM
|
117
117
|
case 7: eepromRead (); break;
|
118
118
|
case 8: eepromWrite (); break;
|
119
119
|
#endif
|
@@ -198,6 +198,7 @@ void Denko::process() {
|
|
198
198
|
case 90: handshake (); break;
|
199
199
|
case 91: resetState (); break;
|
200
200
|
case 92: sendReady (); break;
|
201
|
+
case 93: enumerate (); break;
|
201
202
|
case 95: setRegisterDivider (); break;
|
202
203
|
case 96: setAnalogWriteResolution (); break;
|
203
204
|
case 97: setAnalogReadResolution (); break;
|
@@ -262,19 +263,27 @@ void Denko::handshake() {
|
|
262
263
|
#ifdef DENKO_VERSION
|
263
264
|
stream->print(DENKO_VERSION);
|
264
265
|
#endif
|
266
|
+
|
267
|
+
// Third is serial buffer size.
|
268
|
+
stream->print(',');
|
269
|
+
stream->print(DENKO_SERIAL_BUFFER_SIZE);
|
265
270
|
|
266
|
-
//
|
271
|
+
// Fourth is AUX_SIZE.
|
267
272
|
stream->print(',');
|
268
273
|
stream->print(AUX_SIZE);
|
269
274
|
|
270
|
-
//
|
275
|
+
// Fifth is EEPROM size. None on Due or Zero.
|
271
276
|
stream->print(',');
|
272
277
|
#if defined(EEPROM_EMULATED)
|
273
278
|
stream->print(EMULATED_EEPROM_LENGTH);
|
274
279
|
#elif defined(EEPROM_PRESENT)
|
275
280
|
stream->print(EEPROM.length());
|
276
|
-
#
|
277
|
-
|
281
|
+
#endif
|
282
|
+
|
283
|
+
// Sixth is I2C buffer size.
|
284
|
+
stream->print(',');
|
285
|
+
#ifdef DENKO_I2C
|
286
|
+
stream->print(DENKO_I2C_BUFFER_SIZE);
|
278
287
|
#endif
|
279
288
|
|
280
289
|
// End
|
@@ -297,6 +306,14 @@ void Denko::resetState() {
|
|
297
306
|
lastTime = micros();
|
298
307
|
}
|
299
308
|
|
309
|
+
// CMD = 93
|
310
|
+
void Denko::enumerate() {
|
311
|
+
stream->print("ENUMERATION:");
|
312
|
+
#ifdef A0
|
313
|
+
stream->println(A0);
|
314
|
+
#endif
|
315
|
+
}
|
316
|
+
|
300
317
|
// CMD = 95
|
301
318
|
// Set the register read divider. Powers of 2 up to 128 are valid.
|
302
319
|
void Denko::setRegisterDivider() {
|
data/src/lib/Denko.h
CHANGED
@@ -154,6 +154,8 @@ class Denko {
|
|
154
154
|
void spiClearListeners ();
|
155
155
|
|
156
156
|
// I2C
|
157
|
+
bool i2cStarted = false;
|
158
|
+
byte i2cSpeed = 0;
|
157
159
|
void i2cBegin ();
|
158
160
|
void i2cEnd ();
|
159
161
|
void i2cSetSpeed (uint8_t code);
|
@@ -175,6 +177,7 @@ class Denko {
|
|
175
177
|
//
|
176
178
|
void handshake (); //cmd = 90
|
177
179
|
void resetState (); //cmd = 91
|
180
|
+
void enumerate (); //cmd = 92
|
178
181
|
void setRegisterDivider (); //cmd = 97
|
179
182
|
void setAnalogWriteResolution (); //cmd = 96
|
180
183
|
void setAnalogReadResolution (); //cmd = 97
|
@@ -205,30 +208,17 @@ class Denko {
|
|
205
208
|
//
|
206
209
|
// Flow control stuff.
|
207
210
|
//
|
208
|
-
// Notify
|
209
|
-
//
|
211
|
+
// Notify computer that board has received bytes.
|
210
212
|
void rxNotify();
|
211
213
|
uint8_t rxBytes = 0;
|
212
|
-
//
|
213
|
-
// ESP32 uses a 128 byte FIFO buffer for UART Rx. Notify every 63 bytes instead of 32
|
214
|
-
// so serial over native USB performs better.
|
215
|
-
//
|
216
|
-
// Using 63 instead of 64 since the ATmega32u4 (Leonardo) is limited to 63.
|
217
|
-
//
|
218
|
-
#ifdef ESP32
|
219
|
-
uint8_t rxNotifyLimit = 63;
|
220
|
-
#else
|
221
|
-
uint8_t rxNotifyLimit = 32;
|
222
|
-
#endif
|
223
|
-
|
224
214
|
//
|
225
215
|
// Tell the computer to halt or resume sending data to the board.
|
226
216
|
//
|
227
|
-
//
|
217
|
+
// Use these if running a function on the board that disables interrupts for
|
228
218
|
// longer than a single serial character (~85us at 115,200 baud).
|
229
219
|
//
|
230
220
|
// If the function was initiated by the computer (eg. writing to a WS2812 strip), do
|
231
|
-
// not call sendHalt(). The computer should
|
221
|
+
// not call sendHalt(). The computer should halt transmission itself after sending
|
232
222
|
// the WS2812 command. Only call sendReady() after data is written out to the strip.
|
233
223
|
//
|
234
224
|
// If the function was initiated on the board (eg. New IR input triggered by an interrupt),
|
data/src/lib/DenkoCoreIO.cpp
CHANGED
@@ -27,8 +27,8 @@ void Denko::setMode(byte p, byte m) {
|
|
27
27
|
if (m != 0b100) dacDisable(p);
|
28
28
|
#endif
|
29
29
|
|
30
|
-
// On the SAMD21, mode needs to be INPUT when using the DAC.
|
31
|
-
#
|
30
|
+
// On the SAMD21 and RA4M1, mode needs to be INPUT when using the DAC.
|
31
|
+
#if defined(__SAMD21G18A__) || defined(_RENESAS_RA_)
|
32
32
|
if (m == 0b100){
|
33
33
|
pinMode(p, INPUT);
|
34
34
|
return;
|
@@ -196,7 +196,7 @@ void Denko::dacWrite(byte p, int v, boolean echo) {
|
|
196
196
|
::dacWrite(p, v);
|
197
197
|
#endif
|
198
198
|
|
199
|
-
#if defined(__SAM3X8E__) || defined(__SAMD21G18A__)
|
199
|
+
#if defined(__SAM3X8E__) || defined(__SAMD21G18A__) || defined(_RENESAS_RA_)
|
200
200
|
analogWrite(p, v);
|
201
201
|
#endif
|
202
202
|
}
|
data/src/lib/DenkoDefines.h
CHANGED
@@ -8,6 +8,7 @@
|
|
8
8
|
#define DENKO_VERSION __VERSION__
|
9
9
|
|
10
10
|
// Uncomment these to include features beyond core features.
|
11
|
+
// #define DENKO_EEPROM
|
11
12
|
// #define DENKO_ONE_WIRE
|
12
13
|
// #define DENKO_TONE
|
13
14
|
// #define DENKO_SPI_BB
|
@@ -39,30 +40,24 @@
|
|
39
40
|
#define PIN_COUNT 22
|
40
41
|
#endif
|
41
42
|
|
42
|
-
// No EEPROM on the Due or Zero.
|
43
|
-
#if !defined(__SAM3X8E__) && !defined(__SAMD21G18A__)
|
44
|
-
#define EEPROM_PRESENT
|
45
|
-
#include <EEPROM.h>
|
46
|
-
#endif
|
47
|
-
|
48
|
-
// Emulate 512 bytes of EEPROM on ESP chips and the RP2040.
|
49
|
-
#if defined(ESP8266) || defined(ESP32) || defined(ARDUINO_ARCH_RP2040)
|
50
|
-
# define EEPROM_EMULATED
|
51
|
-
# define EMULATED_EEPROM_LENGTH 512
|
52
|
-
#endif
|
53
|
-
|
54
43
|
// Figure out how many LEDC channels are available on ESP32 boards.
|
55
44
|
#ifdef ESP32
|
56
|
-
#
|
45
|
+
#if CONFIG_IDF_TARGET_ESP32
|
46
|
+
#define LEDC_CHANNEL_COUNT 16
|
47
|
+
#elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
|
48
|
+
#define LEDC_CHANNEL_COUNT 8
|
49
|
+
#elif CONFIG_IDF_TARGET_ESP32C3
|
50
|
+
#define LEDC_CHANNEL_COUNT 6
|
51
|
+
#endif
|
57
52
|
#endif
|
58
53
|
|
59
54
|
// Filter for boards that can set their analog write resolution.
|
60
|
-
#if defined(__SAM3X8E__) || defined(__SAMD21G18A__) || defined(ESP32) || defined(ARDUINO_ARCH_RP2040) || defined(ESP8266)
|
55
|
+
#if defined(__SAM3X8E__) || defined(__SAMD21G18A__) || defined(_RENESAS_RA_) || defined(ESP32) || defined(ARDUINO_ARCH_RP2040) || defined(ESP8266)
|
61
56
|
#define WRITE_RESOLUTION_SETTER
|
62
57
|
#endif
|
63
58
|
|
64
59
|
// Filter for boards that can set their analog read resolution.
|
65
|
-
#if defined(__SAM3X8E__) || defined(__SAMD21G18A__) || defined(ESP32) || defined(ARDUINO_ARCH_RP2040)
|
60
|
+
#if defined(__SAM3X8E__) || defined(__SAMD21G18A__) || defined(_RENESAS_RA_) || defined(ESP32) || defined(ARDUINO_ARCH_RP2040)
|
66
61
|
#define READ_RESOLUTION_SETTER
|
67
62
|
#endif
|
68
63
|
|
@@ -88,7 +83,7 @@
|
|
88
83
|
#elif defined(ESP8266) && defined(SERIAL_PORT_HARDWARE_OPEN)
|
89
84
|
#define DENKO_UARTS 1
|
90
85
|
|
91
|
-
// This works for all the Atmel cores.
|
86
|
+
// This works for all the Atmel cores except RA4M1.
|
92
87
|
#else
|
93
88
|
#if defined(SERIAL_PORT_HARDWARE3)
|
94
89
|
#define DENKO_UARTS 3
|
@@ -114,3 +109,54 @@
|
|
114
109
|
#else
|
115
110
|
#define AUX_SIZE 272
|
116
111
|
#endif
|
112
|
+
|
113
|
+
// Define 'DENKO_SERIAL_IF' as the serial interface to use.
|
114
|
+
// Uses SerialUSB (left port), which is native USB, on Arduino Due & Zero, or Serial otherwise.
|
115
|
+
// On many boards, eg. Arduino Leonardo, RP2040, ESP32-S3, Serial is native USB regardless.
|
116
|
+
#if defined(__SAM3X8E__) || defined(__SAMD21G18A__)
|
117
|
+
#define DENKO_SERIAL_IF SerialUSB
|
118
|
+
#define DENKO_USB_CDC
|
119
|
+
// To use programming USB (right) on Due and Zero, comment 2 lines above, uncomment 1 line below.
|
120
|
+
// #define DENKO_SERIAL_IF Serial
|
121
|
+
#else
|
122
|
+
#define DENKO_SERIAL_IF Serial
|
123
|
+
#endif
|
124
|
+
|
125
|
+
// Figure out how much serial buffer we have, tell the computer, and set the ack interval.
|
126
|
+
// Best performance acknowledging at 64 bytes, or 32 if buffer is only 64.
|
127
|
+
//
|
128
|
+
// These are 256/64 regardless of whether native USB CDC or UART bridge.
|
129
|
+
#if defined(ARDUINO_ARCH_RP2040) || defined(ESP32) || defined(ESP8266) || defined(__SAM3X8E__)
|
130
|
+
#define DENKO_SERIAL_BUFFER_SIZE 256
|
131
|
+
#define DENKO_RX_ACK_INTERVAL 64
|
132
|
+
// RA4M1 has a 512 Serial buffer.
|
133
|
+
#elif defined(_RENESAS_RA_)
|
134
|
+
#define DENKO_SERIAL_BUFFER_SIZE 512
|
135
|
+
#define DENKO_RX_ACK_INTERVAL 64
|
136
|
+
// SAMD21 is 256/64 in native USB mode ONLY. Must use defaults on programming port to avoid data loss.
|
137
|
+
#elif defined(__SAMD21G18A__) && defined(DENKO_USB_CDC)
|
138
|
+
#define DENKO_SERIAL_BUFFER_SIZE 256
|
139
|
+
#define DENKO_RX_ACK_INTERVAL 64
|
140
|
+
// 32u4 is odd. Size is 63 instead of 64. Interval must be 31. 32 doesn't work at all. Off by 1 errors?
|
141
|
+
#elif defined(__AVR_ATmega32U4__)
|
142
|
+
#define DENKO_SERIAL_BUFFER_SIZE 63
|
143
|
+
#define DENKO_RX_ACK_INTERVAL 31
|
144
|
+
// Defaults
|
145
|
+
#else
|
146
|
+
#define DENKO_SERIAL_BUFFER_SIZE 64
|
147
|
+
#define DENKO_RX_ACK_INTERVAL 32
|
148
|
+
#endif
|
149
|
+
|
150
|
+
// Figure out how big the buffer is on the built-in Wire / I2C library.
|
151
|
+
#ifdef DENKO_I2C
|
152
|
+
// RP2040 and SAMD21 can do up to 256, but 255 since 1 byte for length.
|
153
|
+
#if defined(ARDUINO_ARCH_RP2040) || defined(__SAMD21G18A__)
|
154
|
+
#define DENKO_I2C_BUFFER_SIZE 255
|
155
|
+
// ESP32, ESP8266 and megaAVR can do up to 128.
|
156
|
+
#elif defined(ESP32) || defined(ESP8266) || defined(__AVR_ATmega4809__)
|
157
|
+
#define DENKO_I2C_BUFFER_SIZE 128
|
158
|
+
// Fall back to 32 bytes.
|
159
|
+
#else
|
160
|
+
#define DENKO_I2C_BUFFER_SIZE 32
|
161
|
+
#endif
|
162
|
+
#endif
|
data/src/lib/DenkoEEPROM.cpp
CHANGED
@@ -3,7 +3,15 @@
|
|
3
3
|
//
|
4
4
|
#include "Denko.h"
|
5
5
|
|
6
|
-
#ifdef
|
6
|
+
#ifdef DENKO_EEPROM
|
7
|
+
#include <EEPROM.h>
|
8
|
+
|
9
|
+
// Emulate 512 bytes of EEPROM on ESP chips and the RP2040.
|
10
|
+
#if defined(ESP8266) || defined(ESP32) || defined(ARDUINO_ARCH_RP2040)
|
11
|
+
#define EEPROM_EMULATED
|
12
|
+
#define EMULATED_EEPROM_LENGTH 512
|
13
|
+
#endif
|
14
|
+
|
7
15
|
// CMD = 6
|
8
16
|
// Read from the microcontroller's EEPROM.
|
9
17
|
//
|
data/src/lib/DenkoI2C.cpp
CHANGED
@@ -6,20 +6,20 @@
|
|
6
6
|
|
7
7
|
#include <Wire.h>
|
8
8
|
|
9
|
-
bool i2cStarted = false;
|
10
|
-
|
11
9
|
// Only start the I2C interface if not already started.
|
12
10
|
// Lazy initialization in case user wants to use I2C pins for something else.
|
13
11
|
void Denko::i2cBegin() {
|
14
12
|
if (!i2cStarted) {
|
15
13
|
Wire.begin();
|
16
14
|
i2cStarted = true;
|
15
|
+
i2cSetSpeed(0);
|
17
16
|
}
|
18
17
|
}
|
19
18
|
|
20
19
|
// End the I2C interface.
|
21
20
|
// This is mostly used as a Reset in Denko::handshake.
|
22
21
|
void Denko::i2cEnd(){
|
22
|
+
i2cSetSpeed(0);
|
23
23
|
// ESP8266 core does not define Wire.end()
|
24
24
|
#ifndef ESP8266
|
25
25
|
Wire.end();
|
@@ -36,6 +36,7 @@ void Denko::i2cSetSpeed(uint8_t code) {
|
|
36
36
|
case 3: Wire.setClock(3400000); break;
|
37
37
|
default: Wire.setClock(100000); break;
|
38
38
|
}
|
39
|
+
i2cSpeed = code;
|
39
40
|
}
|
40
41
|
|
41
42
|
// CMD = 33
|
@@ -43,7 +44,8 @@ void Denko::i2cSetSpeed(uint8_t code) {
|
|
43
44
|
void Denko::i2cSearch() {
|
44
45
|
byte error;
|
45
46
|
uint8_t addr;
|
46
|
-
i2cBegin();
|
47
|
+
if (!i2cStarted) i2cBegin();
|
48
|
+
i2cSetSpeed(0);
|
47
49
|
stream->print(SDA);
|
48
50
|
|
49
51
|
// Only addresses from 0x08 to 0x77 are usable (8 to 127).
|
@@ -77,10 +79,10 @@ void Denko::i2cWrite() {
|
|
77
79
|
uint8_t dataLength = (uint8_t)val;
|
78
80
|
|
79
81
|
// Limit to 32 bytes.
|
80
|
-
if (dataLength >
|
82
|
+
if (dataLength > DENKO_I2C_BUFFER_SIZE) dataLength = DENKO_I2C_BUFFER_SIZE;
|
81
83
|
|
82
|
-
i2cBegin();
|
83
|
-
i2cSetSpeed(auxMsg[0]);
|
84
|
+
if (!i2cStarted) i2cBegin();
|
85
|
+
if (i2cSpeed != auxMsg[0]) i2cSetSpeed(auxMsg[0]);
|
84
86
|
|
85
87
|
Wire.beginTransmission(address);
|
86
88
|
Wire.write(&auxMsg[1], dataLength);
|
@@ -116,10 +118,10 @@ void Denko::i2cRead() {
|
|
116
118
|
uint8_t dataLength = (uint8_t)val;
|
117
119
|
|
118
120
|
// Limit to 32 bytes.
|
119
|
-
if (dataLength >
|
121
|
+
if (dataLength > DENKO_I2C_BUFFER_SIZE) dataLength = DENKO_I2C_BUFFER_SIZE;
|
120
122
|
|
121
|
-
i2cBegin();
|
122
|
-
i2cSetSpeed(auxMsg[0]);
|
123
|
+
if (!i2cStarted) i2cBegin();
|
124
|
+
if (i2cSpeed != auxMsg[0]) i2cSetSpeed(auxMsg[0]);
|
123
125
|
|
124
126
|
// Optionally write up to a 4 byte register address before reading.
|
125
127
|
if ((auxMsg[1] > 0) && (auxMsg[1] < 5)) {
|
data/src/lib/DenkoLEDArray.cpp
CHANGED
data/target.yml
CHANGED
@@ -1,3 +1,37 @@
|
|
1
|
+
# name: rp2040
|
2
|
+
# fqbn: rp2040:rp2040:rpipicow
|
3
|
+
# port: /dev/cu.usbmodem14B01
|
4
|
+
|
5
|
+
# name: mega
|
6
|
+
# fqbn: arduino:avr:uno
|
7
|
+
# ort: /dev/cu.usbmodem14B01
|
8
|
+
|
9
|
+
# name: mega
|
10
|
+
# fqbn: arduino:avr:mega
|
11
|
+
# port: /dev/cu.usbmodem14C01
|
12
|
+
|
1
13
|
name: mega
|
2
|
-
fqbn: arduino:avr:
|
14
|
+
fqbn: arduino:avr:leonardo
|
3
15
|
port: /dev/cu.usbmodem14B01
|
16
|
+
|
17
|
+
# name: esp32
|
18
|
+
# fqbn: esp32:esp32:esp32doit-devkit-v1
|
19
|
+
# port: /dev/cu.SLAB_USBtoUART
|
20
|
+
|
21
|
+
# name: esp8266
|
22
|
+
# fqbn: esp8266:esp8266:nodemcuv2
|
23
|
+
# port: /dev/cu.SLAB_USBtoUART
|
24
|
+
|
25
|
+
# name: sam3x
|
26
|
+
# fqbn: arduino:sam:arduino_due_x
|
27
|
+
# port: /dev/cu.usbmodem14C0
|
28
|
+
|
29
|
+
# name: samd
|
30
|
+
# fqbn: arduino:samd:arduino_zero_native
|
31
|
+
# port: /dev/cu.usbmodem14C01
|
32
|
+
|
33
|
+
# Native USB ESP32 shouldn't be used since this doesn't enable USB CDC on boot.
|
34
|
+
|
35
|
+
# name: esp32
|
36
|
+
# fqbn: esp32:esp32:lolin_s3
|
37
|
+
# port: /dev/cu.usbmodem14C01
|