// Print wifi IP addess Serial.println("IP address: "); Serial.println(WiFi.localIP());
Electronics
ESP8266 WPA EAP minimal example
This example shows how to connect to WPA2-EAP wifi with username and password on the ESP8266 using the Arduino framework:
#include <Arduino.h> #include <ESP8266WiFi.h> #include "wpa2_enterprise.h" char ssid[] = "MyWifiSSID"; char username[] = "MyEAPUsername"; char password[] = "MyEAPPassword"; void setup() { Serial.begin(115200); wifi_set_opmode(STATION_MODE); // Configure SSID struct station_config wifi_config; memset(&wifi_config, 0, sizeof(wifi_config)); strcpy((char *)wifi_config.ssid, ssid); wifi_station_set_config(&wifi_config); // DO NOT use authentication using certificates wifi_station_clear_cert_key(); wifi_station_clear_enterprise_ca_cert(); // Authenticate using username/password wifi_station_set_wpa2_enterprise_auth(1); wifi_station_set_enterprise_identity((uint8 *)username, strlen(username)); wifi_station_set_enterprise_username((uint8 *)username, strlen(username)); wifi_station_set_enterprise_password((uint8 *)password, strlen(password)); // Connect wifi_station_connect(); // Wait for connect while (WiFi.status() != WL_CONNECTED) { Serial.println("Wifi connecting..."); delay(500); } // Print wifi IP addess Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void loop() { // put your main code here, to run repeatedly: }
Minimal ESP8266 WiFi example
#include <Arduino.h> #include <ESP8266WiFi.h> void setup() { Serial.begin(115200); WiFi.begin("MySSID", "MyPassword"); 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: }
How to add GitHub repository to PlatformIO platformio.ini lib_deps
You can directly add a GitHub repository as a PlatformIO library dependency by specifying its repository URL in lib_deps
in platformio.ini
lib_deps = https://github.com/Bodmer/U8g2_for_TFT_eSPI
Note that the GitHub repository must be a valid PlatformIO library i.e. it must have library.json
or library.properties
in its root directory. https://github.com/Bodmer/U8g2_for_TFT_eSPI is an example for a library that can be included into PlatformIO.
How to fix PlatformIO ESP8266/ESP32 fatal error: SPI.h: No such file or directory
Problem:
You are trying to compile your PlatformIO application for the ESP8266 or ESP32 but you’re seeing an error message like
In file included from .pio/libdeps/d1_mini/TFT_eSPI/TFT_eSPI.cpp:17:0: .pio/libdeps/d1_mini/TFT_eSPI/TFT_eSPI.h:32:17: fatal error: SPI.h: No such file or directory ************************************************************* * Looking for SPI.h dependency? Check our library registry! * * CLI > platformio lib search "header:SPI.h" * Web > https://platformio.org/lib/search?query=header:SPI.h * ************************************************************* #include <SPI.h>
This problem is common using the TFT_eSPI
library.
Solution:
First, ensure that your platformio.ini has
framework = arduino
If you’re using a different framework
, SPI.h
won’t be available since it’s a part of the Arduino framework !
Secondly, add this line to your platformio.ini
:
lib_ldf_mode = deep+
and recompile your source code. This will reconfigure the library dependency finder (ldf) to find dependencies of dependency libraries:
Dependency Graph |-- <TFT_eSPI> 2.3.52 | |-- <SPI> 1.0
What does ‘offline’ mean for flyback regulators/controllers?
If you are working on power supplies, you will often see ICs that are labeled offline flyback controllers/regulators (for example, the LT3799).
What does offline mean in this context?
Offline means that the flyback regulator operates off the AC line, i.e. it is intended for use with the 115VAC / 230VAC grid. There are no online flyback controllers, but many other flyback controllers are not suitable for use with a very high (and typically rectified AC) input voltage but can only be used to convert DC/DC
Typically, offline controllers require a bridge rectifier and some additional circuitry like EMI filters to be connected to the AC grid, so be sure to check their datasheet and/or application notes on how exactly they are intended to be used.
Note that designing high-voltage circuits such as offline flyback power supplies can be dangerous and should only be done by experienced engineers.
Where to find info about mbed mbed_app.json overridable parameters?
The first resource can have a look at is the platform configuration option page. Additionally, check the manual on how to use the mbed CLI to show configuration options.
Additionally, you can look at targets.json
on GitHub:
For example, "Target" => "config" => "default-adc-vref"
would need to be entered like this into mbed_app.json
:
{ "target_overrides": { "*": { "target.default-adc-vref": 3300 } } }
How to fix mbed AnalogIn.read_voltage() returning nan or 0.000 (PlatformIO)
Problem:
You are trying to read an ADC voltage in mbed / PlatformIO like this:
AnalogIn myADC(PA_5); // Read and print voltage, then return float v = myADC.read_voltage(); printf("%f\n", v);
but this only prints nan
or 0.000
.
Solution:
mbed doesn’t know the reference voltage for your platform. The easiest method is to provide the referene voltage in the constructor of AnalogIn
:
AnalogIn myADC(PA_5, 3.3);
This specifies a reference voltage of 3.3V
. While this applies to most applications in their default configuration, note that the reference voltage might be different depending on the configuration of your microcontroller.
In my experience, it’s almost always better to experimentally verify the reference voltage instead of trying to theorize about it if it’s not immediately obvious.
Full example:
#include <mbed.h> BufferedSerial pc(USBTX, USBRX, 115200); // tx, rx AnalogIn myADC(PA_5, 3.3); FileHandle *mbed::mbed_override_console(int fd) { return &pc; } int main() { while(1) { float v = myADC.read_voltage(); printf("%f\n", v); ThisThread::sleep_for(100ms); } }
{ "target_overrides": { "*": { "target.printf_lib": "std" } } }
How to fix mbed printf() ignoring decimals in PlatformIO
Problem:
You are using code like
printf("%.2f\n", myFloat);
in your mbed/PlatformIO application, but instead of printing myFloat
with 2 decimal places, it always prints it with 6 decimal places (like 0.000000
).
Solution:
mbed uses the minimal-printf
library by default which is configured to save space on the Microcontroller. Hence, float max decimals support is disabled by default. In order to get all printf
features at the expense of more flash usage and much slower executing, us add mbed_app.json
in the root directory of the PlatformIO project with "target.printf_lib": "std"
:
{ "target_overrides": { "*": { "target.printf_lib": "std" } } }
See the platform configuration option page for more details and similar options.
How to fix mbed printf() printing literal %f in PlatformIO
Problem:
You are using code like
printf("%f\n", myFloat);
in your mbed/PlatformIO application, but instead of printing myFloat
it prints literal %f
.
Solution:
mbed uses the minimal-printf
library by default which is configured to save space on the Microcontroller. Hence, float support (i.e. %f
support) is disabled by default. You need to enable it by adding mbed_app.json
in the root directory of the PlatformIO project with "platform.minimal-printf-enable-floating-point": true
:
{ "target_overrides": { "*": { "platform.minimal-printf-enable-floating-point": true } } }
See the platform configuration option page for more details and similar options.
How to fix mbed error: ‘wait’ was not declared in this scope (PlatformIO)
Problem:
While compiling your mbed / PlatformIO application, you see an error message like
src/actuators.cpp:253:5: error: 'wait' was not declared in this scope 253 | wait(1.0); | ^~~~
Solution:
wait is an old API and has been deprecated in favour of the C++ standard ThisThread::sleep_for
. Use
ThisThread::sleep_for(1s);
mbed STM32 timer interrupt example
You can use the mbed Ticker
API to add a timer interrupt to your mbed application. This example will use a Ticker-based timer interrupt to toggle the LED once per second, for example on the STM32F429I-DISCO board:
#include <mbed.h> DigitalOut led1(LED1); Ticker ticker; /** * This function will be run once per second */ void timerTick() { // Toggle LED led1 = !led1; } int main() { ticker.attach(timerTick, 1.0 /* seconds */); // What you do in the main loop is not important while(1) { } }
How to fix Raspberry Pi OpenVPN error “ERROR: Cannot open TUN/TAP dev /dev/net/tun: No such device (errno=19)”
Problem:
You want to setup OpenVPN on your Raspberry Pi but you see an error message like
Fri Jun 26 18:12:35 2020 ERROR: Cannot open TUN/TAP dev /dev/net/tun: No such device (errno=19) Fri Jun 26 18:12:35 2020 Exiting due to fatal error
Solution:
This error occurs if you’ve installed OpenVPN using sudo apt install -y openvpn
but if you didn’t reboot after installing it. In order to fix the issue, reboot using
sudo reboot
How to fix PlatformIO mbed error: ‘Mutex’ does not name a type
Problem:
You are trying to compile your PlatformIO mbed application using Mutexes like
Mutex myLock;
but you see an error message like
src\main.cpp:3:1: error: 'Mutex' does not name a type Mutex myLock; ^~~~~
Solution:
Add this line to your platformio.ini
:
build_flags = -D PIO_FRAMEWORK_MBED_RTOS_PRESENT
This will enable the RTOS features in mbed, including the Mutex
.
How to fix PlatformIO fatal error: stm32f429i_discovery_lcd.h: No such file or directory
Problem:
You are trying to compile your PlatformIO application using the LCD_DISCO_F429ZI library, but you see an error message like
#include "stm32f429i_discovery_lcd.h" ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ compilation terminated. *** [.pio\build\disco_f429zi\src\main.o] Error 1 In file included from .pio\libdeps\disco_f429zi\LCD_DISCO_F429ZI_ID2432\LCD_DISCO_F429ZI.cpp:19:0: .pio\libdeps\disco_f429zi\LCD_DISCO_F429ZI_ID2432\LCD_DISCO_F429ZI.h:25:10: fatal error: stm32f429i_discovery_lcd.h: No such file or directory
Solution:
First, ensure that BSP_DISCO_F429ZI is listed is library dependency in platformio.ini
like this:
[env:disco_f429zi] platform = ststm32 board = disco_f429zi framework = mbed lib_deps = LCD_DISCO_F429ZI BSP_DISCO_F429ZI
Replace the line
#include "stm32f429i_discovery_lcd.h"
in LCD_DISCO_F429ZI.h
with
#include "Drivers/BSP/STM32F429I-Discovery/stm32f429i_discovery_lcd.h"
How to fix PlatformIO fatal error: ../Fonts/fonts.h: No such file or directory
Problem:
You are trying to compile a PlatformIO application using the BSP_DISCO_F429ZI library, but you see an error message like
In file included from .pio\libdeps\disco_f429zi\BSP_DISCO_F429ZI_ID2208\Drivers\BSP\STM32F429I-Discovery\stm32f429i_discovery_lcd.c:75:0: .pio\libdeps\disco_f429zi\BSP_DISCO_F429ZI_ID2208\Drivers\BSP\STM32F429I-Discovery\stm32f429i_discovery_lcd.h:49:10: fatal error: ../Fonts/fonts.h: No such file or directory #include "../Fonts/fonts.h" ^~~~~~~~~~~~~~~~~~ compilation terminated.
Solution:
The BSP_DISCO_F429ZI package includes fonts.h
from the wrong directory. Replace
#include "../Fonts/fonts.h"
by
#include "Utilities/Fonts/fonts.h"
in order to fix the issue. You might need to do that multiple times (in multiple files) in order to fix your build.
How to use printf in mbed using STM32F429I-DISC1 and PlatformIO
In PlatformIO, you can directly use printf without any special configuration for the STM32F429-DISC1 discovery board:
#include <mbed.h> int main() { while(1) { printf("Hello world\n"); wait(0.5); } }
This program will print Hello world
twice every second. You can watch the output using the PlatformIO Monitor
feature.
How to toggle the STM32F429I-DISCOVERY LED using mbed + PlatformIO
This simple firmare toggles the LED on the STM32F429I-DISC1 discovery board.
#include <mbed.h> DigitalOut myled(LED1); int main() { while(1) { myled = !myled; wait(0.5); } }
This will toggle the green (PG13) LED twice per second.
The program is simple: We toggle the LED using myled = !myled;
and then use wait(0.5)
for 0.5 seconds.
What .gitignore to use for LTSpice XVII projects?
Besides the .asc
files containing the circuit to simulate, LTSpice XVII genates .log
, .raw
and .op.raw
files during simulation. Usually, you don’t want to commit those files.
This is the .gitignore
file I use to manage my LTSpice XVII projects:
*.log *.raw
How to fix raspi-config “The splash screen is not installed so cannot be activated”
Problem:
You want to enable the boot splash screen on your Raspberry Pi using raspi-config
, but you see this error message:
The splash screen is not installed so cannot be activated
followed by There was an error running option B3 Splash Screen
Solution:
As you can find out from reading the raspi-config
source code, it checks for the existence of /usr/share/plymouth/themes/pix/pix.script
. In order to install this file, install the rpd-plym-splash
package:
sudo apt -y install rpd-plym-splash