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 história da origem da Internet das Coisas (IoT) é uma demonstração fascinante de como a criatividade e a visão de futuro podem moldar a tecnologia e, por extensão, a sociedade. Kevin Ashton, trabalhando nos laboratórios da Procter & Gamble em Egham, Surrey, cunhou o termo "Internet das Coisas" para descrever uma nova era de interconexão digital, onde objetos cotidianos poderiam comunicar-se entre si e com a internet. O objetivo de Ashton era convencer a P&G a adotar a tecnologia RFID, visando revolucionar a gestão de dados de produtos ao longo da cadeia de suprimentos. A ideia de combinar a emergente ubiquidade da internet com o potencial inexplorado de "coisas" comunicantes, como tags de produtos e sensores, era inovadora. O termo "Internet das Coisas" não só capturou a essência dessa visão, mas também marcou o início de uma nova era tecnológica. Inicialmente, o conceito foi recebido com ceticismo, mas provou ser pioneiro, levando Ashton ao Mas...
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 ...
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 ...
Comentários