In this topic, the discussion is focused on the development of the EzData application for iOS.
Posts made by Dimi
-
EzData iOS App
-
RE: Lesson 1.2.1. LCD. How to create image array
@mikemoy Oh! Sorry. You can download this app here: https://ru.m5stack.com/downloads/Image2Code.exe
-
RemoteLoRa – more than ON/OFF
RemoteLoRa – more than ON/OFF
Figure 1
Today in the market you can find a bunch of all kinds of radio remotes. One of the most popular is the model based on IC2262/2272 (Figure 2). The solution is quite suitable for itself, but only in case you do not need feedback, encryption (or addressing) and analog mode.
Figure 2
I wanted to make an improved prototype of such a keyring, which will have in itself those advantages that are not in the existing solutions.
To create a prototype, I use the Base Unit M5Stack BASIC (you can buy here) with the pre-installed LORA Module and connected via I2C real clock time (because Wi-Fi with NTP to knit here will be superfluous).
When you turn on the device for the first time, it suggests choosing the type of connection with the client device - asynchronous or synchronous. If synchronous is selected, the device will wait for the control value from the slave, then signal (triangular icon with an exclamation mark).
It is further proposed to choose the type - digital (HIGH and LOW) or analog (-127 ... + 127). In digital mode, when accessing the slave device, HIGH or LOW will be transmitted alternately, and with an analog counter, increased by one. If an analog type is selected, the device will ask for the minimum and maximum value within which the counter will operate.
Next, the device will ask - will the key be used? (or
call the address whatever you want). If you select a closed lock, the device will wait for the key from the slave. For demonstration purposes, the slave is Arduino Nano with Module Ra-01. When turned on, the Arduino sends a key. This is visible in the video.Next, you can select the icon for the slave (Figure 3).
Figure 3
After you select the icon, you will be asked to select units or qualifying words, such as: "power", "red", "green", "blue", "cold", "warm", "$", " % "," oC "," uV "," mV "," V "," uA "," mA "," A "," uW "," mW "," W "," m / s "," km / H "," ug "," mg "," g "," kg "," mL "," L "," rpm "," dBm "," ". It is important!
After all the steps have been completed, you need to save this configuration by pressing the button A (or C to cancel).
The device will reboot and you will see the clock, date and time, battery charge, signal strength indicator, previously selected slave icon, device serial number to the right of the icon (starts from zero), default value and unit.
To access the slave, press A. To change the slave, press B.
To reboot the device, press C.If you want to remove the device from the list, then press C then B, instead of the slave device icon, the basket and serial number will be displayed. Use B to select the device to be deleted and press A (or C to cancel).
The real-time clock is set by pressing the C key after rebooting the device. You can access the hours, minutes, year, month, and day with the B key, and change the value with the C key. To save, press the A key.
Let's see what happened (YouTube). In this video, Arduino duplicates the received command, and M5Stack finds the control value in it and signals about it.
Source code is available on GitHub
I hope that this project will soon receive a public assessment and will leave the prototype shelf. Thank you very much for your time.
-
GSMout - receive SMS and calls "at home"
Picture 1Today, there are virtually no Internet resources that would not need your phone number. Verification of the number is usually done by receiving an SMS with a code or a call, where the last digits of the number are an argument for confirmation. If you are engaged in business, then you probably came across the fact that in order to perform certain banking operations, you must sign them using the code from SMS. Everything is good when you are in your home region and getting a code is not difficult, the situation is much more complicated if you are in another region where roaming does not work, because your phone or SIM card is not supported by local cellular operators. One of the elegant solutions is this project (Figure 1). In the home region, you leave M5Stack with a SIM card installed, get static IP from the operator, open the port and get access to the log of incoming SMS and calls online from anywhere in the world where there is Internet access.
No modems, but you hold on!
Out of the box in the Base Unit M5Stack there is no built-in modem and there is nowhere to insert a SIM card, so you need to additionally purchase a GSM module (you can select it at link) .
Please, when choosing
make sure that you have no sins behind your backbe especially selective... If you look datasheet on SIM800L, it says so:4.1. Power supply
The power supply range of SIM800L is from 3.4V to 4.4V. Recommended voltage is 4.0V. The transmitting burst will cause voltage drop and the power supply must be able to provide sufficient current up to 2A. For the VBAT input, a bypass capacitor (low ESR) such as a 100 μF is strongly recommended.
Do you understand what I mean? The dropper. My Air, on which I write the code, does not give a current of up to 2 A. We open the braid of the USB-C cable, cut what wire? Red. We connect an external power supply unit to 5 Volts 3 Amperes
so that for sureto the place of the notch. Now, the power of the Basic device will go from an external power source (and everything will be fine - I thought). But the modem did not think so. For him there was too much ~ 4.8 Volts and he screamed in every possible way with his only LED.It was necessary to look for a solution further. The standard Bottom Module has an attractive contact BAT. Class! All! Here is the solution! After all, a lithium-polymer battery is just 3.7 Volts. ESP32 needs 3.3 V. We power the basic device through this contact. One, two, three, multimeter say voltage! Bah! The voltage is again ~ 4.8 Volts. In the Basic device, the power circuit increased it. Method two has gone down in history.
The third method was the most successful. Hot air gun and step-down converter ** LM2596** have done their job (Figure 2).
Figure 2Which pull, captain?
When the hardware problems have passed us, we will create software! Download the project source from the GitHub repository.
At the beginning of the project code there are a couple of lines that you can edit if you want to change the server port
int web_port = 80;
and the web page address of the magazine
String web_mainPage =" GSMout ";
Pay attention to the data folder - files from this folder must be loaded into SPIFFS-memory using the plug-in for Arduino IDE called ESP32 Sketch Data Upload (the plug-in is in [this repository] (https://github.com/me-no-dev/arduino-esp32fs-plugin)), but before that you must add the file (s) of the type myHomeHotspot.wifi, where myHomeHotspot is the name of the Wi-Fi network, and the contents file - password. This is necessary to automatically connect the Core to Wi-Fi.
It works.
At startup, the device connects to a Wi-Fi network, then checks for Internet access, updates the time and date via NTP, and sets up the modem. The corresponding icons are shown on the display, watchCat and the journal web page address are responsible for the icons. When new messages arrive or the icon’s calls become colored and their number is displayed on the right, the counter is reset to zero after the log web page is requested. That's all.
When you open the address indicated on the M5Stack screen, a log is displayed in the browser (Figure 3).
Figure 3I hope this project helps you someday. Special thanks to the author of the article "at-command of the gsm modem sim900" located here.
A video demonstration of the work can be seen here
-
GSMout – приём SMS и звонков "как дома"
Рисунок 1Сегодня практически отсутствуют Интернет-ресурсы, которым бы был не нужен Ваш номер телефона. Верификация номера проходит обычно путём получения SMS с кодом или звонком, где последние цифры номера являются аргументом для подтверждения. Если Вы занимаетесь бизнесом, то наверняка сталкивались с тем, что для совершения тех или иных банковских операций необходимо подписывать их с помощью кода из SMS. Всё хорошо, когда находитесь в домашнем регионе и получить код не составит труда, гораздо сложней ситуация обстоит, если Вы находитесь в другом регионе, где роуминг не работает, т. к. Ваш телефон или SIM-карта не поддерживается местными сотовыми операторами. Одним из элегантных решений является данный проект (рисунок 1). В домашнем регионе Вы оставляете M5Stack с установленной SIM-картой, получаете белый IP у оператора, открываете порт и получаете доступ к журналу входящих SMS и звонков онлайн с любой точки мира, где есть Интернет.
<cut />
Модемов нет, но Вы держитесь!
Из коробки в Базовом устройстве M5Stack нет встроенного модема и вставлять SIM-карту некуда, поэтому необходимо дополнительно приобрести GSM модуль (выбрать можно по ссылке).
Пожалуйста, при выборе
убедитесь, что у Вас нет грехов за спинойбудьте особенно избирательны... Если посмотреть datasheet на SIM800L, то там сказано так:4.1. Power Supply
The power supply range of SIM800L is from 3.4V to 4.4V. Recommended voltage is 4.0V. The transmitting burst will cause voltage drop and the power supply must be able to provide sufficient current up to 2A. For the VBAT input, a bypass capacitor (low ESR) such as a 100 μF is strongly recommended.
Понимаете о чём я? "Капельница". Мой Air, на котором я пишу код, не отдает ток до 2 А. Вскрываем оплётку USB-C кабеля, перерезаем какой провод? Красный. Подключаем внешний блок питания на 5 Вольт 3 Ампера
чтоб уж навернякав место надреза. Теперь питание Базового устройства будет идти от внешнего источника питания (и всё станет хорошо - подумал я). Но модем так не думал. Для него было слишком много ~4,8 Вольт и он всячески "кричал" своим единственным светодиодом.Надо было искать решение дальше. У стандартного Завершающего модуля есть привлекательный контакт BAT. Класс! Всё! Вот оно решение! Ведь литий-полимерный аккумулятор как раз на 3,7 Вольта. ESP32 надо 3.3 В. Запитываем Базовое устройство через этот контакт. Раз, два, три, мультиметр напряжение говори! Бах! Напряжение опять ~4,8 Вольт. В Базовом устройстве схема питания его повысила. Способ два ушёл в историю.
Способ третий оказался самым успешным. Термофен и понижающий преобразователь LM2596 сделали своё дело (рисунок 2).
Рисунок 2За что дёрнуть, капитан?
Когда аппаратные проблемы нас миновали, создадим программные! Скачиваем исходник проекта с GitHub-репозитория.
В начале кода проекта есть пара строчек, которые Вы можете отредактировать, если захотите изменить порт сервера
int web_port = 80;
и адрес веб-страницы журнала
String web_mainPage = "GSMout";
Обратите внимание на папку data – файлы из этой папки необходимо загрузить в SPIFFS-память с помощью плагина для Arduino IDE, который называется ESP32 Sketch Data Upload (плагин находится в этом репозитории), но перед этим Вы должны добавить туда файл(ы) типа myHomeHotspot.wifi, где myHomeHotspot - имя Wi-Fi-сети, а содержимое файла – пароль. Это необходимо для автоматического подключения Базового устройства к Wi-Fi.
Это работает.
При запуске устройство подключается к Wi-Fi-сети, затем проверяет наличие доступа к Интернет, обновляет время и дату по NTP, настраивает модем. На дисплее отображаются соответсвующие иконки, за иконки отвечает watchCat и адрес веб-страницы журнала. Когда приходят новые сообщения или звонки иконки становятся цветными и справа отображается их число, счётчик обнуляется после запроса веб-страницы журнала. На этом всё.
При открытии адреса, указанного на экране M5Stack, в браузере отображается журнал (рисунок 3).
Рисунок 3Надеюсь, Вас данный проект выручит когда-нибудь. Особая благодарность автору статьи "at-команды gsm модема sim900", расположенной здесь.
Видео с демонстрацией работы можно посмотреть здесь
-
ESP32 and the SPIFFS file system
SPIFFS – (Serial Peripheral Interface Flash File System). In simple words: there is an ESP32 microcontroller (figure 1), it has a built-in rewritable non-volatile NOR memory, which stores: settings (Preferences), bootloader (Bootloader), firmware (compiled sketch), file system (SPIFFS) and something else, such as "over-the-air" updates (OTA).
Figure 1. Functional block diagram of the ESP32 microcontroller
NOR-memory is a type of non-volatile rewritable memory, which has a sufficiently high read speed, relatively low write and stream speed, in comparison with the type of memory NAND. It is almost impossible to meet NOR-memory of a large volume, usually it is limited to 128 MBytes. In the case of ESP32– 4 MB.
To date, SPIFFS has some drawbacks
shortcomings, including: lack of folder support; no real-time stack, so the same operation may take different time; lack of ability to find and fix broken blocks. If the listed shortcomings are not critical for You, then we will continue to read the following paragraph.Let's talk about using
Unfortunately, out of the box, the memory of the microcontroller is not marked up under SPIFFS, in order to mark up, you need to use the plugin ESP32FS for the Arduino IDE development environment.
After the plugin is downloaded – it must be installed:
- Make sure you have the latest version of the Arduino IDE and driver for Your device on ESP32. I have M5Stack drivers CP210X I download on this link;
- Copy the downloaded tool folder with the plug-in attached to it to the /Arduino/tools/ESP32FS folder/;
- In macOS the folder is located at ~/Documents/Arduino/;
- Restart the computer and provrete in the development environment in the menu Tools (Tools) appears item ESP32 Sketch Data Upload (figure 2) - so you have done everything correctly;
Figure 2. Menu Tools
- Note the data folder next to the sketch. All files located in this folder will be loaded into the device's memory when formatting;
- Feel free to select the specified item and wait for the end of formatting the memory area. Please note that other memory areas will not be affected, which means that the firmware will remain in the device's memory and will work. Similarly with the sketch, when it is compiled into the firmware and loaded into the device-the file system will not be affected.
If you want comfort
-
If you want to touch files and see information about free space, then download the sketch BRIDGE and stitch your device with it.
-
Also download
and compilecross-platform file Manager A-Explorer (figure 3). On GitHub the binary files are in the realize folder.Figure 3, a. A-Explorer File Manager for macOS
Figure 3, b. A-Explorer File Manager for Windows
This file Manager allows you to find information about free space, upload/download / delete files. There is an indication of the progress of the operation.
As you can see in figure 3, the plugin marked up approximately 1.38 MB of memory under SPIFFS.
Who is this BRIDGE?
BRIDGE is a sketch, and above all a function of the same name that works with the SPIFFS file system and A-Explorer is a graphical shell for it. The latter sends a particular command, and this function processes it on the device itself using the FS and SPIFFSlibraries. Let's see what's interesting about these libraries.
How to use public methods of the SPIFFS class:
-
Bool begin method(bool formatOnFail=false, const char * basePath= "/spiffs", uint8_t maxOpenFiles=10). This method attempts to initialize an instance of the class. The first argument is true or false, in case it is worth formatting the background system if the file system is not formatted. The second argument takes the path where the root of the file system will be located. The third argument will determine the number of files opened at the same time. It is better to leave the last two parameters defaulted and not change them. If there is no file system (the plugin above was not used). that function will return a lie.
-
The bool format() method will check whether the file system is formatted-returns true, in the primitive case-false.
-
Size_t totalBytes() method. This method returns size_t-the number of total Bytes allocated for the file system.
-
Size_t usedBytes() method. This method returns size_t-the number of Bytes used in the file system.
-
Void end() method. This method leads to the deinitialization of this class. After calling this method, it is pointless to call other methods.
In this class, everything, nothing particularly interesting. Let's go to the class FS and see what we can use from there.
-
The first thing that catches your eye is the initializer method of the bool begin() class. This method does not require arguments and there is no need to call it, because we will use the following method immediately.
-
Method File open (const char* path, const char* mode) and its brother File open(const String& path, const char* mode). These methods take two arguments each: the first is a character pointer and a string pointer to the file path, and the second is an open mode, which can be the following constat:
FILE_READ – open read-only;
FILE_WRITE – open for writing only;
FILE_APPEND – open for additional recording.
After we have opened the file, we can now perform any operations on it.
- The size_t write(uint8_t) method allows you to write a single 8-bit unsigned integer to the end of the file.
- The size_t write method (const uint8_t *buf, size_t size) allows you to write a number of unsigned integers of the specified length in the second argument.
- The int available() method counts the number of characters from the end to the pointer.
- The int read() method reads a single character from the file and returns it as an integer, with the cursor shifted one right.
- The size_t readBytes(char *buffer, size_t length) method reads characters to the buffer, the pointer to which is received by the first argument, and the number of characters passed by the second argument. Returns the number of characters used.
- The String readString () method reads a string from a file.
- The int peek() method works similarly to the int read () method, only the cursor remains in place.
- The bool seek(uint32_t pos, SeekMode mode) and bool seek(uint32_t pos, SeekMode mode) methods set the cursor to the specified location. The first argument passes the position, and the second rule (SeekSet - set the cursor). If successful-returns true, otherwise-false.
- The size_t position() method returns the cursor position.
- The size_t size() method returns the file size in Bytes.
- The const char * name() method returns the file name.
- Const char * fullName() method with full path.
- The bool isFile() method returns true if the open object is a file. Otherwise, it's a lie.
- The bool isDirectory() method returns true if the open object is a folder. Otherwise, it's a lie.
- The File openNextFile() method returns a pointer to the next file in the root, otherwise NULL.
- The method bool exists(const char* path) and bool exists(const String& path) takes the full file name as an argument, and if such a file exists, it returns true, otherwise it is false.
- The bool remove(const char* path) and bool remove(const String& path) methods attempt to delete the file whose name is passed as arguments. If successful, returns istrina, otherwise-a lie.
- Method bool rename(const char* pathFrom, const char* pathTo) and bool rename (const String& pathFrom, const String& pathTo); takes the full file name first arguments, and the second full new file name and rename.
Yes, you can take this function and run it in a separate thread in any other sketch 😉
Thank you very much for your time! I will be glad if this article will benefit you.
List of references and (or) sources:
- SPIFFS Filesystem
- Working with the file system in the addon ESP8266 in the Arduino IDE
- Arduino ESP32 filesystem uploader
-
Storing settings in the memory of the Core
Storing settings in the memory of the Core
Hello! If you are fortunate enough to hold the ESP32 microcontroller in your hands (I was more fortunate and have M5Stack in my hands) from the Chinese company ESPRESSIF, then this post may be useful.
There is a situation when it is necessary to save some parameters in non-volatile memory (for example: count the number of times the device is turned on for the entire time or save the Wi-Fi settings). This can be done with ease using the Preferences library.
We declare an instance of the Preferences class, and there we will see ...
The first thing we need to do is create a keychain by calling the begin method with a pair of arguments (but only with the first one): the name of the keychain and the read-only flag.
To save a string value in memory, you need to pass the key and the value itself to a method whose name consists of two parts: the first is put and the second is the type name, for example: String. Everything is clear and understandable. True, there are still "raw" bytes
without roasting, to which no one wants to assign a type. In this case, the method also takes the third argument with the number of these bytes. With this procedure, everything seems to be.After the value has been written, you can read using the method (whose name is similar to the previous one), where the first part will be get. This method returns the value for the key of the corresponding type. Remember the byte case? If you don’t know (or don’t remember) how many bytes are on the key, then pull the getBytesLength method with a single argument - the key, it will calculate everything and return the amount to size_t.
If you want to remove a certain key from the keychain, then give it the only argument to the remove method.
Do you want to bring a real marafet and clear the whole bunch? Call the clear method without any arguments!
When you wish to complete the work with the bundle, call the end method without any arguments.
In general, the following types are supported: Char, UChar, Short, UShort, Int, UInt, Long, ULong, Long64, ULong64, Float, Double, Bool, String and Bytes.
I understand that I want
somethingcode, so here is a sketch. A sketch counts the number of turns on the device and displays it on the display:#include <M5Stack.h> #include <Preferences.h> Preferences preferences; const char* key = "OnOff"; uint32_t count; void setup() { m5.begin(); preferences.begin("MyKeyChain"); count = preferences.getUInt(key); preferences.putUInt(key, count + 1); M5.Lcd.setTextSize(3); M5.Lcd.setTextColor(TFT_WHITE); M5.Lcd.println("Hello, Habr!"); M5.Lcd.setTextSize(2); M5.Lcd.println("M5Stack Turned On:"); M5.Lcd.setTextSize(3); M5.Lcd.setTextColor(TFT_RED); M5.Lcd.println(count); M5.Lcd.setTextColor(TFT_WHITE); M5.Lcd.setTextSize(2); M5.Lcd.println("times"); } void loop() { }
Library link.
-
Showing numbers with the flashes of light
Showing numbers with the flashes of light
Hello! If a situation arises when it is necessary to find out the humidity and temperature, but the display is not possible to use for some reason.
List of reasons:
- expensive;
- afraid of moisture;
- too lazy to solder;
- a small print that is not visible at all;
- important aesthetics and minimalism;
- all listed together.
In this case, there is an excellent reason to use the color approach to displaying information. Everything would be fine, but the primary colors are completely worthless - some seven (from the rainbow). Can you distinguish between light blue and blue or yellow from orange? What to do? Remove such strange colors! Leave: Red, Yellow, Green, Blue, Purple and White (unexpectedly, yes?). How much did it work? 6. And there are 10 digits, and even a minus for negative numbers, a floating point and a separator. We will be smart and make a flasher! Violet - it will be 5, and six it will be 5 + 1, and 1 will be Red. Just fit. Huh! Table 1 shows the colors for the corresponding characters.
Table 1
Number (or char) Color (s) Zero blink VIOLET One light up RED Two light up YELLOW Three light up GREEN Four light up BLUE Five light up VIOLET Six blink VIOLET / RED Seven blink VIOLET / YELLOW Eight blink VIOLET / GREEN Nine blink VIOLET / BLUE Negative (-) blink WHITE / RED Floating point (.) blink WHITE Line feed (\n) light up WHITE Primary you need download and connect the library. Then declare a custom callback function void callback (int, int, int) R, G, B - channels (from 0 to 255), which will access the hardware (light up the LED). Call the lightf function, where the first argument will be a pointer to this same callback function, then a line with a format that is completely analogous to printf and any number of arguments. Remember to use the newline character \ n, after each qualifier in the format string.
At my fingertips lies the Base Unit M5Stack FIRE with built-in Neopixel panels, for testing, as nothing else is better. You can watch a video demonstrating a sketch showing the Pi number with an accuracy of 6 decimal places (YouTube) here.
Thanks!
Download library (GitHub) here
-
Lesson 23. M5CAMERA. Introduce
The purpose of this lesson
Hi! Today we'll meet M5CAMERA (figure 1).
Figure 1
This tutorial will teach you how to use the camera with a web browser.
Short help
- Purpose: used for video surveillance in real time
- Scope: agriculture, science and home life
- Connection interface: Wi-Fi, I2C (Groove), PDM, GPIO, USB Type C
Supply voltage: 5 V - Compatibility: any modern web browser as a client
- Form factor: LEGO compatible
Brief overview
M5CAMERA is the original decision to broadcast images in real time, created by a team of developers M5STACK. This device does not need settings and complex software (figure 1.1).
Figure 1.1
The front panel is centered with the camera lens. To the right of the lens there are holes under which there is a power LED. Below, under the lens, is the M5 logo. On the left side panel there is a button to restart the device. On both sides there are LEGO - compatible holes for the bushings for mounting the legs (figure 2).
Figure 2
There is a sticker with tips on the front side of the device. On the bottom side panel there are I2C (Groove) and USB Type C connectors one after another. The front panel and the front panel are partially connected by means of slot latches and fixed by screws of size M5 (figure 2.1).
Figure 2.1
The heart of this device is the ESP32 module from ESPRESSIF. You can additionally purchase and connect motion sensors (I2C), temperature sensors (I2C), microphone (PDM), LEDs (GPIO), battery. The "eye of the device" is an OV2640 camera with a resolution of 2 Megapixels (figure 2.3).
Figure 2.3
Note: do not attempt to adjust the focus of the camera by rotating the lens, otherwise it will damage the camera loop (figure 3).
Figure 3
Let's start!
Connect the camera to a power source (such as a USB cable). Wait for the red power LED to glow. Good. Now use your smartphone / tablet / computer to connect wirelessly to the access point that the camera has created automatically. Go to Settings (figure 4).
Figure 4
Refer to the wireless Wi-Fi settings section (figure 4.1).
Figure 4.1
Your device should find the wireless network M5Cam-test. Connect to this network (figure 4.2).
Figure 4.2
Good! Now open any new browser and go to http://192.168.4.1 (figure 5 - 5.2).
Figure 5
Figure 5.1
Figure 5.2
Downloads
There is nothing in this tutorial ;)
Demo
There is nothing in this tutorial ;)
-
Урок 23. M5CAMERA. Знакомство
Цель урока
Привет! Сегодня мы познакомимся с M5CAMERA (рисунок 1).
Рисунок 1
Этот урок научит: использовать камеру с помощью веб-браузера.
Краткая справка
- Назначение: применяют для видеонаблюдения в реальном времени
- Сфера применения: сельское хозяйство, наука и домашний быт
- Интерфейс подключения: Wi-Fi, I2C (Groove), PDM, GPIO, USB Type C
- Напряжение питания: 5 В
- Совместимость: любой современный веб-браузер в качестве клиента
- Форма-фактор: LEGO-совместимый
Краткий обзор
M5CAMERA — это оригинальное решение для трансляции изображения в режиме реального времени, созданное командой разработчиков M5STACK. Данное устройство не нуждается в настройках и сложном программном обеспечении (рисунок 1.1).
Рисунок 1.1
На лицевой панели по центру располагается объектив камеры. Справа от объектива имеются отверстия, под которыми находится светодиод питания. Ниже, под объективом, располагается логотип М5. На левой боковой панели присутствует кнопка перезагрузки устройства. По обоим боковым сторонам имеются LEGO-совместимые отверстия для втулок для крепления ножек (рисунок 2).
Рисунок 2
На фронтальной стороне устройства наклеена наклейка с подсказками. На нижней боковой панели располагаются друг за другом I2C (Groove) и USB Type C разъёмы. Лицевая панель и фронтальная соеденины частично с помощью пазовых защёлок и зафиксированы винтами типоразмера М5 (рисунок 2.1).
Рисунок 2.1
Сердцем данного устройства является модуль ESP32 от компании ESPRESSIF. Вы можете дополнительно приобрести и подключить датчики движения (I2C), температуры (I2C), микрофон (PDM), светодиоды (GPIO), аккумулятор. В качестве "глаза устройства" выступает камера OV2640 разрешение 2 Мегапикселя (рисунок 2.3).
Рисунок 2.3
Примечание: не пытайтесь настроить фокус камеры с помощью вращения объектива, иначе это приведёт в повреждению шлейфа камеры (рисунок 3).
Рисунок 3
Начнём!
Подключите камеру к источнику питания (например, с помощью USB-кабеля). Дождитесь свечения красного светодиода питания. Хорошо. Теперь используйте Ваш смартфон/планшет/компьютер для того, чтобы подключиться по беспроводной сети Wi-Fi к точке доступа, которую создала автоматически камера. Зайдите в Настройки (рисунок 4).
Рисунок 4
Обратитесь к разделу настроек беспроводной сети Wi-Fi (рисунок 4.1).
Рисунок 4.1
Ваше устройство должно найти беспроводную сеть M5Cam-test. Подключитесь к данной сети (рисунок 4.2).
Рисунок 4.2
Хорошо! Теперь откройте любой современный браузер и перейдите по адресу http://192.168.4.1 (рисунок 5 - 5.2).
Рисунок 5
Рисунок 5.1
Рисунок 5.2
Downloads
В этом уроке здесь ничего нет ;)
Demo
В этом уроке здесь ничего нет ;)
-
Lesson 14.2. UI Flow. Burning with Mac
The purpose of this lesson
Hi! Today we will learn how to flash M5 using macOS (figure 1).
Figure 1
This lesson will teach you how to: update the M5 firmware using the macOS operating system.
Let's start!
The first thing to do is to visit the official website https://m5stack.com, then select Explore [1] (figure 2), Download [2] from the top menu.
Figure 2
The first thing to download is the driver [1] (figure 3) and the program [2].
Figure 3
Once the driver download is complete. Open the file as shown in figure 4.
Figure 4
Proceed according to the screenshots in figures 5-5.6.
Figure 5
Figure 5.1
Figure 5.2
Figure 5.3
Figure 5.4
Figure 5.5
Figure 5.6
Great! Drivers are installed. You must now allow the operating system to run third-party applications. To do this, open the search [1] (figure 6), then find the Terminal application.app and start it by pressing Enter [2].
Figure 6
Now write the line below and press Enter (figure 6.1).
sudo spctl --master-disable
Figure 6.1
Good! Now click on the Apple in the upper left corner [1] (figure 6.2), then open System Preferences... [2], then open Security & Privacy [3].
Figure 6.2
Make sure you have the radio check box set to Anywhere (if not, check it) (figure 6.3).
Figure 6.3
Now go back to the browser to downloads [1] (figure 7) and open the file with the Ctrl key pressed [2].
Figure 7
So, now connect your device to your Mac with a USB cable. Select the most current SOFTWARE version and click on the Flash [1] button (figure 7.1). At the end of the process, the indicator will be completely painted [2].
Figure 7.1
Once the device is flashed - disconnect the cable from the Mac and press the red button (the same power button) on the M5. That's it!
Downloads
Alas, there is nothing here today :)
-
Урок 14.2. UI Flow. Обновление ПО с помощью macOS
Цель урока
Привет! Сегодня мы научимся прошивать М5 с помощью macOS (рисунок 1).
Рисунок 1
Этот урок научит: обновлять прошивку М5 с помощью операционной системы macOS.
Начнём!
Первое, что необходимо сделать - посетить официальный сайт https://m5stack.com, затем в верхнем меню выбрать Explore [1] (рисунок 2), Download [2].
Рисунок 2
Первое, что необходимо скачать - драйвер [1] (рисунок 3) и программу [2].
Рисунок 3
После того, как загрузка драйвера будет завершена. Откройте файл как показано на рисунке 4.
Рисунок 4
Действуйте согласно скриншотам на рисунках 5 - 5.6.
Рисунок 5
Рисунок 5.1
Рисунок 5.2
Рисунок 5.3
Рисунок 5.4
Рисунок 5.5
Рисунок 5.6
Отлично! Драйвера установлены. Теперь необходимо разрешить операционной системе запуск сторонних приложений. Для этого откройте поиск [1] (рисунок 6), затем найдите приложение Terminal.app и запустите его с помощью клавиши Enter [2].
Рисунок 6
Теперь напишите строку, приведённую ниже и нажмите Enter (рисунок 6.1).
sudo spctl --master-disable
Рисунок 6.1
Хорошо! Теперь нажмите на яблоко в левом верхнем углу [1] (рисунок 6.2), затем откройте System Preferences... [2], затем откройте Security & Privacy [3].
Рисунок 6.2
Убедитесь в том, что у Вас установлен радио-флажок на Anywhere (если нет, то установите его) (рисунок 6.3).
Рисунок 6.3
Теперь вернитесь в браузер к загрузкам [1] (рисунок 7) и откройте файл за зажатой клавишей Ctrl [2].
Рисунок 7
Так, теперь подключите устройство к Mac с помощью USB-кабеля. Выберите самую актуальную версию ПО и нажмите на кнопку Flash [1] (рисунок 7.1). По окончанию процесса индикатор будет закрашен полностью [2].
Рисунок 7.1
После того, как устройство будет прошито - отсоедините кабель от Mac и нажмите красную кнопку (это же кнопка питания) на М5. На этом всё!
Downloads
Увы, тут сегодня ничего нет :)
-
Lesson 15.1. UIFlow it's easy
The purpose of this lesson
Hi! Today we finally get to know in detail the elements of UIFlow and understand the things that previously seemed mysterious (figure 1).
Figure 1
This lesson will teach you how to understand the interface of the UIFlow development environment and understand the basic principles of working with blocks.
Short help
- Purpose: development environment for m5stack family of devices in Blockly and MicroPython languages
- Scope: education
- Connection interface: Wi-Fi (Internet)
- Compatibility: device family M5STACK
Brief overview
In order to start please follow the link http://flow.m5stack.com (detailed connection procedure given in lesson 15). Let's look at section A in figure 2-these are UI elements. You can drag and drop them to the virtual device display and then access them using the links in the UI tab. Good! Now let's look at section B - a library of Units-modules, their methods and properties are hidden in the tab under the same name.
Figure 2
Section C contains Loop loop and built-in button event handlers.
Section D contains a switch between Blockly or Python programming languages. Section E contains the main menu. You can access the forum with the first button; read the documentation with the second button; with the third button, you can select sample programs; with the fourth and fifth buttons, you can undo or redo the action; with the sixth button, you can open the resource Manager (for example, to load pictures into the device memory); by clicking on the seventh button you will load the code into the temporary memory of the device and run it (the code will be deleted after the device reboot); with the last button you can open the continuation of the menu. In this section E is finished. Let's look at the last one with the first button (at the top) to place the Blockly code in the center of the workspace; with the second and third buttons you can zoom; in order to delete a block - just drag it to the fourth button (the image of the basket) and the block will be permanently deleted.Let's start!
Blockly (UI Flow)
The most difficult, in my opinion, is to understand how to work with variables. Therefore, I will try to explain this in as much detail as possible in this lesson. All other elements of the language Blockly easy to use because of the fact that the names speak of their direct purpose and the extra words here will not be useful.
So let's get started! To create a variable, click the Variables tab (1) (figure 3) in the blocks menu, then click the Create variable button... (2).
Figure 3
Now a window will appear asking you to enter the name of the new variable. Enter a name (1) (figure 3.1), then click OK (2).
Figure 3.1
Great! The variable is now created (figure 3.2). You can now use the set and change methods to change the values of all created variables.
Figure 3.2
If you want to use a variable you drag it with the mouse to the workspace (figure 3.3). You can replace a variable in the block with another one created earlier, as well as rename and delete it.
Figure 3.3
The most "difficult" was over. Now you know how to work with variables in Blockly language.
Now let's move on to the next tab Math. This tab contains mathematical methods and constants (figure 4).
Figure 4
Pay attention to the first (top) block - it is designed to store numeric values (even integer, even fractional). The second block allows you to perform basic mathematical operations (addition, subtraction, multiplication and division). The third block contains mathematical constants (PI, e, etc.). The fourth block allows you to get the remainder of the division. The fifth block allows you to define the type of number (even, odd, integer or fractional, positive or negative, etc.). All the other blocks, I will not describe, I think You are so clear what they are doing, judging by their names.
Now let's go to the tab called Loops (figure 5). Here there is all sorts of set of cycles. The first (top) loop executes the code inside the specified number of times (for example, 10). The second loop executes the code until a condition is met. The third will iterate through the list and put the i-th element in the variable i. The fourth one is like a classic for loop. the Fifth block allows you to exit the for loop forcibly.
Figure 5
Go to the next tab Logic. It is not difficult to guess that this tab contains elements related to logical operations (figure 6). The first block (above) is a condition without exception. The second-condition with the exception. The third constant is True or False. Fourth-conditions (<, <=, >, >= and others). Fifth-denial of (NOT), like ! In the sixth language, the nonexistent NULL value. Seventh-logical operators. The eighth block compares the condition and returns the corresponding value from the if true or if false block.
Figure 6
Let's look at the Graphic tab (figure 7). This tab has a set of methods for displaying text and simple mathematical figures on the display of the device.
Figure 7
If you want to quickly draw a smiley on your device, the Emoji tab will help you perfectly (figure 8).
Figure 8
In the future, I hope, in the tab Timer (figure 9) there will be additional functions to work with time, but for now You can use the delay block (the time during which the device does nothing).
Figure 9
It will be difficult to understand the code if it does not consist of functions. Function to create tab Functions (figure 10).
Figure 10
The first (top) block allows you to create a function named dosomething that returns nothing. The second block allows you to create a function that can return a value or variable. If you want to add function arguments, you need to click on the button with the gear image, drag and drop from the left window to the right block input name and write the argument name (for example: x, y) (figure 10.1).
Figure 10.1
The third block returns the bound value from the function itself when the condition is met.
So, with functions worked out. Let's go to the Text tab (figure 11). If you need a string variable, use the first block (above). If you want to convert all letters to upper or lower case, use the second block. If you need to get a letter under a certain sequence number, use the third block. Using the fourth block, you can count the number of occurrences of the first argument in the string. The fifth block allows you to check whether the line is empty. You can find out the length of the string using the sixth block. If you want to display a line, use the seventh block. You can use the eighth block to replace a substring in a string with a new string. With the ninth block you can rewrite the line in reverse. With the help of the tenth block, You can remove the spaces.
Figure 11
If you need to request text input on the device screen, use the eleventh and twelfth blocks. With the thirteenth block, you can cast variables and constants of a different type to the string type.
Let's look at the Lists tab (figure 12). As you know there is a "data type" in Python.
Figure 12
With the first block (above) you can count the number of items in the list. The second block lets you know if the list is empty. With the third block you can find the number of the item in the list. With the fourth block you can create an empty list. With the help of the fifth block You can create a list with an unlimited number of items added manually (figure 12.1).
Figure 12.1
With the sixth block You can get/remove an item under a specific number. With the seventh block You can get a sublist within the given boundaries from the list. With the eighth block you can create a list of the same elements of any length. With the ninth block you can reverse the order of the list. With the tenth block you can set the value of the required list item. With the eleventh block, you can create a list from a string or a string from a list according to a given delimiter. This with the tab for today.
Let's move on to the very interesting and latest tab on today's Remote.
With this tab you can access Your device from anywhere in the world where there is Internet. It is enough to drag the first block into the code of Your program (above), after downloading the code into the device - the screen will display the QR-code (figure 13.1), if it is scanned using a mobile phone or tablet, a Web page with remote controls (blocks from the second to the last) will open (figure 13.2).Figure 13
Figure 13.1
Figure 13.2
When you access certain elements from the Web page, the corresponding handler functions will be run.
C & C++ (Arduino IDE)
Example not yet written ^_^
Downloads
Alas, there is nothing here today :)
-
Lesson 15.1. UIFlow it's easy
The purpose of this lesson
Hi! Today we finally get to know in detail the elements of UIFlow and understand the things that previously seemed mysterious (figure 1).
Figure 1
This lesson will teach you how to understand the interface of the UIFlow development environment and understand the basic principles of working with blocks.
Short help
- Purpose: development environment for m5stack family of devices in Blockly and MicroPython languages
- Scope: education
- Connection interface: Wi-Fi (Internet)
- Compatibility: device family M5STACK
Brief overview
In order to start please follow the link http://flow.m5stack.com (detailed connection procedure given in lesson 15). Let's look at section A in figure 2-these are UI elements. You can drag and drop them to the virtual device display and then access them using the links in the UI tab. Good! Now let's look at section B - a library of Units-modules, their methods and properties are hidden in the tab under the same name.
Figure 2
Section C contains Loop loop and built-in button event handlers.
Section D contains a switch between Blockly or Python programming languages. Section E contains the main menu. You can access the forum with the first button; read the documentation with the second button; with the third button, you can select sample programs; with the fourth and fifth buttons, you can undo or redo the action; with the sixth button, you can open the resource Manager (for example, to load pictures into the device memory); by clicking on the seventh button you will load the code into the temporary memory of the device and run it (the code will be deleted after the device reboot); with the last button you can open the continuation of the menu. In this section E is finished. Let's look at the last one with the first button (at the top) to place the Blockly code in the center of the workspace; with the second and third buttons you can zoom; in order to delete a block - just drag it to the fourth button (the image of the basket) and the block will be permanently deleted.Let's start!
Blockly (UI Flow)
The most difficult, in my opinion, is to understand how to work with variables. Therefore, I will try to explain this in as much detail as possible in this lesson. All other elements of the language Blockly easy to use because of the fact that the names speak of their direct purpose and the extra words here will not be useful.
So let's get started! To create a variable, click the Variables tab (1) (figure 3) in the blocks menu, then click the Create variable button... (2).
Figure 3
Now a window will appear asking you to enter the name of the new variable. Enter a name (1) (figure 3.1), then click OK (2).
Figure 3.1
Great! The variable is now created (figure 3.2). You can now use the set and change methods to change the values of all created variables.
Figure 3.2
If you want to use a variable you drag it with the mouse to the workspace (figure 3.3). You can replace a variable in the block with another one created earlier, as well as rename and delete it.
Figure 3.3
The most "difficult" was over. Now you know how to work with variables in Blockly language.
Now let's move on to the next tab Math. This tab contains mathematical methods and constants (figure 4).
Figure 4
Pay attention to the first (top) block - it is designed to store numeric values (even integer, even fractional). The second block allows you to perform basic mathematical operations (addition, subtraction, multiplication and division). The third block contains mathematical constants (PI, e, etc.). The fourth block allows you to get the remainder of the division. The fifth block allows you to define the type of number (even, odd, integer or fractional, positive or negative, etc.). All the other blocks, I will not describe, I think You are so clear what they are doing, judging by their names.
Now let's go to the tab called Loops (figure 5). Here there is all sorts of set of cycles. The first (top) loop executes the code inside the specified number of times (for example, 10). The second loop executes the code until a condition is met. The third will iterate through the list and put the i-th element in the variable i. The fourth one is like a classic for loop. the Fifth block allows you to exit the for loop forcibly.
Figure 5
Go to the next tab Logic. It is not difficult to guess that this tab contains elements related to logical operations (figure 6). The first block (above) is a condition without exception. The second-condition with the exception. The third constant is True or False. Fourth-conditions (<, <=, >, >= and others). Fifth-denial of (NOT), like ! In the sixth language, the nonexistent NULL value. Seventh-logical operators. The eighth block compares the condition and returns the corresponding value from the if true or if false block.
Figure 6
Let's look at the Graphic tab (figure 7). This tab has a set of methods for displaying text and simple mathematical figures on the display of the device.
Figure 7
If you want to quickly draw a smiley on your device, the Emoji tab will help you perfectly (figure 8).
Figure 8
In the future, I hope, in the tab Timer (figure 9) there will be additional functions to work with time, but for now You can use the delay block (the time during which the device does nothing).
Figure 9
It will be difficult to understand the code if it does not consist of functions. Function to create tab Functions (figure 10).
Figure 10
The first (top) block allows you to create a function named dosomething that returns nothing. The second block allows you to create a function that can return a value or variable. If you want to add function arguments, you need to click on the button with the gear image, drag and drop from the left window to the right block input name and write the argument name (for example: x, y) (figure 10.1).
Figure 10.1
The third block returns the bound value from the function itself when the condition is met.
So, with functions worked out. Let's go to the Text tab (figure 11). If you need a string variable, use the first block (above). If you want to convert all letters to upper or lower case, use the second block. If you need to get a letter under a certain sequence number, use the third block. Using the fourth block, you can count the number of occurrences of the first argument in the string. The fifth block allows you to check whether the line is empty. You can find out the length of the string using the sixth block. If you want to display a line, use the seventh block. You can use the eighth block to replace a substring in a string with a new string. With the ninth block you can rewrite the line in reverse. With the help of the tenth block, You can remove the spaces.
Figure 11
If you need to request text input on the device screen, use the eleventh and twelfth blocks. With the thirteenth block, you can cast variables and constants of a different type to the string type.
Let's look at the Lists tab (figure 12). As you know there is a "data type" in Python.
Figure 12
With the first block (above) you can count the number of items in the list. The second block lets you know if the list is empty. With the third block you can find the number of the item in the list. With the fourth block you can create an empty list. With the help of the fifth block You can create a list with an unlimited number of items added manually (figure 12.1).
Figure 12.1
With the sixth block You can get/remove an item under a specific number. With the seventh block You can get a sublist within the given boundaries from the list. With the eighth block you can create a list of the same elements of any length. With the ninth block you can reverse the order of the list. With the tenth block you can set the value of the required list item. With the eleventh block, you can create a list from a string or a string from a list according to a given delimiter. This with the tab for today.
Let's move on to the very interesting and latest tab on today's Remote.
With this tab you can access Your device from anywhere in the world where there is Internet. It is enough to drag the first block into the code of Your program (above), after downloading the code into the device - the screen will display the QR-code (figure 13.1), if it is scanned using a mobile phone or tablet, a Web page with remote controls (blocks from the second to the last) will open (figure 13.2).Figure 13
Figure 13.1
Figure 13.2
When you access certain elements from the Web page, the corresponding handler functions will be run.
C & C++ (Arduino IDE)
Example not yet written ^_^
Downloads
Alas, there is nothing here today :)
-
Урок 15.1. UIFlow - это просто!
Цель урока
Привет! Сегодня мы наконец-то подробно познакомимся с элементами UIFlow и разберёмся в вещах, которые раньше казались загадочными (рисунок 1).
Рисунок 1
Этот урок научит: разбираться в интерфейсте среды разработки UIFlow и понимать основные принципы работы с блоками.
Краткая справка
- Назначение: среда разработки для семейства устройств M5STACK на языках Blockly и MicroPython
- Сфера применения: образование
- Интерфейс подключения: Wi-Fi (Интернет)
- Совместимость: семейство устройств M5STACK
Краткий обзор
Для того, чтобы начать необходимо перейти по ссылке http://flow.m5stack.com (подробная процедура подключения приведена в уроке 15). Давайте рассмотрим секцию A на рисунке 2 - это UI-элементы. Вы можете перетаскивать их с помощью мыши на дисплей виртуального устройства, а потом обращаться к ним с помощью ссылок во вкладке UI. Хорошо! Теперь давайте посмотрим на секцию B - это библиотека Units-модулей, их методы и свойства в спрятаны во вкладке под одноимённым названием.
Рисунок 2
Секция C содержит в себе цикл Loop и обработчики событий встроенных кнопок.
Секция D содержит переключатель между языками программирования Blockly или Python. Секция E содержит основное меню. Вы можете получить доступ к форуму с помощью первой кнопки; почитать документация с помощью второй кнопки; с помощью третьей кнопки Вы можете выбрать примеры программ; с помощью четвёртой и пятой кнопок Вы можете отменить или повторить совершённое действие; с помощью шестой кнопки Вы можете открыть менеджер ресурсов (например, чтобы загрузить картинки в память устройства); нажав на седьмую кнопку Вы загрузите во временную память устройства код и запустите его (код после перезагрузки устройства будет удален); с помощью последней кнопки Вы можете открыть продолжение меню. На этом с секцией E закончим. Давайте рассмотрим последнюю секцию F. С помощью первой кнопки (сверху) разместить код Blockly по центру рабочей области; с помощью второй и третьей кнопок Вы можете изменять масштаб; для того, чтобы удалить блок - просто перетащите его на четвертую кнопку (изображение корзины) и блок будет безвозвратно удален.Начнём!
Blockly (UI Flow)
Самое сложное, на мой взгляд, это понять как работать с переменными. Поэтому я постараюсь максимально подробно рассказать об этом в данном уроке. Все остальные элементы языка Blockly просты в применении из-за, что названия говорят о их прямом назначении и лишние слова тут будут не кстати.
Итак, давайте начнём! Для того, чтобы создать переменную нажмите на вкладку Variables (1) (рисунок 3) в меню блоков, затем нажмите на кнопку Create variable... (2).
Рисунок 3
Теперь появится окно, которое попросит ввести имя новой переменной. Введите имя (1) (рисунок 3.1), затем нажмите ОК (2).
Рисунок 3.1
Отлично! Теперь переменная создана (рисунок 3.2). Теперь с помощью методов set и change Вы можете изменять значения всех созданных переменых.
Рисунок 3.2
Если Вы хотите использовать переменную ты перетащите её с помощью мыши в рабочую область (рисунок 3.3). Вы можете заменить переменную в блоке на другую, созданную ранее, а так же переименовать и удалить.
Рисунок 3.3
Самое "сложное" на этом закончилось. Теперь Вы умеете работать с переменными в языке Blockly.
Теперь давайте перейдём ко следущей вкладке Math. Этой вкладке находятся матиматические методы и константы (рисунок 4).
Рисунок 4
Обратите внимание на первый (сверху) блок - он предназначен для хранения числовых значений (хоть целых, хоть дробных). Второй блок позваляет осуществлять базовые математические операции (сложение, вычитание, умножение и деление). Третий блок содержит в себе математические константы (число Пи, число e и другие). Четвёртый блок позволяет получить остаток от деления. Пятый блок позволяет отпределить тип числа (чётное, нечётное, целое или дробное, положительное или отрицательное и т.п.). Все остальные блоки я описывать не буду, думаю Вам и так понятно что они делают, судя по их названиям.
Теперь перейдем ко вкладке под названием Loops (рисунок 5). Здесь имеется всевозможный набор циклов. Первый (сверху) цикл выполняет код, расположенный внутри заданное количество раз (например 10). Второй цикл выполняет код до тех пор, пока не выполнится какое-либо условие. Третий будет перебирать список и помещать i-й элемент в переменную i. Четвёртый походит на классический цикл for из языка C. Пятый блок позволяет выйти из цикла принудительно.
Рисунок 5
Переходим к следующей вкладке Logic. Не трудно догадаться, что в данной вкладке содержатся элементы связанные с логическими операциями (рисунок 6). Первый блок (сверху) - условие без исключения. Второй - условие с исключением. Третий константа с True или False. Четвёртый - условия (<, <=, >, >= и другие). Пятый - отрицание (NOT), подобно ! в языке C. Шестой - несуществующее значение NULL. Седьмой - логические операторы. Восьмой блок сравнивает условие и возвращает соответсвующее значение из блока if true или if false.
Рисунок 6
Давайте посмотрим на вкладку Graphic (рисунок 7). В этой вкладке есть набор методов для того, чтобы выводит текст и простейшие математические фигуры на дисплей устройства.
Рисунок 7
Если Вы хотите быстро нарисовать смайлик на своем устройстве, то Вам отлично поможет вкладка Emoji (рисунок 8).
Рисунок 8
В будущем, я надеюсь, во вкладке Timer (рисунок 9) появятся дополнительные функции для работы со временем, а пока Вы можете использовать блок задержки (время, в течении которого устройство ничего не делает).
Рисунок 9
Будет сложно разбираться в коде, если он не будет состоять из функций. Функции можно создавать во вкладке Functions (рисунок 10).
Рисунок 10
Первый (сверху) блок позволяет создать функцию с именем dosomething, которая ничего не возвращает. Второй блок позволяет создать функцию, которая может возвращать значение или переменную. Если Вы хотите добавить аргументы функции, то необходимо нажать на кнопку с изображением шестерёнки, перетащить из левого окна в правое блок input name и написать имя аргумента (например: x, y) (рисунок 10.1).
Рисунок 10.1
Третий блок при выполнении условия возвращает привязанное к нему значение из самой функции.
Так, с функциями разобрались. Давайте перейдём ко вкладке Text (рисунок 11). Если Вам нужна строковая переменная, то используйте первый блок (сверху). Если Вы хотите перевести все буквы в верхний или нижний регистр, то используйте второй блок. Если Вам необходимо получить букву под определённым порядковым номером, то используйте третий блок. С помощью четвёртого блока можно посчитать количество вхождений первого аргумента в строке. Пятый блок позволяет проверить является ли строка пустой. Узнать длину строки можно с помощью шестого блока. Если необходимо вывести строку на экран, то используйте седьмой блок. С помощью восьмого блока можно заменить подстроку в строке на новую строку. С помощью девятого блока Вы можете переписать строку наоборот. С помощью десятого блока Вы можете убрать пробелы.
Рисунок 11
Если Вам необходимо запросить ввод текста на экране устройста, то используйте одинадцатый и двенадцатый блоки. С помощью тринадцатого блока Вы можете привести к стровому типу переменные и константы другого типа.
Давайте посмотрим на вкладку Lists (рисунок 12). Как известно есть такой "тип данных" в языке Python.
Рисунок 12
С помощью первого блока (сверху) можно посчитать количество элементов в списке. С помощью второго блока можно узнать - является ли список пустым. С помощью третьего блока Вы можете найти номер элемента встречаемого в списке. С помощью четвёртого блока Вы можете создать пустой список. С помощью пятого блока Вы можете создать список с неограниченным количеством элементов добавленных вручную (рисунок 12.1).
Рисунок 12.1
С помощью шестого блока Вы можете получить/удалить элемент под конкретным номером. С помощью седьмого блока Вы можете получить подсписок в заданных границах из списка. С помощью восьмого блока Вы можете создать список из одинаковых элементов произвольной длины. С помощью девятого блока Вы можете изменить порядок списка на обратный. С помощью десятого блока Вы можете установить значение необходимого элемента списка. С помощью одиннадцатого блока Вы можете создать список из строки или строку из списка согласно заданного разделителя. На этом с данной вкладкой на сегодня всё.
Давайте перейдём к очень интересной и последней на сегодня вкладке Remote.
С помощью этой вкладки Вы получаете доступ к Вашему устройству из любой точки земного шара, где есть Интернет. Для этого достаточно перетащить в код Вашей программы первый (сверху) блок, после загрузки кода в устройство - на экране отобразится QR-код (рисунок 13.1), если его отсканировать с помощью мобильного телефона или планшета, то откроется Веб-страница с удалёнными элементами управления (блоки от второго до последнего) (рисунок 13.2).Рисунок 13
Рисунок 13.1
Рисунок 13.2
При обращении с Веб-странцы к определённым элементам - будут запускаться соответствующие функции-обработчики.
C & C++ (Arduino IDE)
Пример ещё не написан ^_^
Downloads
Увы, тут сегодня ничего нет :)
-
RE: Lesson 21.1. UNITS. LIGHT
@lastcaress You can to increase a delay interval.
-
Lesson 22. Modules. SIM800L
The purpose of this lesson
Hi! Today we will get acquainted with the excellent module SIM800L and learn how to receive SMS-messages (figure 1).
Figure 1
This lesson will teach: to exchange UART data with the module; to initialize and configure the module; to receive and read text SMS.
Short help
- Purpose: apply for receiving cellular services
- Scope: agriculture, smart home and others
- Connection interface: UART2 (MBUS)
- Supply voltage: 3.4 to 4.4 V
- Compatibility: M5STACK and M5FIRE (with GO module removed)
- Form factor: STACK
Brief overview
SIM800L - one of the large family of additional modules (MODULES), designed primarily for M5STASK. This module is supplied in a plastic case (figure 2).
Figure 2
On the front side of the module there is a MBUS bus plug, a slot for MicroSIM, a groove for the antenna-spring (figure 3).
Note: contacts: G5 - > RST, G16 - > TXD, G17 - > RXD (Serial2).
Figure 3
Note: if the module is connected to the M5, the SIM card cannot be inserted or removed.
On the reverse side of the module there is an MBUS bus socket, SIM800L module, a spring antenna for GSM-band, a connector (3.5 mm mini-jack) for headphones and a built-in microphone (figure 4).
Figure 4
Let's start!
Blockly (UI Flow)
In order to start using our module, it is necessary to initialize it (figure 5). It will take some time (about 1 minute). At this time, you can not disturb the modem and perform any operations with it, so we temporarily to light the LED BAR red. With the InitSIM800L function, we will inform the modem of some parameters that are interesting to us in the future. Note on the variable isMessage that takes the value 0. For what it is necessary - consider below.
Figure 5
It takes approximately 10 seconds for the modem to respond to external commands after power is supplied. Next, we need to initialize the UART interface on the corresponding contacts of the device using the set UART block.
Please note: TX 17, RX 16
Then, using the read UART available block in the loop, make sure that there is some garbage in the UART buffer and consider it symbolically using the read UART block. Great! The port is ready for operation. Now restart the module by sending the command AT+CFUN=1,1\r using the block write. Let's give the modem a normal run of 45 seconds. Turn off the ECHO using ATE0\r. Set the text mode GSM encoding to AT+CSCS="GSM"\r. Turn on text mode AT+CMGF=1\r. Clear the message memory AT+CMGD=1.4\r. Ask the module to read incoming messages when receiving AT+CNMI=1,2,2,1,0\r. Again, clear the buffer of possible debris. That's all, the module is ready to work (figure 5.1).
Figure 5.1
Function LiveSIM800L will always be called from a loop Loop (figure 5.2). In it we will look if there is incoming data from the module. If so, we consider and bring them to the string form. Now let's see if there is a flag CMT:, if there is, then this incoming message put the flag isMessage in the state 1, we need this in order to read the text of the message. Remember the function parseString, which we have written in previous tutorials for the Arduino IDE? We're gonna need it here. I translated it to MicroPython, and You just need to copy and paste it into your project ;)
def parseString(idSeparator, separator, str2): global parseStringGlobalVar1 parseStringGlobalVar1 = " separatorCount = 0 for i in range(len(str2)): if str2[i] = = separator: separatorCount += 1 else: if separatorCount == idSeparator: parseStringGlobalVar1 += str2[i] elif separatorCount > idSeparator: break return parseStringGlobalVar1
For those who do not remember or have not read past lessons - the parseString function takes three arguments and returns a line segment located between the delimiters: idSeparator (int), separator (char), str2 (String). Where idSeparator - separator sequence number; separator - separator; str2 - string from which we extract the substring.
For example:
cmtStr = '+CMT: "+7XXXXXX0001","","01/01/01,09:30:00+12"\r\n'; print(parseStr(1,'"', cmtStr))
Will be displayed:
+7XXXXXX0001
And if you do so:
print(parseStr(3,'"', cmtStr))
That will be displayed:
01/01/01, 09: 30: 00+12
Figure 5.2
Unfortunately Blockly does not allow us to implement our function normally today, but it's okay - there is a workaround to make MicroPython-insert (figure 5.3 - 5.3.1).
Figure 5.3
Figure 5.3.1
When will come SMS to call feature-event IncomingSms. And the sender number and message text will be in the global variables IncomingSmsPhone and IncomingSmsMessage, respectively.
Figure 5.4
The lesson is finished! :)
MicroPython (UI Flow)
from m5stack import * from m5ui import * import machine clear_bg(0xffffff) rgb = RGB_Bar() btnA = M5Button(name="ButtonA", text="ButtonA", visibility=False) btnB = M5Button(name="ButtonB", text="ButtonB", visibility=False) btnC = M5Button(name="ButtonC", text="ButtonC", visibility=False) label1 = M5TextBox(18, 90, "...", lcd.FONT_DejaVu24, 0x000000) label2 = M5TextBox(22, 192, "...", lcd.FONT_DejaVu18, 0x000000) title0 = M5Title(title="SIM800L Module", fgcolor=0xFFFFFF, bgcolor=0x000000) label4 = M5TextBox(24, 48, "Phone number:", lcd.FONT_DejaVu24, 0x000000) label3 = M5TextBox(48, 145, "Message:", lcd.FONT_DejaVu24, 0x000000) from numbers import Number idSeparator = None separator = None str2 = None parseStringGlobalVar1 = None IncomingSmsPhone = None uart = None buf = None IncomingSmsMessage = None isMessage = None def parseString(idSeparator, separator, str2): global parseStringGlobalVar1 parseStringGlobalVar1 = '' separatorCount = 0 for i in range(len(str2)): if str2[i] == separator: separatorCount += 1 else: if separatorCount == idSeparator: parseStringGlobalVar1 += str2[i] elif separatorCount > idSeparator: break return parseStringGlobalVar1 def IncomingSms(): global idSeparator, separator, str2, parseStringGlobalVar1, IncomingSmsPhone, uart, buf, IncomingSmsMessage, isMessage label1.setText(str(IncomingSmsPhone)) label2.setText(str(IncomingSmsMessage)) speaker.volume(1) for count in range(4): rgb.set_all(0x00cccc) speaker.sing(659, 1/8) wait(0.125) rgb.set_all(0x000000) wait(0.125) def InitSIM800L(): global idSeparator, separator, str2, parseStringGlobalVar1, IncomingSmsPhone, uart, buf, IncomingSmsMessage, isMessage wait(10) uart = machine.UART(1, tx=17, rx=16) uart.init(115200, bits=8, parity=None, stop=1) while uart.any(): if uart.read(1): pass uart.write('AT+CFUN=1,1\r') wait(45) uart.write('ATE0\r') wait(1) uart.write('AT+CSCS="GSM"\r') wait(1) uart.write('AT+CMGF=1\r') wait(1) uart.write('AT+CMGD=1,4\r') wait(1) uart.write('AT+CNMI=1,2,2,1,0\r') wait(1) while uart.any(): if uart.read(1): pass def LiveSIM800L(): global idSeparator, separator, str2, parseStringGlobalVar1, IncomingSmsPhone, uart, buf, IncomingSmsMessage, isMessage if uart.any(): buf = str((uart.readline())) if isMessage == 0: if buf.count('CMT:') == 1: isMessage = (isMessage if isinstance(isMessage, Number) else 0) + 1 IncomingSmsPhone = parseString(1, '"', buf) else: if buf.count('\\x') == 0: isMessage = (isMessage if isinstance(isMessage, Number) else 0) + 0 buf = buf[2:-5] if buf.count('CMT:') == 0 and len(buf) != 0: IncomingSmsMessage = buf IncomingSms() wait(1) rgb.set_all(0xff0000) InitSIM800L() rgb.set_all(0x000000) isMessage = (isMessage if isinstance(isMessage, Number) else 0) + 0 while True: LiveSIM800L() wait(0.001)
C & C++ (Arduino IDE)
Example not yet written ^_^
Downloads
Alas, there is nothing here today :)
-
Урок 22. Модуль SIM800L
Цель урока
Привет! Сегодня мы познакомимся с отличным модулем SIM800L и научимся принимать SMS-сообщения (рисунок 1).
Рисунок 1
Этот урок научит: обмениваться данными по UART с модулем; производить инициализацию и конфигурацию модуля; получать и читать текстовые SMS.
Краткая справка
- Назначение: применяют получения услуг сотовой связи
- Сфера применения: сельское хозяйство, умный дом и другие
- Интерфейс подключения: UART2 (MBUS)
- Напряжение питания: от 3.4 до 4.4 В
- Совместимость: M5STACK и M5FIRE (со снятым GO-модулем)
- Форм-фактор: STACK
Краткий обзор
SIM800L — один из большого семейства дополнительных модулей (MODULES), предназначенных прежде всего для М5STACK. Поставляется данный модуль в пластиковом футляре (рисунок 2).
Рисунок 2
На лицевой стороне модуля имеется вилка шины MBUS, слот для MicroSIM, канавка под антенну-пружинку (рисунок 3).
Примечание: контакты: G5 -> RST, G16 -> TXD, G17 -> RXD (Serial2).
Рисунок 3
Примечание: если модуль присоединён к М5, то вставить и извлечь SIM-карту нельзя.
На обратной стороне модуля имеется розетка шины MBUS, модуль SIM800L, антенна-пружинка на GSM-диапазон, разъём (3.5 мм mini-jack) для подключения наушников и встроенный микрофон (рисунок 4).
Рисунок 4
Начнём!
Blockly (UI Flow)
Для того, чтобы приступить к использованию нашего модуля необходимо его инициализировать (рисунок 5). Это займет некоторое время (приблизительно около 1 минуты). В это время нельзя беспокоить модем и выполнять какие-либо операции с ним, поэтому мы временно окрасим LED BAR красным цветом. С помощью функции InitSIM800L мы сообщим модему некоторые параметры работы, которые интересны нам в будущем. Обратите внимание на переменную isMessage, которая принимает значение 0. Для чего она нужна - рассмотрим далее.
Рисунок 5
Для того, чтобы модем начал реагировать на внешние команды после подачи питания ему потребуется приблизительно 10 секунд. Далее нам необходимо инициализировать UART-интерфейс на соответсвующих контактах устройства с помощью блока set UART.
Обратите внимание: TX 17, RX 16
Затем с помощью блока read UART available в цикле убедимся, что есть какой-то мусор в UART-буфере и считаем его посимвольно с помощью блока read UART. Отлично! Порт готов к работе. Теперь перезагрузим модуль, отправив команду AT+CFUN=1,1\r с помощью блока write. Дадим модему на нормальный запуск 45 секунд. Выключим ЭХО с помощью ATE0\r. Установим GSM-кодировку текстового режима AT+CSCS="GSM"\r. Включим текстовый режим AT+CMGF=1\r. Очистим память сообщений AT+CMGD=1,4\r. Попросим модуль читать входящие сообщения при получении AT+CNMI=1,2,2,1,0\r. Опять очистим буфер от возможного мусора. Всё, на этом модуль полностью готов к работе (рисунок 5.1).
Рисунок 5.1
Функция LiveSIM800L будет постоянно вызываться из цикла Loop (рисунок 5.2). В ней мы будем смотреть если ли входящие данные от модуля. Если есть, то считаем и приведем их к строковому виду. Теперь посмотрим есть ли флаг CMT:, если есть, то это входящее сообщение поставим флаг isMessage в состояние 1, это нам необходимо для того, чтобы прочесть текст сообщения. Помните функцию parseString, которую мы писали в прошлых уроках для Arduino IDE? Она отлично нам пригодится здесь. Я её перевел на MicroPython, а Вам её необходимо просто скопировать и вставить в Ваш проект ;)
def parseString(idSeparator, separator, str2): global parseStringGlobalVar1 parseStringGlobalVar1 = '' separatorCount = 0 for i in range(len(str2)): if str2[i] == separator: separatorCount += 1 else: if separatorCount == idSeparator: parseStringGlobalVar1 += str2[i] elif separatorCount > idSeparator: break return parseStringGlobalVar1
Для тех, кто не помнит или не читал прошлые уроки - функция parseString принимает три аргумента и возращает участок строки, расположенный между разделителями: idSeparator (int), separator (char), str2 (String). Где idSeparator - порядковый номер разделителя; separator - разделитель; str2 - строка из которой извлекаем подстроку.
Например:
cmtStr = '+CMT: "+7XXXXXX0001","","01/01/01,09:30:00+12"\r\n'; print(parseStr(1, '"', cmtStr))
Будет выведено:
+7XXXXXX0001
А если сделать так:
print(parseStr(3, '"', cmtStr))
То будет выведено:
01/01/01,09:30:00+12
Рисунок 5.2
К сожалению Blockly не позволяет сегодня нам нормально реализовать нашу функцию, но ничего страшного - есть обходной вариант сделать MicroPython-вставку (рисунок 5.3.1).
Рисунок 5.3
Рисунок 5.3.1
Когда будут приходить SMS будет вызываться функция-событие IncomingSms. А номер отправителя и текст сообщения будет находиться в глобальных переменных IncomingSmsPhone и IncomingSmsMessage, соответственно.
Рисунок 5.4
На этом урок закончен! :)
MicroPython (UI Flow)
from m5stack import * from m5ui import * import machine clear_bg(0xffffff) rgb = RGB_Bar() btnA = M5Button(name="ButtonA", text="ButtonA", visibility=False) btnB = M5Button(name="ButtonB", text="ButtonB", visibility=False) btnC = M5Button(name="ButtonC", text="ButtonC", visibility=False) label1 = M5TextBox(18, 90, "...", lcd.FONT_DejaVu24, 0x000000) label2 = M5TextBox(22, 192, "...", lcd.FONT_DejaVu18, 0x000000) title0 = M5Title(title="SIM800L Module", fgcolor=0xFFFFFF, bgcolor=0x000000) label4 = M5TextBox(24, 48, "Phone number:", lcd.FONT_DejaVu24, 0x000000) label3 = M5TextBox(48, 145, "Message:", lcd.FONT_DejaVu24, 0x000000) from numbers import Number idSeparator = None separator = None str2 = None parseStringGlobalVar1 = None IncomingSmsPhone = None uart = None buf = None IncomingSmsMessage = None isMessage = None def parseString(idSeparator, separator, str2): global parseStringGlobalVar1 parseStringGlobalVar1 = '' separatorCount = 0 for i in range(len(str2)): if str2[i] == separator: separatorCount += 1 else: if separatorCount == idSeparator: parseStringGlobalVar1 += str2[i] elif separatorCount > idSeparator: break return parseStringGlobalVar1 def IncomingSms(): global idSeparator, separator, str2, parseStringGlobalVar1, IncomingSmsPhone, uart, buf, IncomingSmsMessage, isMessage label1.setText(str(IncomingSmsPhone)) label2.setText(str(IncomingSmsMessage)) speaker.volume(1) for count in range(4): rgb.set_all(0x00cccc) speaker.sing(659, 1/8) wait(0.125) rgb.set_all(0x000000) wait(0.125) def InitSIM800L(): global idSeparator, separator, str2, parseStringGlobalVar1, IncomingSmsPhone, uart, buf, IncomingSmsMessage, isMessage wait(10) uart = machine.UART(1, tx=17, rx=16) uart.init(115200, bits=8, parity=None, stop=1) while uart.any(): if uart.read(1): pass uart.write('AT+CFUN=1,1\r') wait(45) uart.write('ATE0\r') wait(1) uart.write('AT+CSCS="GSM"\r') wait(1) uart.write('AT+CMGF=1\r') wait(1) uart.write('AT+CMGD=1,4\r') wait(1) uart.write('AT+CNMI=1,2,2,1,0\r') wait(1) while uart.any(): if uart.read(1): pass def LiveSIM800L(): global idSeparator, separator, str2, parseStringGlobalVar1, IncomingSmsPhone, uart, buf, IncomingSmsMessage, isMessage if uart.any(): buf = str((uart.readline())) if isMessage == 0: if buf.count('CMT:') == 1: isMessage = (isMessage if isinstance(isMessage, Number) else 0) + 1 IncomingSmsPhone = parseString(1, '"', buf) else: if buf.count('\\x') == 0: isMessage = (isMessage if isinstance(isMessage, Number) else 0) + 0 buf = buf[2:-5] if buf.count('CMT:') == 0 and len(buf) != 0: IncomingSmsMessage = buf IncomingSms() wait(1) rgb.set_all(0xff0000) InitSIM800L() rgb.set_all(0x000000) isMessage = (isMessage if isinstance(isMessage, Number) else 0) + 0 while True: LiveSIM800L() wait(0.001)
C & C++ (Arduino IDE)
Пример ещё не написан ^_^
Downloads
Увы, тут сегодня ничего нет :)