TME offers a PCB-mount LSA terminal:
Electronics
Comprehensive AWG to mm² area / mm diameter chart
This chart covers wire sizes from 0000 AWG to AWG41
AWG | mm² area | mm diameter |
---|---|---|
4/0 or 0000 AWG | 107 | 11.68 mm |
3/0 or 000 AWG | 85 | 10.40384 mm |
2/0 or 00 AWG | 67.4 mm² | 9.26592 mm |
0 AWG | 53.5 mm² | 8.25246 mm |
1 AWG | 42.4 mm² | 7.35 mm |
2 AWG | 33.6 mm² | 6.54 mm |
3 AWG | 26.7 mm² | 5.83 mm |
4 AWG | 21.2 mm² | 5.19 mm |
5 AWG | 16.8 mm² | 4.62 mm |
6 AWG | 13.3 mm² | 4.11 mm |
7 AWG | 10.6 mm² | 3.67 mm |
8 AWG | 8.35 mm² | 3.26 mm |
9 AWG | 6.62 mm² | 2.91 mm |
10 AWG | 5.27 mm² | 2.59 mm |
11 AWG | 4.15 mm² | 2.3 mm |
12 AWG | 3.31 mm² | 2.05 mm |
13 AWG | 2.63 mm² | 1.83 mm |
14 AWG | 2.08 mm² | 1.63 mm |
15 AWG | 1.65 mm² | 1.45 mm |
16 AWG | 1.31 mm² | 1.29 mm |
17 AWG | 1.04 mm² | 1.15 mm |
18 AWG | 0.823 mm² | 1.024 mm |
19 AWG | 0.653 mm² | 0.912 mm |
20 AWG | 0.519 mm² | 0.812 mm |
21 AWG | 0.412 mm² | 0.723 mm |
22 AWG | 0.325 mm² | 0.644 mm |
23 AWG | 0.259 mm² | 0.573 mm |
24 AWG | 0.205 mm² | 0.511 mm |
25 AWG | 0.163 mm² | 0.455 mm |
26 AWG | 0.128 mm² | 0.405 mm |
27 AWG | 0.102 mm² | 0.361 mm |
28 AWG | 0.0804 mm² | 0.321 mm |
29 AWG | 0.0646 mm² | 0.286 mm |
30 AWG | 0.0503 mm² | 0.255 mm |
31 AWG | 0.0404 mm² | 0.16002 mm |
32 AWG | 0.0320 mm² | 0.2032 mm |
33 AWG | 0.0254 mm² | 0.18034 mm |
34 AWG | 0.0201 mm² | 0.16002 mm |
35 AWG | 0.0160 mm² | 0.14224 mm |
36 AWG | 0.0127 mm² | 0.12700 mm |
37 AWG | 0.0100 mm² | 0.11430 mm |
38 AWG | 0.00797 mm² | 0.10160 mm |
39 AWG | 0.00632 mm² | 0.08890 mm |
40 AWG | 0.00501 mm² | 0.07874 mm |
What are typical insertion & withdrawal forces for PCIe connectors?
This Amphenol datasheet lists 1.15 N/pin
insertion force and 0.15 N/pin
withdrawal force.
Based on these values:
- A PCIe x1 connector with 36 pins
- insertion force of
36*1.15N = 41.4 N = 4.22 kgf
and - withdrawal force of
36*0.15N = 5.4 N = 0.551 kgf
- insertion force of
- A PCIe x4 connector with 64 pins
- insertion force of
64*1.15N = 73.6 N = 7.505 kgf
and - withdrawal force of
64*0.15N = 9.6 N = 0.979 kgf
- insertion force of
- A PCIe x8 connector with 98 pins
- insertion force of
98*1.15N = 112.7 N = 11.492 kgf
and - withdrawal force of
98*0.15N = 14.7 N = 1.499 kgf
- insertion force of
- A PCIe x16 connector with 164 pins
- insertion force of
164*1.15N = 188.6 N = 19.232 kgf
and - withdrawal force of
164*0.15N = 24.6 N = 2.509 kgf
- insertion force of
- A PCIe x24 connector with 230 pins
- insertion force of
230*1.15N = 264.5 N = 4.22 kgf
and - withdrawal force of
230*0.15N = 34.5 N = 3.518 kgf
- insertion force of
How many pins does a PCIe connector have?
A PCIe x1 connector has 36 pins (18 pins on each side)
A PCIe x4 connector has 64 pins (32 pins on each side)
A PCIe x8 connector has 98 pins (49 pins on each side)
A PCIe x16 connector has 164 pins (82 pins on each side)
A PCIe x24 connector has 230 pins (115 pins on each side)
Source: Samtec catalog, Amphenol datasheet (x24)
Minimal ESP32 NTP client example using NTPClient_Generic and PlatformIO
Example of using NTPClient_Generic
main.cpp
#include <Arduino.h> #include <WiFi.h> #include <NTPClient_Generic.h> #define TIME_ZONE_OFFSET_HRS 1 // UTC+1 for Germany, winter time #define NTP_UPDATE_INTERVAL_MS 60000L // Update every 60s automatically WiFiUDP ntpUDP; NTPClient ntpClient(ntpUDP, "europe.pool.ntp.org", (3600 * TIME_ZONE_OFFSET_HRS), NTP_UPDATE_INTERVAL_MS); void ntpUpdateTask(void* param) { while(true) { // Update NTP. This will only ACTUALLY update if // the NTP client has not updated for NTP_UPDATE_INTERVAL_MS ntpClient.update(); vTaskDelay(1000 / portTICK_PERIOD_MS); } } void setup() { Serial.begin(115200); // Force reset Wifi to avoid failure to connect WiFi.disconnect(true); // Set hostname WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE); WiFi.setHostname("ESP-NTP"); // Connect to Wifi WiFi.begin("MyWifiSSID", "MyWifiPassword"); while (WiFi.status() != WL_CONNECTED) { delay(100); Serial.println("Wifi connecting..."); } // Start NTP client (i.e. start listening for NTP packets) ntpClient.begin(); // Create task to automatically update NTP in the background xTaskCreate(ntpUpdateTask, "NTP update", 2000, nullptr, 1, nullptr); } void loop() { delay(1000); if (ntpClient.updated()) { Serial.println("# Time in sync with NTP server"); } else { Serial.println("# TIME NOT IN SYNC WITH NTP SERVER !"); return; // Do not print time } Serial.println("UTC : " + ntpClient.getFormattedUTCTime()); Serial.println("UTC : " + ntpClient.getFormattedUTCDateTime()); Serial.println("LOC : " + ntpClient.getFormattedTime()); }
platformio.ini
[env:nodemcu-32s] platform = espressif32 board = nodemcu-32s framework = arduino monitor_speed = 115200 lib_deps = khoih.prog/NTPClient_Generic @ ^3.2.2 Time
Example output:
Wifi connecting... Wifi connecting... Wifi connecting... # TIME NOT IN SYNC WITH NTP SERVER ! # Time in sync with NTP server UTC : 01:22:07 UTC : 01:22:07 Sun 07 Feb 2021 LOC : 02:22:07 # Time in sync with NTP server UTC : 01:22:08 UTC : 01:22:08 Sun 07 Feb 2021 LOC : 02:22:08 # Time in sync with NTP server UTC : 01:22:09 UTC : 01:22:09 Sun 07 Feb 2021 LOC : 02:22:09
How to get current gateway IP address on ESP8266/ESP32
In order to get the current gateway IP address on the ESP8266 or ESP32, use:
WiFi.gatewayIP();
In order to print the gateway IP address on the serial port, use
Serial.println("Gateway IP address: "); Serial.println(WiFi.gatewayIP());
In order to get the gateway IP address as string, use
String gatewayIP = WiFi.gatewayIP().toString();
ESP32 Servo controllable via HTTP JSON API / web browser
This sketch for PlatformIO allows you to use the ESP32 as a Servo controller (servo on pin D25) that connects to Wifi and can be controller using a simple HTTP API. The webserver is implemented using ESPAsyncWebserver. Also see ESP32 minimal JSON webserver example for PlatformIO (ESPAsyncWebserver) in case you are not familiar with that library. This example is not a finished application but a minimal starting point to build your own application.
main.cpp
#include <Arduino.h> #include <Arduino.h> #include <WiFi.h> #include <ESP32Servo.h> #include <ESPAsyncWebServer.h> #include <ArduinoJson.h> AsyncWebServer server(80); /** * Wait for WiFi connection, and, if not connected, reboot */ void waitForWiFiConnectOrReboot(bool printOnSerial=true) { uint32_t notConnectedCounter = 0; while (WiFi.status() != WL_CONNECTED) { delay(100); if(printOnSerial) { Serial.println("Wifi connecting..."); } notConnectedCounter++; if(notConnectedCounter > 50) { // Reset board if not connected after 5s if(printOnSerial) { Serial.println("Resetting due to Wifi not connecting..."); } ESP.restart(); } } if(printOnSerial) { // Print wifi IP addess Serial.println("IP address: "); Serial.println(WiFi.localIP()); } } Servo servo; void setup() { ESP32PWM::allocateTimer(0); ESP32PWM::allocateTimer(1); ESP32PWM::allocateTimer(2); ESP32PWM::allocateTimer(3); Serial.begin(115200); WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE); WiFi.setHostname("ESP-Servo"); WiFi.begin("MyWifiSSID", "MyWifiPassword"); waitForWiFiConnectOrReboot(); // Attach servo to pin 25 servo.attach(25, 1000, 2000); // Configure HTTP routes server.on("/api/set-servo", HTTP_GET, [](AsyncWebServerRequest *request) { float value = request->arg("value").toFloat(); servo.write(value); // Send {status: "ok"} AsyncResponseStream *response = request->beginResponseStream("application/json"); DynamicJsonDocument json(1024); json["status"] = "ok"; serializeJson(json, *response); request->send(response); }); // Start webserver server.begin(); } void loop() { }
platformio.ini
[env:nodemcu-32s] platform = espressif32 board = nodemcu-32s framework = arduino monitor_speed = 115200 lib_deps = ESP Async [email protected] [email protected] ESP32Servo
How to use
Insert your Wifi credentials in the line
WiFi.begin("MyWifiSSID", "MyWifiPassword");
and upload the firmware. Now open http://[ip address of the ESP32]/api/set-servo?value=0.0
. Note that in the current version of the firmware, you can not use value=10
but you must use value=10.0
.
ESP32 minimal WebSocket example (ESPAsyncWebserver / PlatformIO)
Minimal firmware to use WebSockets on the ESP32 using ESPAsyncWebserver:
main.cpp
#include <Arduino.h> #include <WiFi.h> #include <ESPAsyncWebServer.h> #include <ArduinoJson.h> AsyncWebServer server(80); AsyncWebSocket ws("/ws"); AsyncWebSocketClient* wsClient; void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len){ if(type == WS_EVT_CONNECT){ wsClient = client; } else if(type == WS_EVT_DISCONNECT){ wsClient = nullptr; } } /** * Wait for WiFi connection, and, if not connected, reboot */ void waitForWiFiConnectOrReboot(bool printOnSerial=true) { uint32_t notConnectedCounter = 0; while (WiFi.status() != WL_CONNECTED) { delay(100); if(printOnSerial) { Serial.println("Wifi connecting..."); } notConnectedCounter++; if(notConnectedCounter > 50) { // Reset board if not connected after 5s if(printOnSerial) { Serial.println("Resetting due to Wifi not connecting..."); } ESP.restart(); } } if(printOnSerial) { // Print wifi IP addess Serial.println("IP address: "); Serial.println(WiFi.localIP()); } } void setup() { Serial.begin(115200); WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE); WiFi.setHostname("ESP-Websocket-Test"); WiFi.begin("MyWifiSSID", "MyWifiPassword"); waitForWiFiConnectOrReboot(); // Start webserver ws.onEvent(onWsEvent); server.addHandler(&ws); server.begin(); } uint64_t counter = 0; void loop() { // If client is connected ... if(wsClient != nullptr && wsClient->canSend()) { // .. send hello message :-) wsClient->text("Hello client"); } // Wait 10 ms delay(10); }
platformio.ini:
[env:nodemcu-32s] platform = espressif32 board = nodemcu-32s framework = arduino monitor_speed = 115200 lib_deps = ESP Async [email protected] [email protected]
Python code for testing:
import websocket ws = websocket.WebSocket() ws.connect("ws://192.168.1.211/ws") while True: result = ws.recv() print(result)
This will print Hello Client
many times a second.
How to fix ESP32 too few arguments to function ‘esp_err_t esp_wifi_sta_wpa2_ent_enable(const esp_wpa2_config_t*)’
Problem:
While trying to compile your ESP32 application, you see this compiler error:
src\main.cpp: In function 'void wifiConnectWPAEAP(const char*, const char*, const char*, const char*)': src\main.cpp:23:32: error: too few arguments to function 'esp_err_t esp_wifi_sta_wpa2_ent_enable(const esp_wpa2_config_t*)' esp_wifi_sta_wpa2_ent_enable(); ^
Solution:
Replace
esp_wifi_sta_wpa2_ent_enable();
by
esp_wpa2_config_t config = WPA2_CONFIG_INIT_DEFAULT(); esp_wifi_sta_wpa2_ent_enable(&config);
How to fix ESP32 fatal error: ESP8266WiFi.h: No such file or directory
Problem:
While trying to compile your ESP32 application, you see this compiler error:
fatal error: ESP8266WiFi.h: No such file or directory
Solution:
ESP8266WiFi.h
is the Wifi header for the ESP8266. For the ESP32, it’s named WiFi.h
. In order to fix the issue, replae
#include <ESP8266WiFi.h>
by
#include <WiFi.h>
How to set WiFi DHCP hostname on ESP32/ESP8266 (different from “espressif”)
Using ESP-IDF
ESP_ERROR_CHECK(esp_event_loop_create_default()); esp_netif_t* wifiStaNetif = esp_netif_create_default_wifi_sta(); const char* hostname = "MyESP32"; ESP_ERROR_CHECK(esp_netif_set_hostname(wifiStaNetif, hostname));
Using Arduino framework
Use
WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE); WiFi.setHostname("My-ESP32-Test");
to set a custom hostname for the ESP32. The Wifi.config(...)
line is required as a workaround for this bug on Github.
ESP32 minimal JSON webserver example for PlatformIO (ESPAsyncWebserver)
This is my recommended starting point to get a webserver running on the ESP32 using PlatformIO:
#include <Arduino.h> #include <WiFi.h> #include <ESPAsyncWebServer.h> #include <ArduinoJson.h> AsyncWebServer server(80); void setup() { Serial.begin(115200); // Connect Wifi, restart if not connecting // https://techoverflow.net/2021/01/21/how-to-fix-esp32-not-connecting-to-the-wifi-network/ WiFi.begin("MyWifiSSID", "MyWifiPassword"); uint32_t notConnectedCounter = 0; while (WiFi.status() != WL_CONNECTED) { delay(100); Serial.println("Wifi connecting..."); notConnectedCounter++; if(notConnectedCounter > 150) { // Reset board if not connected after 15s Serial.println("Resetting due to Wifi not connecting..."); ESP.restart(); } } Serial.print("Wifi connected, IP address: "); Serial.println(WiFi.localIP()); // Initialize webserver URLs server.on("/api/wifi-info", HTTP_GET, [](AsyncWebServerRequest *request) { AsyncResponseStream *response = request->beginResponseStream("application/json"); DynamicJsonDocument json(1024); json["status"] = "ok"; json["ssid"] = WiFi.SSID(); json["ip"] = WiFi.localIP().toString(); serializeJson(json, *response); request->send(response); }); // Start webserver server.begin(); } void loop() { // put your main code here, to run repeatedly: }
Remember to replace your Wifi credentials! WiFi.begin("MyWifiSSID", "MyWifiPassword");
To your platformio.ini
add:
monitor_speed = 115200 lib_deps = ESP Async [email protected] [email protected]
My complete platformio.ini looks like this:
[env:nodemcu-32s] platform = espressif32 board = nodemcu-32s framework = arduino monitor_speed = 115200 lib_deps = ESP Async [email protected] [email protected]
Use PlatformIO’s Upload and Monitor so you can see the IP address of the device in your Wifi network, for example:
Wifi connected, IP address: 192.168.178.90
then goto http://192.168.178.90/api/wifi-info
(replace 192.168.178.90 by the IP address of the ESP32 that you can see on the command line!
You should now see JSON like:
{ status: "ok", ssid: "MyWifiSSID", ip: "192.168.178.90" }
Remember that you can use a browser plugin like JSON Viewer for Chrome in order to auto-format JSON documents!
How to switch on/off ALL3073v2WLAN using HTTP (JSON API)
The ALL3073v2WLAN provides a JSON API to switch on or off the power for the attached device.
In order to enable 230V power for the attached device, use this URL (HTTP GET request):
http://IP-Address-of-ALL3073/xml/jsonswitch.php?id=1&set=1
In order to disable 230V power for the attached device, use this URL (HTTP GET request):
http://IP-Address-of-ALL3073/xml/jsonswitch.php?id=1&set=0
Note that id=1 will always stay the same since 1
is the ID of the actor controlling the power, just set=0
or set=1
are different,
How to fix ESP32 not connecting to the Wifi network
If you use a program like our minimal ESP32 wifi example:
#include <Arduino.h> #include <WiFi.h> void setup() { Serial.begin(115200); WiFi.begin("MyWifiNetworkName", "MyWifiPassword"); while (WiFi.status() != WL_CONNECTED) { Serial.println("Wifi connecting..."); delay(500); } Serial.println("Wifi connected"); } void loop() { // put your main code here, to run repeatedly: }
and you just see a loop of
Wifi connecting...
messages, press the RESET
button of your board (or unplug and re-plug its power to reset) and and try again. If you still see just Wifi connecting...
messages after trying to reset 5 times, most likely your wifi credentials are wrong or the ESP32 can’t see your Wifi network!
Otherwise, if your ESP32 sometimes connects to the Wifi network almost immediately and sometimes it doesn’t seem to connect at all, use this code instead to automatically reset the ESP32 if it doesn’t connect within 5 seconds:
// Wait for wifi to be connected uint32_t notConnectedCounter = 0; while (WiFi.status() != WL_CONNECTED) { delay(100); Serial.println("Wifi connecting..."); notConnectedCounter++; if(notConnectedCounter > 150) { // Reset board if not connected after 15s Serial.println("Resetting due to Wifi not connecting..."); ESP.restart(); } }
Full example:
#include <Arduino.h> #include <WiFi.h> void setup() { Serial.begin(115200); WiFi.begin("MyWifiSSID", "MyWifiPassword"); // Wait for wifi to be connected uint32_t notConnectedCounter = 0; while (WiFi.status() != WL_CONNECTED) { delay(100); Serial.println("Wifi connecting..."); notConnectedCounter++; if(notConnectedCounter > 150) { // Reset board if not connected after 5s Serial.println("Resetting due to Wifi not connecting..."); ESP.restart(); } } Serial.print("Wifi connected, IP address: "); Serial.println(WiFi.localIP()); } void loop() { // put your main code here, to run repeatedly: }
Alternatively, use this function:
/** * Wait for WiFi connection, and, if not connected, reboot */ void waitForWiFiConnectOrReboot(bool printOnSerial=true) { uint32_t notConnectedCounter = 0; while (WiFi.status() != WL_CONNECTED) { delay(100); if(printOnSerial) { Serial.println("Wifi connecting..."); } notConnectedCounter++; if(notConnectedCounter > 150) { // Reset board if not connected after 5s if(printOnSerial) { Serial.println("Resetting due to Wifi not connecting..."); } ESP.restart(); } } if(printOnSerial) { // Print wifi IP addess Serial.println("IP address: "); Serial.println(WiFi.localIP()); } }
Simple way how to reboot ESP32 in Arduino or PlatformIO
Just use
ESP.restart();
This will immediately reboot the ESP32 controller
ESP32 minimal WiFi client example
This example shows how to connect your ESP32 to an existing Wifi network using the Arduino Framework:
#include <Arduino.h> #include <WiFi.h> void setup() { Serial.begin(115200); WiFi.begin("MyWifiNetworkName", "MyWifiPassword"); while (WiFi.status() != WL_CONNECTED) { Serial.println("Wifi connecting..."); delay(500); } Serial.println("Wifi connected"); } void loop() { // put your main code here, to run repeatedly: }
ESPAsyncWebServer JSON response example for ArduinoJson 6
The ESPAsyncWebserver page features an example for generating a basic JSON response using ArduinoJson:
#include "AsyncJson.h" #include "ArduinoJson.h" AsyncResponseStream *response = request->beginResponseStream("application/json"); DynamicJsonBuffer jsonBuffer; JsonObject &root = jsonBuffer.createObject(); root["heap"] = ESP.getFreeHeap(); root["ssid"] = WiFi.SSID(); root.printTo(*response); request->send(response);
However, that example is made for ArduinoJson 5.x whereas most users want to use the updated ArduinoJson 6.x.
ArduinoJson 6.x minimal ESPAsyncWebserver example:
AsyncResponseStream *response = request->beginResponseStream("application/json"); DynamicJsonDocument json(1024); json["status"] = "ok"; json["ssid"] = WiFi.SSID(); json["ip"] = WiFi.localIP(); serializeJson(json, *response); request->send(response);
How to fix ArduinoJson error: DynamicJsonBuffer is a class from ArduinoJson 5
When you see an error message like
Compiling .pio\build\d1_mini\src\main.cpp.o src\main.cpp:22:11: error: DynamicJsonBuffer is a class from ArduinoJson 5. Please see arduinojson.org/upgrade to learn how to upgrade your program to ArduinoJson version 6 DynamicJsonBuffer jsonBuffer;
in your PlatformIO or Arduino project using the ArduinoJson library, your code was written for an old version of ArduinoJson.
According to the official ArduinoJson 5 to ArduinoJson 6 migration guide, you need to use DynamicJsonDocument
instead. Note that DynamicJsonDocument
uses a slightly different API compared to DynamicJsonDocument
, hence you might need to adjust more than just changing the class names. But as a first step, replace e.g.
DynamicJsonBuffer json;
by
DynamicJsonDocument json(1024);
How to fix ArduinoJson error: ‘ArduinoJson::JsonObject’ has no member named ‘printTo’
Problem:
While trying to build your project using ArduinoJson, you see an error message like
src\main.cpp:26:12: error: 'ArduinoJson::JsonObject' has no member named 'printTo' root.printTo(*response);
Solution:
The code you’re using is for an older version of ArduinoJson
: It was written for ArduinoJson version 5.x
while you’re using ArduinoJson version 6.x
. Use serializeJson()
instead of root.printTo(*response)
:
serializeJson(root, *response);
See the official ArduinoJson guide for Migrating from version 5 to 6 for further information on which calls you need to replace.
How to print ESP8266 Wifi IP address
// Print wifi IP addess Serial.println("IP address: "); Serial.println(WiFi.localIP());