127 lines
3.5 KiB
C++
127 lines
3.5 KiB
C++
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <math.h>
|
|
#include "pico/stdlib.h"
|
|
#include "hardware/uart.h"
|
|
#include "hardware/gpio.h"
|
|
#include "hardware/spi.h"
|
|
#include "pico_wireless.hpp"
|
|
#include <chrono>
|
|
#include <sstream>
|
|
#include <iomanip>
|
|
#include "secrets.h"
|
|
|
|
using namespace pimoroni;
|
|
|
|
#define UART_ID uart1 //uart0
|
|
#define BAUD_RATE 115200
|
|
#define DATA_BITS 8
|
|
#define STOP_BITS 1
|
|
#define PARITY UART_PARITY_NONE
|
|
|
|
// We are using pins 0 and 1, but see the GPIO function select table in the
|
|
// datasheet for information on which other pins can be used.
|
|
#define UART_TX_PIN 8 //0
|
|
#define UART_RX_PIN 9 //1
|
|
|
|
|
|
|
|
// HSV Conversion expects float inputs in the range of 0.00-1.00 for each channel
|
|
// Outputs are rgb in the range 0-255 for each channel
|
|
void from_hsv(float h, float s, float v, uint8_t &r, uint8_t &g, uint8_t &b) {
|
|
float i = floor(h * 6.0f);
|
|
float f = h * 6.0f - i;
|
|
v *= 255.0f;
|
|
uint8_t p = v * (1.0f - s);
|
|
uint8_t q = v * (1.0f - f * s);
|
|
uint8_t t = v * (1.0f - (1.0f - f) * s);
|
|
|
|
switch (int(i) % 6) {
|
|
case 0: r = v; g = t; b = p; break;
|
|
case 1: r = q; g = v; b = p; break;
|
|
case 2: r = p; g = v; b = t; break;
|
|
case 3: r = p; g = q; b = v; break;
|
|
case 4: r = t; g = p; b = v; break;
|
|
case 5: r = v; g = p; b = q; break;
|
|
}
|
|
}
|
|
|
|
PicoWireless wireless;
|
|
|
|
#define PICO_LED 25
|
|
|
|
int main() {
|
|
stdio_init_all();
|
|
//stdio_set_translate_crlf(&stdio_usb, false);
|
|
|
|
gpio_set_function(UART_TX_PIN, GPIO_FUNC_UART);
|
|
gpio_set_function(UART_RX_PIN, GPIO_FUNC_UART);
|
|
uart_init(UART_ID, BAUD_RATE);
|
|
|
|
gpio_put(PICO_LED, true);
|
|
|
|
printf("Initialised\n");
|
|
|
|
wireless.init();
|
|
|
|
sleep_ms(1000);
|
|
|
|
uint8_t r = 0, g = 0, b = 0;
|
|
uint8_t a = 0;
|
|
while(!wireless.is_pressed(PicoWireless::A)) {
|
|
from_hsv((float)a/256.0f, 1, 1, r, g, b);
|
|
|
|
wireless.set_led(0, 0, b);
|
|
sleep_ms(10);
|
|
a++;
|
|
}
|
|
wireless.set_led(16, 16, 0);
|
|
|
|
printf("firmware version Nina %s\n", wireless.get_fw_version());
|
|
uint8_t* mac = wireless.get_mac_address();
|
|
printf("mac address ");
|
|
for(uint i = 0; i < WL_MAC_ADDR_LENGTH; i++) {
|
|
printf("%d:", mac[i]);
|
|
}
|
|
printf("\n");
|
|
|
|
printf("starting connection\n");
|
|
|
|
wireless.wifi_set_passphrase(NETWORK, PASSWORD);
|
|
|
|
printf("waiting to establish connection status\n");
|
|
while(wireless.get_connection_status() != WL_CONNECTED) {
|
|
sleep_ms(1000);
|
|
printf("still waiting\n");
|
|
}
|
|
|
|
IPAddress ip;
|
|
wireless.get_ip_address(ip);
|
|
printf("ip address: %d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]);
|
|
|
|
IPAddress gateway;
|
|
wireless.get_gateway_ip(gateway);
|
|
printf("gateway address: %d.%d.%d.%d\n", gateway[0], gateway[1], gateway[2], gateway[3]);
|
|
|
|
printf("SSID = %s\n", wireless.get_current_ssid().c_str());
|
|
printf("RSSI = %ld\n", wireless.get_current_rssi());
|
|
|
|
uint8_t t = 0;
|
|
while (true) {
|
|
from_hsv((float)t/256.0f, 1, 1, r, g, b);
|
|
wireless.set_led(r, g, b);
|
|
sleep_ms(10);
|
|
t++;
|
|
if(t == 0) {
|
|
//printf("time: %d, temp: %f\n", wireless.get_time(), wireless.get_temperature());
|
|
std::uint32_t time_date_stamp = wireless.get_time();
|
|
std::time_t temp = time_date_stamp;
|
|
std::tm* t = std::gmtime(&temp);
|
|
std::stringstream ss; // or if you're going to print, just input directly into the output stream
|
|
ss << std::put_time(t, "%Y-%m-%d %I:%M:%S %p\n");
|
|
std::string output = ss.str();
|
|
printf(output.c_str());
|
|
}
|
|
}
|
|
return 0;
|
|
} |