Bem-vindo ao meu blog! Sou Marcelo Balisteri, gerente de TI e pesquisador na PUC Rio, com mais de 20 anos de experiência em TI. Participei de projetos inovadores em IoT e sou cofundador de uma startup que desenvolveu sensores de monitoramento de enchentes com tecnologia LoRaWAN. Aqui, compartilho conhecimentos sobre IoT, redes de computadores e sistemas embarcados. Acompanhe e descubra insights valiosos para um futuro mais conectado e inteligente!
Pesquisar este blog
Exemplos de Código: Introdução à IoT e LoRaWAN
1. Simulação Básica de Sensor IoT (Arduino/ESP32)
// Simulação simples de sensor de temperatura/umidade
#include<DHT.h>
#defineDHTPIN4
#defineDHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
voidsetup() {
Serial.begin(115200);
dht.begin();
Serial.println("Sensor IoT iniciado - Simulando coleta de dados");
}
voidloop() {
// Leitura dos sensoresfloat temperatura = dht.readTemperature();
float umidade = dht.readHumidity();
// Verificação de leitura válidaif (isnan(temperatura) || isnan(umidade)) {
Serial.println("Erro na leitura do sensor!");
return;
}
// Exibição dos dados
Serial.print("Temperatura: ");
Serial.print(temperatura);
Serial.print("°C | Umidade: ");
Serial.print(umidade);
Serial.println("%");
// Simulação do fluxo IoT: Sensor → Processamento → "Transmissão"
Serial.println("--- Fluxo IoT ---");
Serial.println("1. Dados coletados do sensor físico");
Serial.println("2. Processamento local (validação, formatação)");
Serial.println("3. Preparação para transmissão LoRaWAN");
Serial.println("4. Aguardando próxima leitura...");
Serial.println();
delay(5000); // 5 segundos entre leituras
}
2. Demonstração de Comunicação Básica LoRa (ESP32 + Módulo LoRa)
#include<SPI.h>
#include<LoRa.h>// Pinos para ESP32
#defineSS18
#defineRST14
#defineDIO026voidsetup() {
Serial.begin(115200);
// Inicialização do módulo LoRa
LoRa.setPins(SS, RST, DIO0);
if (!LoRa.begin(915E6)) { // Frequência Brasil (915 MHz)
Serial.println("Erro ao iniciar LoRa!");
while (1);
}
Serial.println("Módulo LoRa iniciado com sucesso!");
Serial.println("Frequência: 915 MHz (AU915_0 - Brasil)");
Serial.println("Pronto para demonstrar comunicação básica");
}
voidloop() {
// Simulação de envio de dados
Serial.println("Enviando pacote de dados...");
LoRa.beginPacket();
LoRa.print("Olá LoRaWAN! Pacote de teste #");
LoRa.print(millis() / 1000);
LoRa.endPacket();
Serial.println("Pacote enviado!");
// Verificação de pacotes recebidosint packetSize = LoRa.parsePacket();
if (packetSize) {
Serial.println("Pacote recebido!");
while (LoRa.available()) {
Serial.print((char)LoRa.read());
}
Serial.print("' com RSSI ");
Serial.println(LoRa.packetRssi());
}
delay(10000); // 10 segundos entre transmissões
}
3. Simulação de Arquitetura IoT Básica (Python)
importtimeimportrandomimportjsonclassIoTSimulator:
def__init__(self):
self.devices= []
self.gateways= []
self.data_buffer= []
defadd_device(self, device_id, device_type):
"""Adiciona um dispositivo IoT simulado"""device= {
'id': device_id,
'type': device_type,
'status': 'active',
'last_reading': None
}
self.devices.append(device)
print(f"Dispositivo {device_id} ({device_type}) adicionado")
defadd_gateway(self, gateway_id, location):
"""Adiciona um gateway LoRaWAN simulado"""gateway= {
'id': gateway_id,
'location': location,
'connected_devices': 0,
'status': 'online'
}
self.gateways.append(gateway)
print(f"Gateway {gateway_id} em {location} adicionado")
defsimulate_sensor_reading(self, device_id):
"""Simula leitura de sensor"""device=next((dfordinself.devicesifd['id'] ==device_id), None)
ifnotdevice:
returnNoneifdevice['type'] =='temperature':
reading=round(random.uniform(20, 35), 1)
unit='°C'elifdevice['type'] =='humidity':
reading=round(random.uniform(30, 80), 1)
unit='%'elifdevice['type'] =='soil_moisture':
reading=round(random.uniform(10, 90), 1)
unit='%'else:
reading=random.randint(0, 100)
unit='units'timestamp=time.time()
data_point= {
'device_id': device_id,
'timestamp': timestamp,
'value': reading,
'unit': unit,
'device_type': device['type']
}
device['last_reading'] =data_pointreturndata_pointdeftransmit_to_gateway(self, device_id):
"""Simula transmissão de dados para gateway"""data=self.simulate_sensor_reading(device_id)
ifnotdata:
returnFalse# Simular transmissão LoRaWANprint("--- Transmissão LoRaWAN ---"print(f"Dispositivo: {data['device_id']}")
print(f"Dados: {data['value']}{data['unit']}")
print("Protocolo: LoRaWAN Classe A"print("Frequência: 915 MHz (AU915_0)"print("Status: Transmitido com sucesso"# Adicionar ao buffer de dadosself.data_buffer.append(data)
returnTruedefprocess_gateway_data(self, gateway_id):
"""Simula processamento de dados no gateway"""gateway=next((gforginself.gatewaysifg['id'] ==gateway_id), None)
ifnotgateway:
returnFalseifself.data_buffer:
data=self.data_buffer.pop(0)
print("--- Processamento no Gateway ---"print(f"Gateway: {gateway_id} ({gateway['location']})")
print(f"Processando dados de: {data['device_id']}")
print("Dados enviados para Network Server"gateway['connected_devices'] =len([dfordinself.devicesifd['status'] =='active'])
returnTruereturnFalsedefdisplay_system_status(self):
"""Exibe status do sistema IoT"""print("\n=== STATUS DO SISTEMA IoT ===")
print(f"Dispositivos ativos: {len([dfordinself.devicesifd['status'] =='active'])}")
print(f"Gateways online: {len([gforginself.gatewaysifg['status'] =='online'])}")
print(f"Dados no buffer: {len(self.data_buffer)}")
print("\n--- Dispositivos ---")
fordeviceinself.devices:
status="✓"ifdevice['status'] =='active'else"✗"print(f"{status}{device['id']} ({device['type']})")
print("\n--- Gateways ---")
forgatewayinself.gateways:
status="✓"ifgateway['status'] =='online'else"✗"print(f"{status}{gateway['id']} - {gateway['location']} (Dispositivos: {gateway['connected_devices']})")
# Demonstração do simuladordefmain():
iot=IoTSimulator()
# Adicionar dispositivos e gatewaysiot.add_device("TEMP_001", "temperature")
iot.add_device("HUM_001", "humidity")
iot.add_device("SOIL_001", "soil_moisture")
iot.add_gateway("GW_BRASILIA", "Brasília-DF")
iot.add_gateway("GW_SAO_PAULO", "São Paulo-SP")
# Simular operações IoTprint("\n=== INICIANDO SIMULAÇÃO IoT ===")
foriinrange(5):
print(f"\n--- Ciclo {i+1} ---")
# Simular transmissõesfordeviceiniot.devices:
iot.transmit_to_gateway(device['id'])
time.sleep(0.5)
# Processar dados nos gatewaysforgatewayiniot.gateways:
iot.process_gateway_data(gateway['id'])
iot.display_system_status()
time.sleep(2)
if__name__=="__main__":
main()
4. Link Budget Calculator (Python)
importmathclassLoRaLinkBudgetCalculator:
def__init__(self):
# Constantes LoRaself.c=299792458# Velocidade da luz (m/s)defcalculate_fspl(self, distance_km, frequency_mhz):
"""Calcula Free Space Path Loss"""# FSPL = 20log(d) + 20log(f) + 32.44fspl=20*math.log10(distance_km) +20*math.log10(frequency_mhz) +32.44returnround(fspl, 2)
defget_receiver_sensitivity(self, sf, bw_khz):
"""Retorna sensibilidade do receptor baseada em SF e BW"""# Valores típicos para LoRasensitivities= {
(7, 125): -124,
(8, 125): -127,
(9, 125): -130,
(10, 125): -133,
(11, 125): -135,
(12, 125): -137,
(8, 500): -122,
(9, 500): -126,
(10, 500): -129,
(11, 500): -133,
(12, 500): -137
}
returnsensitivities.get((sf, bw_khz), -130) # Defaultdefcalculate_link_budget(self, tx_power_dbm, tx_antenna_gain_dbi,
rx_antenna_gain_dbi, cable_losses_db,
distance_km, frequency_mhz, sf, bw_khz,
additional_losses_db=0):
""" Calcula o link budget completo Retorna: (potência_recebida, margem_link, sucesso_comunicacao) """# 1. Potência efetiva de transmissão (EIRP)eirp=tx_power_dbm+tx_antenna_gain_dbi# 2. Free Space Path Lossfspl=self.calculate_fspl(distance_km, frequency_mhz)
# 3. Potência recebidareceived_power=eirp-fspl-cable_losses_db-additional_losses_db+rx_antenna_gain_dbi# 4. Sensibilidade do receptorsensitivity=self.get_receiver_sensitivity(sf, bw_khz)
# 5. Margem de linklink_margin=received_power-sensitivity# 6. Avaliação de sucessosuccess=link_margin>0returnround(received_power, 2), round(link_margin, 2), success# Exemplo de usodefexemplo_link_budget():
calculator=LoRaLinkBudgetCalculator()
# Cenário: Sensor agrícola a 5km de distânciaconfig= {
'tx_power_dbm': 20, # 100mW'tx_antenna_gain_dbi': 2, # Antena pequena'rx_antenna_gain_dbi': 5, # Antena gateway'cable_losses_db': 2, # Cabos e conectores'distance_km': 5, # 5km de distância'frequency_mhz': 915, # AU915'sf': 10, # SF10 para bom equilíbrio'bw_khz': 125, # BW padrão'additional_losses_db': 10# Obstáculos (árvores, etc.)
}
received_power, link_margin, success=calculator.calculate_link_budget(**config)
print("=== CÁLCULO DE LINK BUDGET ===")
print(f"Distância: {config['distance_km']} km")
print(f"Frequência: {config['frequency_mhz']} MHz")
print(f"SF: {config['sf']}, BW: {config['bw_khz']} kHz")
print(f"FSPL: {calculator.calculate_fspl(config['distance_km'], config['frequency_mhz'])} dB")
print(f"Potência recebida: {received_power} dBm")
print(f"Sensibilidade receptor: {calculator.get_receiver_sensitivity(config['sf'], config['bw_khz'])} dBm")
print(f"Margem de link: {link_margin} dB")
print(f"Comunicação: {'POSSÍVEL'ifsuccesselse'NÃO POSSÍVEL'}")
returnsuccessexemplo_link_budget()
5. Comparação Visual de Tecnologias LPWAN (Python com Matplotlib)
importmatplotlib.pyplotaspltimportnumpyasnp# Dados para comparação de tecnologias LPWANtecnologias= ['LoRaWAN', 'Sigfox', 'NB-IoT', 'Wi-Fi HaLow']
alcance= [10, 10, 10, 0.5] # kmconsumo= [5, 5, 3, 2] # escala 1-5 (5 = menor consumo)custo= [3, 4, 2, 3] # escala 1-5 (1 = menor custo)taxa_dados= [0.05, 0.001, 0.1, 50] # kbps# Criar gráfico de radarfig, ax=plt.subplots(figsize=(10, 8), subplot_kw=dict(projection='polar'))
# Ângulos para cada categoriacategorias= ['Alcance (km)', 'Consumo de Energia', 'Custo', 'Taxa de Dados (kbps)']
angulos=np.linspace(0, 2*np.pi, len(categorias), endpoint=False).tolist()
angulos+=angulos[:1] # Fechar o círculo# Plotar cada tecnologiacores= ['blue', 'red', 'green', 'orange']
fori, (tech, cor) inenumerate(zip(tecnologias, cores)):
valores= [alcance[i], consumo[i], custo[i], taxa_dados[i]]
valores+=valores[:1] # Fechar o círculoax.plot(angulos, valores, 'o-', linewidth=2, label=tech, color=cor)
ax.fill(angulos, valores, alpha=0.25, color=cor)
# Configurar gráficoax.set_xticks(angulos[:-1])
ax.set_xticklabels(categorias)
ax.set_ylim(0, 55)
ax.set_title('Comparação de Tecnologias LPWAN\nLoRaWAN vs Concorrentes', size=16, fontweight='bold', pad=20)
ax.legend(loc='upper right', bbox_to_anchor=(1.2, 1.0))
ax.grid(True)
# Adicionar anotaçõesax.annotate('Melhor para IoT\nremoto', xy=(0, 10), xytext=(0.5, 12),
arrowprops=dict(facecolor='blue', shrink=0.05))
ax.annotate('Melhor para\ndados simples', xy=(np.pi/2, 5), xytext=(2, 7),
arrowprops=dict(facecolor='red', shrink=0.05))
plt.tight_layout()
plt.show()
print("\n=== ANÁLISE COMPARATIVA ===")
print("LoRaWAN se destaca em:")
print("✓ Maior alcance (até 10+ km)")
print("✓ Menor consumo de energia")
print("✓ Melhor custo-benefício para aplicações IoT")
print("✓ Adequado para Brasil (região AU915_0)")
print("\nConcorrentes:")
print("• Sigfox: Simplicidade, mas limitado a dados muito simples")
print("• NB-IoT: Boa integração celular, mas menor alcance")
print("• Wi-Fi HaLow: Alta velocidade, mas curto alcance")
A Fascinante Jornada do Wi-Fi: De Invenção Científica a Necessidade Global A história do Wi-Fi é uma fascinante jornada de inovação e colaboração global que transformou a maneira como nos conectamos à Internet e interagimos com o mundo digital. Hoje, o Wi-Fi é um componente essencial em casas, escritórios e locais públicos ao redor do mundo. Vamos explorar como essa tecnologia revolucionária se desenvolveu ao longo dos anos.Origens e Desenvolvimento A jornada do Wi-Fi começou em 1971 com a ALOHAnet, a primeira rede sem fio, desenvolvida na Universidade do Havaí. Ela utilizava ondas de rádio para conectar computadores em diferentes ilhas, estabelecendo a base para futuras tecnologias sem fio. Durante a década de 1980, pesquisadores começaram a explorar o uso das bandas de frequência ISM para comunicação de dados sem fio, importantes por não requererem licenciamento e poderem ser usadas para comunicações de curta distância.Vic Hayes - O 'Pai do Wi-Fi' Vic Hayes, frequentemente ch...
Algoritmos e estruturas de dados são conceitos fundamentais na ciência da computação, essenciais para resolver problemas de maneira eficiente e otimizada. Eles são amplamente utilizados no desenvolvimento de software, otimização de sistemas, e em diversas outras áreas que necessitam de processamento e manipulação de dados. Vamos detalhar cada um deles: Algoritmos Um algoritmo é uma sequência finita de passos bem definidos que proporciona uma solução para um problema específico ou executa uma tarefa. Os algoritmos são fundamentais para tudo que um software faz, desde operações simples como somar dois números até tarefas complexas como renderizar gráficos em 3D ou realizar buscas em grandes bases de dados. Características principais de um bom algoritmo incluem:Corretude: O algoritmo deve produzir a saída correta para todas as entradas definidas. Eficiência: Deve utilizar os recursos computacionais (como tempo de CPU e memória) de maneira eficaz. Clareza: Os passos do algoritmo devem ser ...
O modelo TCP/IP (Transmission Control Protocol/Internet Protocol) é um conjunto de protocolos de comunicação que possibilitam a Internet, permitindo a comunicação entre computadores em uma rede. Vamos explorar mais detalhadamente os componentes e funcionalidades deste protocolo: 1. Visão Geral do Modelo TCP/IP O modelo TCP/IP não apenas descreve protocolos de rede, mas também estrutura as funções de rede em camadas. Embora frequentemente comparado ao modelo OSI de sete camadas, o TCP/IP consiste tradicionalmente em quatro camadas:Camada de Aplicação: Esta camada abriga os protocolos de alto nível, como HTTP (para páginas web), SMTP (para e-mail), e FTP (para transferência de arquivos). Camada de Transporte: Responsável pelo transporte de dados entre pontos finais, destacam-se aqui o TCP, que oferece conexões orientadas à conexão e confiáveis, e o UDP, que oferece conexões não orientadas e sem garantias de entrega. Camada de Internet: Esta camada é onde o IP opera, roteando pacotes de ...
Comentários