LiPo je napisal/-a:A ne bi izbral najprej funkcije:
Jaz sem misli tole:
ESP32 : CPU , WIFI in BT
LiPo je napisal/-a:Skratka, pa smo spet pri ESP32...
V parih minutah sem na mizi zlotal ESP32 z dop matrix led (max7219 8x32 pik).
Poslal program gor in to je to..
Napajalnik je mikro usb.
kose19 je napisal/-a:Domnevam, da ima tudi prednaložen nek firmweare oz se ga lahko naloži, da se lahko na njegov wifi povežeš in mu nastaviš podatke za domače omrežje?
Na wemos D1 mini imam eno od verzij iz letscontrolit.com
Super, torej imaš rešen problem.LiPo je napisal/-a:Skratka, pa smo spet pri ESP32...
V parih minutah sem na mizi zlotal ESP32 z dop matrix led (max7219 8x32 pik).
Poslal program gor in to je to..
Napajalnik je mikro usb.
VolkD je napisal/-a:Super, torej imaš rešen problem.LiPo je napisal/-a:Skratka, pa smo spet pri ESP32...
V parih minutah sem na mizi zlotal ESP32 z dop matrix led (max7219 8x32 pik).
Poslal program gor in to je to..
Napajalnik je mikro usb.
Zdaj pa pusti ostale, da naredimo kot nam je ljubše.
kose19 je napisal/-a:VolkD je napisal/-a:Super, torej imaš rešen problem.LiPo je napisal/-a:Skratka, pa smo spet pri ESP32...
V parih minutah sem na mizi zlotal ESP32 z dop matrix led (max7219 8x32 pik).
Poslal program gor in to je to..
Napajalnik je mikro usb.
Zdaj pa pusti ostale, da naredimo kot nam je ljubše.
Mene pa ta ESP32 zanima.
VolkD je napisal/-a:
Še malo razlage kaj vidimo v tem videu.
Najprej je na tipkovnico naslonjen ESP32. Modra LED spremeni stanje vsako sekundo. Zelen kabel je povezan na PC-ja. Preko tega kabla gre napajanje za ESP32, istočasno pa ESP32 pošilja po njem informacijo o trenutni uri. Pravzaprav kar o celotnem času. Ta informacija gre sicer preko USB, a na ploščici z ESP32 imamo UART/USB konverter. To pa pomeni, da informacijo lahko dobimo tudi na nivoju UART-a. Uro lahko gledamo v terminalskem oknu. Zgornje okno - vsaka sekunda je nova vrstica.
Za primerjavo imamo uro, ki nam jo posreduje stran: https://dayspedia.com/time/online/
Levo spodaj je arduino okno in del kode. Da ne bo pomote, koda je z interneta, moj delček je le dodatek, ki prepriča modro LED da utripa. To kar je v kodi še mojega, je ime in geslo dostopne WiFi domače točke, a ta del kode nimam namena deliti z vami.
Igračo, ki so jo naredili drugi, se torej da iz čistega niča poustvariti v manj kot enem popoldnevu.
No zdaj grem pa delat mojo uro, bo trajalo malo dlje, bo pa znalo delat tudi brez internetaIn pa še nekaj - moja bo!
VolkD je napisal/-a:Najprej je na tipkovnico naslonjen ESP32. Modra LED spremeni stanje vsako sekundo. Zelen kabel je povezan na PC-ja. Preko tega kabla gre napajanje za ESP32, istočasno pa ESP32 pošilja po njem informacijo o trenutni uri. Pravzaprav kar o celotnem času. Ta informacija gre sicer preko USB, a na ploščici z ESP32 imamo UART/USB konverter. To pa pomeni, da informacijo lahko dobimo tudi na nivoju UART-a. Uro lahko gledamo v terminalskem oknu.
Veš mogoče kako se RTC nastavi in kako se potem podatke bere z njega ?Cloud je napisal/-a:Kolikor jaz vem ima ESP32 že vgrajen RTC.
Cloud je napisal/-a:Kolikor jaz vem ima ESP32 že vgrajen RTC.
Cloud je napisal/-a:Je pa opcija da se da na vezje reed stikalo ali pa samo hall senzor in se ga veže na gpio. Če želiš konfigurirati daš zraven magnet in priklopiš napajanje, takrat se ESP prižge v AP načinu za konfiguracijo.
Lojz je napisal/-a:Cloud je napisal/-a:Kolikor jaz vem ima ESP32 že vgrajen RTC.
V dokumentaciji nisem našel. Niti ne vem kako bi ura delovala, ko odklopiš napajanje. Nikjer namreč ne najdem pina za zunanjo baterijo, ki jo ponavadi uporablja RTC.
VolkD je napisal/-a: Ja tole je pa zdaj že kriza.
In baje sem imel srečo in moj primerek celo dobro dela.
RTC bo torej tudi v tem primeru nuja.
VolkD je napisal/-a:
Vedno slabše je.
Bom moral poskusiti kaj se zgodi, če ga malo segrejem.

Cloud je napisal/-a:Kolikor jaz vem ima ESP32 že vgrajen RTC. Za povezavo na wifi narediš, da ko se prižge se 30 sec poizkuša povezati na znano (znana) omrežja, če mu to ne rata se postavi v AP način in odpre konfiguracijsko stran. Za serverje mu tudi lahko postaviš listo kjer bo pač šel po vrsti če ne bodo dosegljivi.
Je pa opcija da se da na vezje reed stikalo ali pa samo hall senzor in se ga veže na gpio. Če želiš konfigurirati daš zraven magnet in priklopiš napajanje, takrat se ESP prižge v AP načinu za konfiguracijo.
forest70 je napisal/-a:Še da pojasnim kako deluje:
V setup se
povežem na WiFi,
vzamem uro iz NTP stržnika,
kreiram nov task v drugem procesorju, kjer ob vsaki polni minuti odtolče v Morsevi abecedi uro v obliki 20:21
V loop zanki se pa vsako sekundo izpisuje čas na serijski port
VolkD je napisal/-a:Pozabil si povedati, da gre morse na LED. Mogoče bi bilo fino, da daš tole na piskalč ?
LiPo je napisal/-a:forest70 je napisal/-a:Še da pojasnim kako deluje:
V setup se
povežem na WiFi,
vzamem uro iz NTP stržnika,
kreiram nov task v drugem procesorju, kjer ob vsaki polni minuti odtolče v Morsevi abecedi uro v obliki 20:21
V loop zanki se pa vsako sekundo izpisuje čas na serijski port
Ta z Morse kodo je ql.
Samo ni tolk uporabnikov, ki bi znali to prepoznat...
/**
******************************************************************************
* @file morse.c
* @brief Morse generator module
******************************************************************************
* @attention
*
* <h2><center>© COPYRIGHT(c) 2016 S54MTB</center></h2>
*
******************************************************************************
*/
#include "morse.h"
#include "command.h"
#include <stdio.h>
#include <string.h> // strcmp
#include <ctype.h> // toupper
#include <stdlib.h>
#include "usbd_cdc_if.h"
#include "settings.h"
#ifndef NOAUDIO
#include "audio.h"
#endif
extern TIM_HandleTypeDef htim14;
extern settings_t settings;
//static char CW_message_text[CW_MAX_MSG_LENGTH];
Morse_Status_t MS;
/**
* @brief CW Table
* Sequence start is marked with zero bit
*/
//#define CW_special 0x8000 /// Inidcates special sequence or command in CW generator
//#define CH_special 0x80 /// Inidcates special sequence or command in CW generator
//enum
//{
// CW_SPC_AA,
// CW_SPC_AR,
// CW_SPC_AS,
// CW_SPC_BK,
// CW_SPC_BT,
// CW_SPC_CL,
// CW_SPC_CT,
// CW_SPC_DO,
// CW_SPC_KN,
// CW_SPC_SK,
// CW_SPC_SN,
// CW_SPC_SOS,
// CW_SPC_BRK
//};
const morse_t morse_keys[] =
{
{'A', 0xfff9}, /// 11111111 111110011
{'B', 0xffe8}, /// 11111111 11101000
{'C', 0xffea}, /// 11111111 11101010
{'D', 0xfff4}, /// 11111111 11110100
{'E', 0xfffc}, /// 11111111 11111100
{'F', 0xffe2}, /// 11111111 11100010
{'G', 0xfff6}, /// 11111111 11110110
{'H', 0xffe0}, /// 11111111 11100000
{'I', 0xfff8}, /// 11111111 11111000
{'J', 0xffe7}, /// 11111111 11100111
{'K', 0xfff5}, /// 11111111 11110101
{'L', 0xffe4}, /// 11111111 11100100
{'M', 0xfffb}, /// 11111111 11111011
{'N', 0xfffa}, /// 11111111 11111010
{'O', 0xfff7}, /// 11111111 11110111
{'P', 0xffe6}, /// 11111111 11100110
{'Q', 0xffed}, /// 11111111 11101101
{'R', 0xfff2}, /// 11111111 11110010
{'S', 0xfff0}, /// 11111111 11110000
{'T', 0xfffd}, /// 11111111 11111101
{'U', 0xfff1}, /// 11111111 11110001
{'V', 0xffe1}, /// 11111111 11100001
{'W', 0xfff3}, /// 11111111 11110011
{'X', 0xffe9}, /// 11111111 11101001
{'Y', 0xffeb}, /// 11111111 11101011
{'Z', 0xffec}, /// 11111111 11101100
{' ', 0xffef}, /// 11111111 00000000
{'0', 0xffdf}, /// 11111111 11011111
{'1', 0xffcf}, /// 11111111 11001111
{'2', 0xffc7}, /// 11111111 11000111
{'3', 0xffc3}, /// 11111111 11000011
{'4', 0xffc1}, /// 11111111 11000001
{'5', 0xffc0}, /// 11111111 11000000
{'6', 0xffd0}, /// 11111111 11010000
{'7', 0xffd8}, /// 11111111 11011000
{'8', 0xffdc}, /// 11111111 11011100
{'9', 0xffde}, /// 11111111 11011110
{'.', 0xff95}, /// 11111111 10010101
{',', 0xffb3}, /// 11111111 10110011
{':', 0xffb8}, /// 11111111 10111000
{'?', 0xff8c}, /// 11111111 10001100
{39, 0xff9e}, /// 11111111 10011110 --- Apostrophe
{'-', 0xffa1}, /// 11111111 10100001 --- Minus=Hyphen
{'/', 0xffd2}, /// 11111111 11010010
{'(', 0xffad}, /// 11111111 10101101
{')', 0xffad}, /// 11111111 10101101
{'{', 0xffad}, /// 11111111 10101101
{'}', 0xffad}, /// 11111111 10101101
{'[', 0xffad}, /// 11111111 10101101
{']', 0xffad}, /// 11111111 10101101
{34, 0xff92}, /// 11111111 10010010 --- Quotation "
{'@', 0xff9a}, /// 11111111 10011010
{'=', 0xffd1}, /// 11111111 11010001
{'<', 0xffff}, /// special - set char time to 1 dit
{'>', 0xffff}, /// special - set char time to 3 dit
// { CH_special | CW_SPC_AA , CW_special | CW_SPC_AA }, /// ---> AA, New line .-.-
// { CH_special | CW_SPC_AR , CW_special | CW_SPC_AR }, /// ---> AR, End of message .-.-.
// { CH_special | CW_SPC_AS , CW_special | CW_SPC_AS }, /// ---> AS, Wait .-...
// { CH_special | CW_SPC_BK , CW_special | CW_SPC_BK }, /// ---> BK, Break -...-.-
// { CH_special | CW_SPC_BT , CW_special | CW_SPC_BT }, /// ---> BT, New paragraph -...-
// { CH_special | CW_SPC_CL , CW_special | CW_SPC_CL }, /// ---> CL, Going off the air ("clear") -.-..-..
// { CH_special | CW_SPC_CT , CW_special | CW_SPC_CT }, /// ---> CT, Start copying -.-.-
// { CH_special | CW_SPC_DO , CW_special | CW_SPC_DO }, /// ---> DO, Change to wabun code -..---
// { CH_special | CW_SPC_KN , CW_special | CW_SPC_KN }, /// ---> KN, Invite a specific station to transmit -.--.
// { CH_special | CW_SPC_SK , CW_special | CW_SPC_SK }, /// ---> SK, End of transmission (also VA) ...-.-
// { CH_special | CW_SPC_SN , CW_special | CW_SPC_SN }, /// ---> SN, Understood (also VE) ...-.
// { CH_special | CW_SPC_SOS , CW_special | CW_SPC_SOS}, /// ---> SOS, Distress message ...---...
// { CH_special | CW_SPC_BRK , CW_special | CW_SPC_BRK}, /// ---> SOS, Distress message ...---...
};
#define CW_NOKEYFOUND 0xffff
/**
* @brief Init for Morse engine
* @param None
* @param None
* @retval None
*/
void Morse_Init(void)
{
//settings.cw_message.message = CW_message_text;
HAL_TIM_Base_Start_IT(&htim14);
}
/**
* @brief This function initializes and start the morse processor
* @param None
* @param None
* @retval None
*/
void Morse_start(void)
{
MS.MPS_message_idx = 0; // Counter for characters in message
MS.MPS_pause = 0; // No pause for start!
MS.MPS_repeat_counter = 0;
MS.timebase = 0;
MS.duration = 0;
MS.MorsePorcessroStage = MPS_GetChar;
MS.CharSpacing = 3; // Normal spacing, changed by "<" and ">"
}
/**
* @brief Stop morse generator
* @param None
* @param None
* @retval None
*/
void Morse_stop(void)
{
#ifndef NOAUDIO
Audio_Run(0);
#endif
HAL_GPIO_WritePin(MORSE_PORT, MORSE_PIN, (settings.out.polarity == 1) ? GPIO_PIN_SET : GPIO_PIN_RESET);
MS.MorsePorcessroStage = MPS_Stop;
}
/**
* @brief Restart the morse processor -> fresh start if previously running
* @param None
* @param None
* @retval None
*/
uint32_t Morse_Restart(void)
{
uint32_t running = (MS.MorsePorcessroStage != MPS_Stop);
if (running)
{
Morse_stop();
Morse_start();
}
return running;
}
/**
* @brief Set outputs to "DAH"
* @param None
* @param None
* @retval None
*/
void Morse_SetDah(void)
{
if (settings.out.cw) HAL_GPIO_WritePin(MORSE_PORT, MORSE_PIN, (settings.out.polarity == 1) ? GPIO_PIN_RESET : GPIO_PIN_SET);
#ifndef NOAUDIO
if (settings.audio.cw) Audio_Run(1);
#endif
}
/**
* @brief Set outputs to "DIT"
* @param None
* @param None
* @retval None
*/
void Morse_SetDit(void)
{
if (settings.out.cw) HAL_GPIO_WritePin(MORSE_PORT, MORSE_PIN, (settings.out.polarity == 1) ? GPIO_PIN_RESET : GPIO_PIN_SET);
#ifndef NOAUDIO
if (settings.audio.cw) Audio_Run(1);
#endif
}
/**
* @brief Reset all outputs
* @param None
* @param None
* @retval None
*/
void Morse_SetNil(void)
{
HAL_GPIO_WritePin(MORSE_PORT, MORSE_PIN, (settings.out.polarity == 1) ? GPIO_PIN_SET : GPIO_PIN_RESET);
#ifndef NOAUDIO
Audio_Run(0);
#endif
}
/**
* @brief This function is periodically called from Timer 14 interrupt
* @param None
* @param None
* @retval None
*/
void Morse_processor(void)
{
// 1kHz here!
if (MS.MorsePorcessroStage != MPS_Stop)
{
//
MS.timebase++;
if (MS.timebase > MS.MPS_pause)
{
/////////////////////////////////////////////////HAL_TIM_Base_Stop_IT(&htim14);
MS.timebase = 0;
MS.duration += MS.MPS_pause; // message duration
switch (MS.MorsePorcessroStage)
{
case MPS_GetChar : // get next char from message and convert to key sequence
MS.MPS_pause = 1;
Morse_SetNil();
if (settings.cw_message.message[MS.MPS_message_idx] == '<')
{ // Set char space to 1 dit
MS.CharSpacing = 1;
MS.MPS_message_idx++;
} else if (settings.cw_message.message[MS.MPS_message_idx] == '>')
{ // set char space to 3 dit
MS.CharSpacing = 3;
MS.MPS_message_idx++;
}
if (MS.MPS_message_idx >= strlen(settings.cw_message.message))
{ // end of string
//MS.MPS_message_idx = 0;
MS.MorsePorcessroStage = MPS_Space;
} else
{
if (settings.cw_message.message[MS.MPS_message_idx] == 0x20) // space
{
MS.MorsePorcessroStage = MPS_Space;
}
else
{
MS.MPS_CurrentKey = // Get character from message and convert to key
Morse_CharToKey(settings.cw_message.message[MS.MPS_message_idx]);
MS.MPS_key_idx = 0x8000;
while (MS.MPS_CurrentKey & MS.MPS_key_idx)
MS.MPS_key_idx>>=1; // find zero bit in key sequence
MS.MPS_key_idx>>=1; // shift right one to initial dit/dah bit
MS.MorsePorcessroStage = MPS_SetOutput;
}
}
break;
case MPS_SetOutput :
if (MS.MPS_CurrentKey & MS.MPS_key_idx)
{
MS.MPS_pause = settings.cw_message.dottime * 3;
Morse_SetDah();
}
else
{
MS.MPS_pause = settings.cw_message.dottime;
Morse_SetDit();
}
MS.MorsePorcessroStage = MPS_NextKey;
break;
case MPS_NextKey:
Morse_SetNil();
MS.MPS_pause = settings.cw_message.dottime;
MS.MPS_key_idx>>=1;
if (MS.MPS_key_idx == 0)
{ // finished through key sequence
MS.MPS_message_idx++;
if (settings.cw_message.message[MS.MPS_message_idx] > 0)
{ // next char in message
MS.MPS_pause = settings.cw_message.dottime * MS.CharSpacing; // wait 1 or 3 dits at the beginning of the char
MS.MorsePorcessroStage = MPS_GetChar;
}
else
{ // message finished, check for repetition
MS.MPS_repeat_counter++;
if ((settings.cw_message.repeat>0) & // repeat finished
(MS.MPS_repeat_counter>=settings.cw_message.repeat))
{
MS.MorsePorcessroStage = MPS_Stop;
}
else
{
// Check if message until now did not exceed duration
if (1000*settings.cw_message.msgperiod > MS.duration)
MS.MPS_pause = 1000*settings.cw_message.msgperiod - MS.duration;
else // set word space (7 dots time)
{
MS.MPS_message_idx = 0; // Restart the message
MS.duration = 0; // Reset duration counter
MS.MorsePorcessroStage = MPS_GetChar;
MS.MPS_pause = 7*settings.cw_message.dottime; // wait one space
}
}
}
}
else
{
MS.MorsePorcessroStage = MPS_SetOutput;
}
break;
case MPS_Space: // space ---> 7x dit time
Morse_SetNil();
MS.MPS_pause = settings.cw_message.dottime*7;
MS.MorsePorcessroStage = MPS_NextKey;
break;
default: MS.MorsePorcessroStage = MPS_Stop;
} /* switch (MS.MorsePorcessroStage) */
} /* if (MS.timebase > MS.MPS_pause) */
} /* if (MS.MorsePorcessroStage != MPS_Stop) */
/////////////////////////////////HAL_TIM_Base_Start_IT(&htim14);
}
/**
* @brief This function checks if character ch is valid CW char (has CW key in morse_keys[] table)
* @param ch - character
* @retval 0 - no valid char found, 1 - valid char in table
*/
int Morse_Valid_Char(char ch)
{
int i;
int valid = 0;
for (i = 0; i<sizeof(morse_keys)/sizeof(morse_t); i++)
{
if (ch == morse_keys[i].ch) valid = 1;
}
return valid;
}
/**
* @brief This function returns CW key from morse_keys[] table
* @param ch - character
* @retval key from CW table or
*/
uint16_t Morse_CharToKey(char ch)
{
int i;
for (i = 0; i<sizeof(morse_keys)/sizeof(morse_t); i++)
{
if (ch == morse_keys[i].ch) return morse_keys[i].key;
}
return CW_NOKEYFOUND;
}
/**
******************************************************************************
* @file morse.h
* @brief Morse generator module header file.
******************************************************************************
* @attention
*
* <h2><center>© COPYRIGHT(c) 2016 S54MTB</center></h2>
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MORSE_H__
#define __MORSE_H__
#include "stm32f0xx.h" // Device header
#include "settings.h"
#ifdef __cplusplus
extern "C" {
#endif
#define MORSE_PIN GPIO_PIN_0
#define MORSE_PORT GPIOA
#define AUTORUN_SEL0PIN GPIO_PIN_1
#define AUTORUN_SEL1PIN GPIO_PIN_2
#define AUTORUN_SEL2PIN GPIO_PIN_3
#define AUTORUN_SEL0PORT GPIOA
#define AUTORUN_SEL1PORT GPIOA
#define AUTORUN_SEL2PORT GPIOA
typedef struct
{
char ch;
uint16_t key;
} morse_t;
typedef enum // Morse processor stages
{
MPS_Stop,
MPS_GetChar,
MPS_SetOutput,
MPS_NextKey,
MPS_Space,
} MPS_t;
typedef struct
{
MPS_t MorsePorcessroStage;
uint32_t timebase, duration;
int MPS_repeat_counter;
int MPS_message_idx;
int MPS_key_idx;
int MPS_pause;
uint16_t MPS_CurrentKey;
uint8_t CharSpacing; // "<" set to 1, ">" set to 3 --- for AA, AR, SK ...
} Morse_Status_t;
void Morse_Init(void);
void Morse_processor(void);
int Morse_Valid_Char(char ch);
uint16_t Morse_CharToKey(char ch);
void Morse_start(void);
void Morse_stop(void);
uint32_t Morse_Restart(void);
#ifdef __cplusplus
}
#endif
#endif /* __MORSE_H__ */
/************************ (C) COPYRIGHT S54MTB *****END OF FILE****/
forest70 je napisal/-a:Še da pojasnim kako deluje:
V setup se
povežem na WiFi,
vzamem uro iz NTP stržnika,
kreiram nov task v drugem procesorju, kjer ob vsaki polni minuti odtolče v Morsevi abecedi uro v obliki 20:21
V loop zanki se pa vsako sekundo izpisuje čas na serijski port
tilz0R je napisal/-a:forest70 je napisal/-a:Še da pojasnim kako deluje:
V setup se
povežem na WiFi,
vzamem uro iz NTP stržnika,
kreiram nov task v drugem procesorju, kjer ob vsaki polni minuti odtolče v Morsevi abecedi uro v obliki 20:21
V loop zanki se pa vsako sekundo izpisuje čas na serijski port
Čakej - dual-core rabiš za ta piece of algo?
Vrni se na Gradnja napredne ure
Po forumu brska: 0 registriranih uporabnikov in 1 gost