Raspberry Pi
1.0M views | +11 today
 
Scooped by F. Thunus
onto Raspberry Pi
Scoop.it!

FreeDOS | The FreeDOS Project

FreeDOS is a complete operating system. For new users, we recommend installing FreeDOS in a PC emulator or "virtual machine." If you install FreeDOS on a computer directly, without using a PC emulator, you may overwrite the operating system you have now (for example, Windows.) Please be careful.

The FreeDOS 1.2 distribution is available in multiple formats:

No comment yet.
Raspberry Pi
A complete ARM GNU/Linux computer for $25.
(also covering Arduino and BeagleBone)
Curated by F. Thunus
Your new post is loading...
Your new post is loading...
Scooped by F. Thunus
Scoop.it!

Dear reader,

Dear reader, | Raspberry Pi | Scoop.it

The Raspberry Pi project website is http://www.raspberrypi.org/

This is one of my news digests. If you like my editorial choices, there are more to be found by clicking on the "dear reader" link, and on my name above.
Enjoy !

Donald Thomas's curator insight, August 30, 2014 8:07 AM

this is 

Wuzea Recherche's comment, March 15, 2015 6:45 AM
Propose de rechercher une ressource en tapant un mot clé dans le champ de recherche. Wuzea : http://www.wuzea.com
Vasu10's curator insight, June 9, 2021 1:49 AM
Takeoff projects help students complete their academic projects. Register at takeoff projects today to find and learn about different interesting big data projects and grab the best jobs. Get started right now.
Scooped by F. Thunus
Scoop.it!

Wilderness Labs Meadow F7 Core-Compute System on Module powered by an STM32 and ESP32

Wilderness Labs Meadow F7 Core-Compute System on Module powered by an STM32 and ESP32 | Raspberry Pi | Scoop.it
Wilderness Labs has introduced the Meadow F7 Core-Compute System on Module based on the popular F7 Feather microcontroller development board.
No comment yet.
Scooped by F. Thunus
Scoop.it!

NanoPi R2C Plus dual GbE Router Board Adds 8GB eMMC Flash

NanoPi R2C Plus dual GbE Router Board Adds 8GB eMMC Flash | Raspberry Pi | Scoop.it
FriendlyElec's Single-Board Computer NanoPi R2C Plus supports various operating systems and is compatible with popular platforms like Docker to develop IoT applications.
No comment yet.
Scooped by F. Thunus
Scoop.it!

Banana Pi BPI-R2 Pro board lets you build an open source router with an RK3568 processor

Banana Pi BPI-R2 Pro board lets you build an open source router with an RK3568 processor | Raspberry Pi | Scoop.it
Banana Pi BPI-R2 Pro board lets you build an open source router with an RK3568 processor...
No comment yet.
Scooped by F. Thunus
Scoop.it!

LocoNet Interface Breakout Board with Grove Port from IoTT - Internet of Toy Trains on

LocoNet Interface Breakout Board with Grove Port from IoTT - Internet of Toy Trains on | Raspberry Pi | Scoop.it
LocoNet Interface Breakout Board with Grove Port from IoTT - Internet of Toy Trains on Tindie...
No comment yet.
Scooped by F. Thunus
Scoop.it!

Here are 10 Robotics Project Ideas for Beginners and Intermediates –

Here are 10 Robotics Project Ideas for Beginners and Intermediates – | Raspberry Pi | Scoop.it
Free No.1 Best Blog post, Tech, Marketing, Tips and health Blog. Our aim is to help people and make them happy all over the world.
No comment yet.
Scooped by F. Thunus
Scoop.it!

Example code for using the Pi camera with Python.

Example code for using the Pi camera with Python. | Raspberry Pi | Scoop.it
The following is example Python code for the Raspberry Pi camera.The camera module supports over 30fps at 1080p and has many features that can easily be set in...
No comment yet.
Scooped by F. Thunus
Scoop.it!

Arduino as ISP and Arduino Bootloaders | Arduino Documentation | Arduino Documentation

Arduino as ISP and Arduino Bootloaders | Arduino Documentation | Arduino Documentation | Raspberry Pi | Scoop.it
Arduino ISP turns your Arduino into an in-circuit programmer to re-program AtMega chips.
No comment yet.
Scooped by F. Thunus
Scoop.it!

u-blox Announces Compact Bluetooth LE and Wi-Fi Module for Demanding Customer Applications

u-blox Announces Compact Bluetooth LE and Wi-Fi Module for Demanding Customer Applications | Raspberry Pi | Scoop.it
u-blox announced the u-blox NORA-W10 Wi-Fi 4 and Bluetooth low energy 5.0 module.The module targets applications in harsh industrial environments, where reliable RF performance and small size are critical, as well as medical equipment, smart city solutions, and warehouse and retail...
No comment yet.
Scooped by F. Thunus
Scoop.it!

Eloquent Edge Impulse for Arduino | Eloquent Arduino

Eloquent Edge Impulse for Arduino | Eloquent Arduino | Raspberry Pi | Scoop.it
Eloquent Edge Impulse for Arduino An Arduino library to make Edge Impulse Neural Networks easy to use Edge Impulse is a great tool to develop TinyML models without coding and in a simple to use environment. Sadly, integrating those models back into your Arduino project is not that easy as it could be. Thanks to the Eloquent Arduino library, though, things have changed! Before continuing, please install the EloquentArduino library version 2.0.5 or above in the Arduino IDE. How to use Using the Eloquent library to run Edge Impulse models is pretty easy. First of all, create your model and export as an Arduino library. Now, create a new Arduino sketch with the following code. /** * This example shows how to use the Eloquent library * to perform inference using the EdgeImpulse generated library */ #include <replace_with_edge_impulse_inferencing.h> #include <eloquent.h> #include <eloquent/tinyml/edgeimpulse.h> Eloquent::TinyML::EdgeImpulse::Impulse impulse; void setup() { Serial.begin(115200); delay(3000); Serial.println("Starting EdgeImpulse inference"); Serial.println("Paste your feature vector in the Serial Monitor and get the predicted value"); Serial.print("(expecting "); Serial.print(EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE); Serial.println(" comma-separated features)"); } void loop() { float features[EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE] = {0}; if (!Serial.available()) return; for (int i = 0; i < EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE; i++) features[i] = Serial.readStringUntil(',').toFloat(); // here is where the magic happens... Serial.print("Predicted class: "); Serial.println(impulse.predict(features)); Serial.print("Predicted label: "); Serial.println(impulse.getLabel()); // debug class probabilities and timing impulse.printTo(Serial); } Hopefully the code is self-explanatory: it loads the library you exported from Edge Impulse it loads the Eloquent Edge Impulse library it instantiates an impulse object When the user sends a feature vector to the Serial Monitor, the impulse performs the inference and prints the results back to the Serial Monitor. Done! Looks pretty clean, right? Compare with the example generated from Edge Impulse. /** * @brief Arduino main function */ void loop() { ei_printf("Edge Impulse standalone inferencing (Arduino)\n"); if (sizeof(features) / sizeof(float) != EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE) { ei_printf("The size of your 'features' array is not correct. Expected %lu items, but had %lu\n", EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE, sizeof(features) / sizeof(float)); delay(1000); return; } ei_impulse_result_t result = { 0 }; // the features are stored into flash, and we don't want to load everything into RAM signal_t features_signal; features_signal.total_length = sizeof(features) / sizeof(features[0]); features_signal.get_data = &raw_feature_get_data; // invoke the impulse EI_IMPULSE_ERROR res = run_classifier(&features_signal, &result, false /* debug */); ei_printf("run_classifier returned: %d\n", res); if (res != 0) return; // print the predictions ei_printf("Predictions "); ei_printf("(DSP: %d ms., Classification: %d ms., Anomaly: %d ms.)", result.timing.dsp, result.timing.classification, result.timing.anomaly); ei_printf(": \n"); ei_printf("["); for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) { ei_printf("%.5f", result.classification[ix].value); #if EI_CLASSIFIER_HAS_ANOMALY == 1 ei_printf(", "); #else if (ix != EI_CLASSIFIER_LABEL_COUNT - 1) { ei_printf(", "); } #endif } #if EI_CLASSIFIER_HAS_ANOMALY == 1 ei_printf("%.3f", result.anomaly); #endif ei_printf("]\n"); // human-readable predictions for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) { ei_printf(" %s: %.5f\n", result.classification[ix].label, result.classification[ix].value); } #if EI_CLASSIFIER_HAS_ANOMALY == 1 ei_printf(" anomaly score: %.3f\n", result.anomaly); #endif delay(1000); } I think we have a clear winner here. Available methods Here's the complete list of the methods that you can call on the impulse object. int8_t predict(float *features) Perform inference on the given feature vector. Returns the most probable class index, or -1 on error. String predictLabel(float *features) Perform inference on the given feature vector. Returns the most probable class name. String getLabel(void) Get label of latest prediction. float getProba(void) Get probability of latest prediction. uint16_t getDspTiming(void) Get time spent on DSP, in milliseconds. uint16_t getClassificationTiming(void) Get time spent on classification, in milliseconds. uint16_t getAnomalyTiming(void) Get time spent on anomaly detection, in milliseconds, if anomaly detection was turned on during model generation. bool isAnomaly(void) Return true when an anomaly is detected, if anomaly detection was turned on during model generation. void setMaxAnomalyScore(float maxScore) Set the max score after which a prediction is considered an anomaly. void printTo(PrinterInterface &printer) Print debug information to given printer template class. Many times you will pass the Serial object. Share on Twitter Monthly Newsletter Get post previews and exclusive tutorials in your inbox Sign Up We use Mailchimp as our marketing platform. By submitting this form, you acknowledge that the information you provided will be transferred to Mailchimp for processing in accordance with their terms of use. We will use your email to send you updates relevant to this website. Ask about the Eloquent Edge Impulse library Name Email Address Message What describes you better? I'm an hobbyst I'm an enterprise Submit
No comment yet.
Scooped by F. Thunus
Scoop.it!

Load Cell with Arduino Uno Using HX711 Amplification

Load Cell with Arduino Uno Using HX711 Amplification | Raspberry Pi | Scoop.it
Interface the load cell with Arduino Uno along with HX711 amplifying IC for the purpose of weight measurement...
No comment yet.
Scooped by F. Thunus
Scoop.it!

Ultrasonic Range Detector Using Arduino and US-016

Ultrasonic Range Detector Using Arduino and US-016 | Raspberry Pi | Scoop.it
Make an ultrasonic range detector using Arduino and US-016 to measure distances and display it in the Arduino IoT Cloud!.
No comment yet.
Scooped by F. Thunus
Scoop.it!

This Clever Raspberry Pi Hack Adds Android Auto to Tesla Vehicles – Review Geek

This Clever Raspberry Pi Hack Adds Android Auto to Tesla Vehicles – Review Geek | Raspberry Pi | Scoop.it
It’s easy to make an older car feel new by adding a few gadgets or accessories, but it’s not quite that simple when you drive a Tesla. That said, you can now get Apple’s CarPlay or Android Auto in Tesla vehicles with this neat Raspberry Pi hack.
No comment yet.
Scooped by F. Thunus
Scoop.it!

Wemos' LOLIN C3 Mini Powered by a 32-bit RISC-V processor, priced at $4.10

Wemos' LOLIN C3 Mini Powered by a 32-bit RISC-V processor, priced at $4.10 | Raspberry Pi | Scoop.it
Wemos' LOLIN C3 Mini is powered by an Espressif ESP32-C3FH4 Wi-Fi and BLE RISC-V microcontroller and is priced at $4.10/unit.
No comment yet.
Scooped by F. Thunus
Scoop.it!

ATtiny Development Boards are Compatible with Arduino IDE

ATtiny Development Boards are Compatible with Arduino IDE | Raspberry Pi | Scoop.it
Atmel’s new line of ATtiny microcontrollers are designed to be used for low-cost applications with efficient processing capacity.
No comment yet.
Scooped by F. Thunus
Scoop.it!

Displaying Sensor Values Arduino IoT Cloud

Displaying Sensor Values Arduino IoT Cloud | Raspberry Pi | Scoop.it
This project will show you how to set up an Arduino IoT Cloud dashboard and display multiple sensor values.
No comment yet.
Scooped by F. Thunus
Scoop.it!

Manjaro Vs. Ubuntu | Tux Machines

Manjaro Vs. Ubuntu | Tux Machines | Raspberry Pi | Scoop.it
today's howtos How to Configure Static IP on Ubuntu 22.04 Learn how to configure a static IP address on ubuntu 22.04. This covers to setup static IP using the command line and from Ubuntu Desktop. How to install Friday Night Funkin' Kade Engine 1.8 on a Chromebook Today we are looking at how to install Friday Night Funkin' Kade Engine 1.8 on a Chromebook. Please follow the video/audio guide as a tutorial where we explain the process step by step and use the commands below. Getting Started with the Burp Suite: A Pentesting Tutorial | eSecurityPlanet Burp is one of the top-rated security suites for pentesting and ethical hacking. While there are paid professional and enterprise editions, you can install the community edition for free and even use it directly from Kali Linux. The Burp suite is widely used by security professionals to perform advanced scans and various traffic interceptions (e.g., HTTP requests). The tool, maintained by PortSwigger, offers comprehensive documentation. There are dedicated sections for the different editions. While the enterprise and pro versions are expensive, they provide additional features that may make sense for your organization, so don’t stick with the free community edition just because it’s free. Cybersecurity tools typically pay for themselves in the costs saved from prevented breaches, which can run in the millions for a single breach. How to Install Zabbix on Debian and Ubuntu Linux - LinuxStoney Zabbix is ​​a complex for monitoring your server. Zabbix will also allow you to track the status of a computer network and network equipment. Zabbix is ​​also often used to monitor web servers. In this article, we will look at how to put Zabbix on the lamp stack. Today, we learn how to install zabbix on Debian and Ubuntu Linux. Let’s proceed with the installation: Creating a quick calculation function on Linux | Network World Anytime you're planning to do a lot of calculations on a Linux system, you can use the power of bash to create a quick function and then use it repeatedly to do the calculations for you. In this post, we'll look at how this trick works and what you need to be aware of to ensure that your calculations are correct. How to share folders to your network from Linux If you have several computers on your network, and you want to be able to share files and folders from your Linux operating system, the process isn't nearly as hard as you might think. And although some Linux distributions strive to make this a point-and-click affair, they tend to fall short of the mark. That's when you need to turn to Samba and the terminal window. But fear not, I'm going to show you how this is done in plain and simple terms. Once it's finished, anyone on your LAN should be able to access those shared folders and files. How Install Plex Media Server on Fedora 36 In this tutorial, we will show you how to install Plex Media Server on Fedora 36. Plex is a global streaming media service and a client–server media player platform, made by Plex, Inc. The Plex Media Server organizes video, audio, and photos from a user’s collections and from online services, and streams it to the players. The official clients and unofficial third-party clients run on mobile devices, smart TVs, streaming boxes, and in web apps. Plex Media Server is a self-hosted media player system for storing your movies, shows, music, and photos. Over time Plex Media Server has grown much and now supports many platforms. KDE Connect Arrives on iPhone and iPad For Linux Fans KDE Connect Arrives on iPhone and iPad For Linux Fans KDE Connect has been around for years as a companion Android app for connecting to Linux PCs, similar to Microsoft Link to Windows (formerly “Your Phone”). Now there’s finally a KDE Connect app for iPhone and iPad. KDE Connect has quietly appeared on the Apple App Store for iPhone and iPad, seemingly without an official announcement (at least so far). Just like the Android version, it connects to a Linux PC running the KDE Connect application to a phone or tablet. You can then synchronize your clipboard across desktop and mobile, share files and links, and run commands on a PC from a phone. You can also use an iPhone as a virtual touchpad or presentation remote for a linked PC. KDE Connect is Now Available for iPhone & iPad - OMG! Ubuntu! An official KDE Connect mobile client is now available on the Apple App Store. The addition of this official iOS app means folks with an iPhone and/or iPad can benefit from a deeper set of integration between their mobile devices and their Linux desktop. today's leftovers Apple CarPlay Workaround for Tesla Vehicles Now Available to Download - MacRumors The workaround involves using a Rasberry Pi with an LTE modem and a Wi-Fi access point, running a custom Android-based firmware, as well as a micro-HDMI to HDMI cable and Ethernet cable. As demonstrated in a YouTube video, the in-car browser is used to connect to the Rasberry Pi and display the ‌‌CarPlay‌‌ interface on the Tesla's screen, where Apple apps including Maps and ‌Apple Music‌ function as expected. The system works while driving, and can also be controlled with the media buttons on the Tesla's steering wheel. Golf Ace helps you learn how to putt like the pros using tinyML | Arduino Blog Fancy golfing simulators are excellent for learning the best techniques such as balance and how to hold a club properly. However, their large cost puts them out of the reach of most people, so Nick Bild decided to create a far cheaper alternative that can still be beneficial. His Golf Ace system relies on a specially modified putter that runs a machine learning algorithm to give feedback about the quality of the putt. Department for Work and Pensions Improves Service Delivery Time to Meet Record Demand with Red Hat How Nokia and Red Hat are bringing cloud RAN to reality [Ed: Everything is being rebranded "clown" now (to fake a sense of novelty), even networks] Two worlds are meeting as parallel technologies advance: cloud-native applications, and the disaggregation of functions for radio access networks (RANs). In both cases the platform technologies are mature enough to converge in a production environment. This unlocks new opportunities for communications service providers (CSPs) to gain competitive edge through faster innovation and greater flexibility, and they are exploring these in earnest. Nokia’s Jane Rygaard, Head of Dedicated Wireless Networks and Edge Clouds, and Red Hat CTO Chris Wright discussed this recently in an interview with Telecom TV: Accelerating cloud RAN technology innovation in the 5G era. Can SteamOS and Steam Deck make Linux mainstream? - Invidious Ubuntu MATE 22.04 LTS overview | For a retrospective future. - Invidious In this video, I am going to show an overview of Ubuntu MATE 22.04 LTS and some of the applications pre-installed. Programming Leftovers Oracle's Java Losing Out To Amazon's From having around three-quarters of the Java market in 2022, its share has now fallen to just over a third. In the same period Amazon has gone from a 2% share to 22%. Implementing an SSH agent in Hare In the process of writing an SSH agent for Himitsu, I needed to implement many SSH primitives from the ground up in Hare, now available via hare-ssh. Today, I’m going to show you how it works! The Apache News Round-up: week ending 6 May 2022 Welcome, May --we're opening the month with another great week. Here's what the Apache community has been up to
No comment yet.
Scooped by F. Thunus
Scoop.it!

Banana Pi-M1+ | Cyber Connect

Banana Pi-M1+ | Cyber Connect | Raspberry Pi | Scoop.it
The Banana Pi BPI-M1+ upgrade is an open-source single-board computer that adds more connectivity to the classic board.
No comment yet.
Scooped by F. Thunus
Scoop.it!

Tigard Protocol Tool

Tigard Protocol Tool | Raspberry Pi | Scoop.it
Tigard is an open source FT2232H-based, multi-protocol, multi-voltage tool for hardware hacking.By incorporating commonly used pin-outs, a labelled wiring harness, onboard level-shifting, and a logic analyzer connection, it is designed specifically for attaching to and communicating with low-speed...
No comment yet.
Scooped by F. Thunus
Scoop.it!

Raspberry Pi & Machine Learning: All You Need to Know

Raspberry Pi & Machine Learning: All You Need to Know | Raspberry Pi | Scoop.it
Discover the basics behind making a smart device out of a Raspberry Pi. Machine learning and AI for you and for me!
No comment yet.
Scooped by F. Thunus
Scoop.it!

WiPhone Programming Instructions — v0.4rc1 documentation

WiPhone Programming Instructions — v0.4rc1 documentation | Raspberry Pi | Scoop.it
WiPhone Programming Instructions¶ Prerequisites¶ Hardware¶ For compiling and editing WiPhone firmware, you will need a computer capable of running the Arduino Desktop IDE and a microUSB cable. A modern Linux, MacOS or Windows operating system should work. Software¶ The following software packages are required to compile the WiPhone firmware: Arduino Desktop IDE: https://www.arduino.cc Arduino core for WiPhone: https://wiphone.io/static/releases/arduino_platforms/WiPhone0.1.2.zip An Arduino plugin for uploading files to the ESP32 file system: https://github.com/me-no-dev/arduino-esp32fs-plugin If you want to contribute to the firmware, you should also have the Git source-control management tool: https://git-scm.com/ Installing The Arduino Desktop IDE¶ Download the installer for your platform from the official Arduino website download page: https://www.arduino.cc/en/Main/Software Follow the installation procedure for your operating system: For Linux, download the archive, extract it, and run "install.sh". https://www.arduino.cc/en/Guide/Linux For MacOS, extract/move the downloaded file to your Applications folder. https://www.arduino.cc/en/Guide/MacOSX For Windows, download and run the installer. https://www.arduino.cc/en/Guide/Windows In all cases you can check the official instructions for more details. Installing the WiPhone-Arduino Core Using the Arduino IDE Boards Manager¶ If your Arduino IDE is recent enough (ver. 1.8+), you can install the WiPhone Arduino-ESP32 board definition using the Arduino IDE's Boards Manager: Start the Arduino Desktop IDE. Open the Preferences window: File >Preferences Enter "https://wiphone.io/static/releases/arduino_platforms/package_WiPhone_index.json"(without quotes) into the Additional Board Manager URLs field. Note: You can add multiple URLs, separating them with commas. Open the Boards Manager... window by navigating to Tools > Board: >Boards Manager... Search for "wiphone"and install the WiPhone package by the WiPhone Team. Choosing a board type¶ After installing WiPhone-Arduino, select the WiPhone board by navigating to Tools > Board: ... menu. Choosing a Partition Scheme¶ By default WiPhone board definition selects the partition scheme with 2 app of 6.5MB size each and 3.6MB for SPIFFS data. Detail of partition scheme is as below: # Name Type SubType Offset Size nvs data nvs 0x9000 0x5000 otadata data ota 0xe000 0x2000 app0 app ota_0 0x10000 0x640000 (6.5MB) app1 app ota_1 0x650000 0x640000 (6.5MB) spiffs data spiffs 0xc90000 0x370000 (3.6MB) Warning Compiling and uploading the project with different partition scheme will overwrite the internal flash and file system (SPIFFS) causing loss of things like the phonebook and SIP accounts, you may want to stick to a single partition scheme early in the development process to avoid data loss for frequently changing files. Installing The Arduino Plugin for Uploading Files¶ This plugin is required to upload data files to the WiPhone's internal flash (SPIFFS). It is needed, for example, to load the ringtone file and background screen. It also formats the SPIFFS partition of the ESP32 to allow storing WiPhone data (like phonebook, SIP accounts, and settings) into the internal flash. Installation procedure:¶ Download the plugin archive: https://github.com/me-no-dev/arduino-esp32fs-plugin/releases/download/1.0/ESP32FS-1.0.zip Extract the archive and copy the extracted directory ESP32FS into the tools subdirectory of Arduino sketchbook directory: On Linux: create directory ~/Arduino/tools/ (you can run "mkdir -p ~/Arduino/tools/"in terminal) and copy the ESP32FS direcory into it. On MacOS: create directory ~/Documents/Arduino/tools/ (you can run "mkdir -p ~/Documents/Arduino/tools/"in terminal) and copy the ESP32FS direcory into it. On Windows: create tools directory and unpack the tool into tools directory (the path will look like <home_dir>/Arduino/tools/ESP32FS/tool/esp32fs.jar). For more details, you may also consult the official installation instructions: https://github.com/me-no-dev/arduino-esp32fs-plugin#Installation After successfully installing the plugin you can upload data to SPIFFS partition. Tools > ESP32 Sketch Data Upload Warning Using this plugin to load files into a WiPhone will overwrite ALL existing files in the SPIFFS partition, causing irreversible data loss. Obtaining A Copy Of The Firmware¶ Firmware is currently being reviewed by Early Testers. In the future this section will include a download link. Compiling And Uploading Firmware¶ After obtaining firmware, make sure all the project files are stored in a directory called "WiPhone". Then, to compile and upload the firmware to WiPhone: Connect WiPhone to your computer with a microUSB cable. Open the file WiPhone.ini from the project directory in the Arduino IDE. Press button "Upload"in the top left corner of the Arduino IDE window (the button looks like a right arrow). Uploading Data Files¶ To permanently store files in the WiPhone's internal flash file system (SPIFFS). To upload data files from the "WiPhone/data"subdirectory to SPIFFS, do the following: Make sure that the plugin for uploading files to ESP32 is installed(otherwise, see the dedicated section above). Navigate to the "Tools"menu in the Arduino IDE and press "ESP32 Sketch Data Upload". What's In The Project Directory¶ Some notable files and subdirectories from the source directory: WiPhone.ino: Arduino project file: a C++ file with the main loop and the mainphone logic GUI.h/GUI.cpp: main GUI logic files (widgets and apps are defined here) tinySIP.h/tinySIP.cpp: a minimal implementation of the SIP protocol, optimized for small footprint src/ directory for code that is not in active development (these files are required for the WiPhone's operation, but will not be opened by Arduino IDE by default, unlike files in the main directory) src/TFT_eSPI/: an LCD graphics library for the ESP32; includes sprites and font rendering capabilities src/VoIP/: audio codecs and other definitions for VoIP src/assets/: static data components (such as fonts, icons, background image, etc.) src/drivers: code that operates different integrated circuits (ICs) of the WiPhone data/: files to be loaded into WiPhone’s internal flash file system (SPIFFS) tools/: custom Python scripts to generate "assets", namely 3-bit antialiased fonts and icons other WiPhone source files in the main directory Developing Custom "Apps"¶ Developing custom apps in WiPhone's Arduino firmware should be possible with a moderate understanding of C++. This section covers a few of the less obvious aspects. Steps for adding a custom app¶ Declare a unique ID for the new app. This is done in the ActionID enumeration: Find "typedef enum ActionID"in file GUI.h. Add a unique name below the line "GUI_BASE_APP = 0x4000". For example, "GUI_APP_MYAPP". GUI.h: 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314// Menu actions typedef enum ActionID : uint16_t { NO_ACTION = 0, GUI_ACTION_MAINMENU, GUI_ACTION_SUBMENU, GUI_ACTION_RESTART, // Specific applications GUI_BASE_APP = 0x4000, // application flag // My Section GUI_APP_MYAPP, // add your app like this // Interface GUI_APP_MENU, GUI_APP_CLOCK, Add your app ID into the menu. Find ''GUIMenuItem menu'' in file GUI.h. Increase size of the array by 1 and add a line of the following form into the definition of the array "menu" { XX, YY, "Menu Name", "", "", GUI_APP_MYAPP } XX - should be a unique ID of the menu item (for simplicity, it should be the current size of the array) YY - is ID of the menu in which you want your app to appear. GUI.h: 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182GUIMenuItem menu[36] PROGMEM = { // increment size by one to add a new app // TODO: button names can be removed { 0, -1, "Clock", "Menu", "", GUI_APP_CLOCK }, { 1, 0, "WiPhone", "Select", "Back", GUI_ACTION_SUBMENU }, // Main menu items // TODO: call log (icons: Call_log_b/Call_log_w) { 2, 1, "Phonebook", "", "", GUI_APP_PHONEBOOK }, { 20, 1, "Messages", "", "", GUI_APP_MESSAGES }, { 3, 1, "Tools", "Select", "Back", GUI_ACTION_SUBMENU }, { 4, 1, "Games", "Select", "Back", GUI_ACTION_SUBMENU }, { 5, 1, "Settings", "Select", "Back", GUI_ACTION_SUBMENU }, { 13, 1, "Reboot", "", "", GUI_ACTION_RESTART }, // Tools (3) { 25, 3, "MP3 player", "", "", GUI_APP_MUSIC_PLAYER }, { 31, 3, "Audio recorder", "", "", GUI_APP_RECORDER }, { 14, 3, "Scan WiFi networks", "", "", GUI_APP_NETWORKS }, // duplicate from below { 7, 3, "Note page", "", "Back", GUI_APP_NOTEPAD }, { 21, 3, "UDP sender", "", "", GUI_APP_UDP }, { 28, 3, "Development", "Select", "Back", GUI_ACTION_SUBMENU }, // Development (28) { 36, 28, "My App", "", "", GUI_APP_MYAPP }, { 27, 28, "Diagnostics", "", "", GUI_APP_DIAGNOSTICS }, Instantiate your app. This is, basically, just letting the GUI know how to call your app’s constructor. Find definition of method "GUI::enterApp()"in file GUI.cpp and add code to create a new object out of your app class. (Do it similarly to other apps.) 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141void GUI::enterApp(ActionID_t app) { GUI_DEBUG("entering app"); // Free dynamic memory cleanAppDynamic(); flash.end(); // Change to new app switch(app) { case GUI_APP_MYAPP: runningApp = new MyApp(audio, *screen, state, header, footer); break; case GUI_APP_MENU: state.setInputState(InputType::Numeric); menuDrawn = false; break; Declare the app class and methods. The easiest way to do this is to find an existing app similar to the one you want to build, copy its code, changing the class name and code to do the things you want. The app class declaration goes in GUI.h and method definitions go in GUI.cpp. The app class must derive from ''WiPhoneApp'' or of its derivatives (like "WindowedApp"or "FocusableApp", or both). Make sure the class method "getId"returns the ID that you created in the first step. Methods go in GUI.cpp. Each app defines two main methods: "processEvent()"and "redrawScreen()". "processEvent(EventType event)"is the method that is called by GUI to allow your app process events and update its internal state accordingly. The events are, for example, button presses, timers (as requested by your app) or scheduled events (as scheduled by your app). "redrawScreen(bool redrawAll)"is the method that is called by GUI to allow your app to redraw the screen partially and/or telling your app that it should redraw the screen entirely (like after the screen was redrawn by some other app, like a call or a screen lock). The MyApp demo is pasted below. GUI.h 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062class MyApp : public WindowedApp, FocusableApp { public: MyApp(Audio* audio, LCD& disp, ControlState& state, HeaderWidget* header, FooterWidget* footer); virtual ~MyApp(); ActionID_t getId() { return GUI_APP_MYAPP; }; appEventResult processEvent(EventType event); void redrawScreen(bool redrawAll=false); protected: Audio* audio; bool screenInited = false; // WIDGETS RectWidget* clearRect; RectIconWidget* iconRect; LabelWidget* demoCaption; LabelWidget* debugCaption; }; GUI.cpp 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586// - - - - - - - - - - - - - - - - - - - - - - - - - - - - MyApp demo app - - - - - - - - - - - - - - - - - - - - - - - - - - - - MyApp::MyApp(Audio* audio, LCD& lcd, ControlState& state, HeaderWidget* header, FooterWidget* footer) : WindowedApp(lcd, state, header, footer), FocusableApp(2), audio(audio) { GUI_DEBUG("MyApp create"); const char* s; // Create and arrange widgets header->setTitle("MyApp Demo"); footer->setButtons("Yes", "No"); clearRect = new RectWidget(0, header->height(), lcd.width(), lcd.height() - header->height() - footer->height(), WP_COLOR_1); // State caption in the middle const uint16_t spacing = 4; uint16_t yOff = header->height() + 26; demoCaption = new LabelWidget(0, yOff, lcd.width(), fonts[AKROBAT_BOLD_20]->height(), "Hello World", WP_ACCENT_S, WP_COLOR_1, fonts[AKROBAT_BOLD_20], LabelWidget::CENTER); yOff += demoCaption->height() + (spacing*2); // Make an icon iconRect = new RectIconWidget((lcd.width()-50)>>1, yOff, 50, 50, WP_ACCENT_1, icon_person_w, sizeof(icon_person_w)); yOff += iconRect->height() + (spacing*2); /*// Name and URI above s = controlState.calleeNameDyn!=NULL ? (const char*) controlState.calleeNameDyn : ""; nameCaption = new LabelWidget(0, yOff, lcd.width(), fonts[AKROBAT_EXTRABOLD_22]->height(), s, WP_COLOR_0, WP_COLOR_1, fonts[AKROBAT_EXTRABOLD_22], LabelWidget::CENTER); yOff += nameCaption->height() + spacing; s = controlState.calleeUriDyn!=NULL ? (const char*) controlState.calleeUriDyn : ""; uriCaption = new LabelWidget(0, yOff, lcd.width(), fonts[AKROBAT_BOLD_20]->height(), s, WP_DISAB_0, WP_COLOR_1, fonts[AKROBAT_BOLD_20], LabelWidget::CENTER);*/ // Debug string: shows some simple debug info //yOff += uriCaption->height() + 20; //s = controlState.lastReasonDyn != NULL ? (const char*) controlState.lastReasonDyn : ""; s = "I'm Awesome!"; debugCaption = new LabelWidget(0, yOff, lcd.width(), fonts[AKROBAT_BOLD_16]->height(), s, WP_DISAB_0, WP_COLOR_1, fonts[AKROBAT_BOLD_16], LabelWidget::CENTER); //reasonHash = hash_murmur(controlState.lastReasonDyn); } MyApp::~MyApp() { GUI_DEBUG("destroy MyApp"); delete demoCaption; delete debugCaption; //delete nameCaption; //delete uriCaption; } appEventResult MyApp::processEvent(EventType event) { GUI_DEBUG("processEvent MyApp"); appEventResult res = DO_NOTHING; if (LOGIC_BUTTON_BACK(event)) { demoCaption->setText("Back Button"); res |= REDRAW_SCREEN; } else if (LOGIC_BUTTON_OK(event)) { demoCaption->setText("OK Button"); footer->setButtons("OH", "NO"); res |= REDRAW_SCREEN | REDRAW_FOOTER; } else if (event == WIPHONE_KEY_UP || event == WIPHONE_KEY_DOWN) { int8_t earpieceVol, headphonesVol, loudspeakerVol; audio->getVolumes(earpieceVol, headphonesVol, loudspeakerVol); int8_t d = event == WIPHONE_KEY_UP ? 6 : -6; earpieceVol += d; headphonesVol += d; loudspeakerVol += d; audio->setVolumes(earpieceVol, headphonesVol, loudspeakerVol); audio->getVolumes(earpieceVol, headphonesVol, loudspeakerVol); char buff[70]; snprintf(buff, sizeof(buff), "Speaker %d dB, Headphones %d dB, Loudspeaker %d dB", earpieceVol, headphonesVol, loudspeakerVol); debugCaption->setText(buff); } return res; } void MyApp::redrawScreen(bool redrawAll) { GUI_DEBUG("redrawScreen MyApp"); if (!screenInited || redrawAll) { GUI_DEBUG("redraw all"); // Initialize screen ((GUIWidget*) clearRect)->redraw(lcd); ((GUIWidget*) iconRect)->redraw(lcd); ((GUIWidget*) demoCaption)->redraw(lcd); ((GUIWidget*) debugCaption)->redraw(lcd); //((GUIWidget*) nameCaption)->redraw(lcd); //((GUIWidget*) uriCaption)->redraw(lcd); //lcd.fillRect(95, 240, 50, 20, WP_ACCENT_1); // DEBUG: very strange bug with white pixels over black border } else { // Refresh only updated labels if (demoCaption->isUpdated()) { GUI_DEBUG("stateCaption updated"); ((GUIWidget*) demoCaption)->redraw(lcd); } if (debugCaption->isUpdated()) { GUI_DEBUG("debugCaption updated"); ((GUIWidget*) debugCaption)->redraw(lcd); } /*if (nameCaption->isUpdated()) { GUI_DEBUG("nameCaption updated"); ((GUIWidget*) nameCaption)->redraw(lcd); } if (uriCaption->isUpdated()) { GUI_DEBUG("uriCaption updated"); ((GUIWidget*) uriCaption)->redraw(lcd); }*/ } screenInited = true; }
No comment yet.
Scooped by F. Thunus
Scoop.it!

Pi Pico MIDI Button Controller –

Pi Pico MIDI Button Controller – | Raspberry Pi | Scoop.it
Having played with MiniDexed a little now, I really wanted something that could select the different banks of voices for me.  This is how I've used a Raspberry Pi Pico as a set of "bank select" switches, but the switches could be used to send any MIDI change control messages.
No comment yet.
Scooped by F. Thunus
Scoop.it!

Sustainability | Free Full-Text | Evaluation of Water Level in Flowing Channels Using Ultrasonic Sensors

Sustainability | Free Full-Text | Evaluation of Water Level in Flowing Channels Using Ultrasonic Sensors | Raspberry Pi | Scoop.it
Monitoring flow in channels is difficult, expensive, and potentially dangerous; hence, alternatives minimizing these factors are sought and indirect methods to measure the flow based on water-level information, among others, are employed.
No comment yet.
Scooped by F. Thunus
Scoop.it!

Pirate Audio: Dual Mic for Raspberry Pi - Pimoroni

Pirate Audio: Dual Mic for Raspberry Pi - Pimoroni | Raspberry Pi | Scoop.it
Capture sounds in stereo and store them safely away in your Raspberry Pi with Pirate Audio: Dual Mic. It has a matched pair of I2S microphones, a vibrant high-res colour display, and four tactile control buttons.
No comment yet.