Índice:

Rastreador de tarefas TOYL: 3 etapas (com imagens)
Rastreador de tarefas TOYL: 3 etapas (com imagens)

Vídeo: Rastreador de tarefas TOYL: 3 etapas (com imagens)

Vídeo: Rastreador de tarefas TOYL: 3 etapas (com imagens)
Vídeo: Progress tracker with animated image in Excel - PART 3 - Excel Tips and Tricks 2024, Julho
Anonim
Image
Image
TOYL Task Tracker
TOYL Task Tracker
TOYL Task Tracker
TOYL Task Tracker

Não odeie quando você está planejando trabalhar ou pior, está no meio de uma sessão de trabalho e uma notificação chega em seu telefone - uma "verificação rápida" torna-se horas mais tarde. Além disso, você sabe quanto tempo você trabalha em certas tarefas em relação ao tempo que você alocou para o trabalho por semana?

Entre no TOYL Task Tracker. Ele permite que você desligue o telefone e se concentre no trabalho, ao mesmo tempo que permite configurar a quantidade de tempo que gostaria de trabalhar por semana - digamos 60 horas - e as tarefas que gostaria de realizar. Quando você se senta para uma sessão, tem uma ideia de quanto tempo resta para o seu trabalho geral. O Tracker tem dois modos: Cronômetro, onde você define quanto tempo gostaria de gastar por tarefa por semana, e Cronômetro, onde você pode simplesmente iniciar e parar o cronômetro depois de selecionar uma tarefa.

Suprimentos

O circuito

  • Adafruit Feather Huzzah
  • Adafruit FeatherWing
  • Pinos de cabeçalho masculinos
  • Pinos de cabeçalho femininos
  • Bateria 500mAh
  • 100K ohm resistores x2
  • Fita isolante
  • Fio flexivel
  • Decapantes de arame
  • Ventilador de solda

Invólucro

  • Folha de acrílico opaco 24”x 18”
  • Fita dupla face
  • Acesso a um cortador a laser
  • Software vetorial

Etapa 1: Solde o seu circuito

Solde o seu circuito
Solde o seu circuito
Solde o seu circuito
Solde o seu circuito
Solde o seu circuito
Solde o seu circuito

Solde os pinos de cabeçalho femininos no Feather Huzzah. Este tutorial é útil para a configuração do hardware Feather Huzzah. Em seguida, solde os pinos coletores machos ao FeatherWing. Soldá-los dessa maneira permite que você junte e separe a Asa de Pena da Huzzah de Pena quando necessário. Isso é especialmente útil quando você precisa adicionar resistores ao FeatherWing, que é o próximo passo. Conecte resistores de 100K ohm de cada pino 0 e 2, conectado a 3V.

Configure seu hardware Feather Huzzah

Configure seu hardware Feather Wing

Etapa 2: adicione seu código

Adicione o seu código
Adicione o seu código
Adicione o seu código
Adicione o seu código

Este código é uma adaptação do código da Lição 5 da Internet das Coisas. Se o tempo permitir, eu gostaria de substituir o serviço Preceptitaton por um que rastreie as tarefas que são adicionadas por meio do miniaplicativo ToDosit IFTTT. No momento, você teria que inserir manualmente um conjunto de tarefas e usar o Botão A para alternar entre elas. Além disso, eu gostaria de ter codificado o cronômetro para contar em minutos e parar ao passar para a próxima tarefa. Um grande obrigado a Becky Stern por criar o código base para o cronômetro e percorrer as tarefas. Se você estiver interessado em conectar o projeto à internet, recomendo fortemente que passe por este conjunto de aulas.

// Código de amostra Instructables Internet of Things Class // Circuito exibe dados da Internet // Os dados meteorológicos são coletados em um feed // Vários NeoPixels visualizam a condição do tempo // // Modificado por Becky Stern 2017 // com base no exemplo de assinatura Adafruit IO

// Adafruit investe tempo e recursos fornecendo este código-fonte aberto.

// Por favor, suporte Adafruit e hardware de código aberto comprando // produtos da Adafruit! // // Escrito por Todd Treece para Adafruit Industries // Copyright (c) 2016 Adafruit Industries // Licenciado sob a licença MIT. // // Todo o texto acima deve ser incluído em qualquer redistribuição.

/ ************************** Configuração Adafruit IO ********************** *********

/ visite io.adafruit.com se precisar criar uma conta, // ou se você precisar de sua chave Adafruit IO. #define IO_USERNAME "YourUsernameHere" #define IO_KEY "YourIOKeyHere"

/ ********************************* Configuração WIFI **************** *********************** /

#define WIFI_SSID "WifiName"

#define WIFI_PASS "WifiPassword"

#include "AdafruitIO_WiFi.h"

AdafruitIO_WiFi io (IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS);

/ ************************ Programa principal começa aqui ********************* ********** /

#include #include #include #include

#incluir

#include #include #include

#define OLED_RESET 3

Display Adafruit_SSD1306 (128, 32, & Wire, OLED_RESET);

// esta constante não mudará:

const int buttonPinA = 0; // os pinos que os botões de pressão estão anexados a const int buttonPinB = 16; // este já tem um resistor pullup, os outros dois precisam de um const int buttonPinC = 2;

// As variáveis mudarão:

int buttonAPushCounter = 0; // contador para o número de pressionamentos de botão int buttonAState = 0; // estado atual do botão int lastButtonAState = 0; // estado anterior do botão

// As variáveis mudarão:

int buttonBPushCounter = 0; // contador para o número de pressionamentos de botão int buttonBState = 0; // estado atual do botão int lastButtonBState = 0; // estado anterior do botão

// As variáveis mudarão:

int buttonCPushCounter = 0; // contador para o número de pressionamentos de botão int buttonCState = 0; // estado atual do botão int lastButtonCState = 0; // estado anterior do botão

String displayForecast = "desconhecido";

int timerVal = 0;

não assinado long lastStartTime = 0; bool timerEnabled = 0;

AdafruitIO_Feed * precipitação = io.feed ("precipitação"); // configurar o feed de 'precipitação'

// AdafruitIO_Feed * taskmanager = io.feed ("taskmanager"); // configurar o feed do 'gerenciador de tarefas'

void setup () {

pinMode (buttonPinA, INPUT); pinMode (buttonPinB, INPUT_PULLUP); pinMode (buttonPinC, INPUT);

// SSD1306_SWITCHCAPVCC = gerar tensão de exibição de 3,3 V internamente

display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // Endereço 0x3C para 128x32

// Mostra o conteúdo inicial do buffer de exibição na tela -

// a biblioteca inicializa isso com uma tela inicial Adafruit. display.display (); atraso (2000); // Pausa por 2 segundos

// Limpe o buffer.

display.clearDisplay ();

// inicia a conexão serial

Serial.begin (115200);

// conecte-se a io.adafruit.com

Serial.print ("Conectando ao Adafruit IO"); io.connect (); // configurar um gerenciador de mensagens para o feed de 'precipitação'. // a função handleMessage (definida abaixo) // será chamada sempre que uma mensagem for // recebida de adafruit io. precipitação-> onMessage (handleMessage);

// espera por uma conexão

while (io.status () <AIO_CONNECTED) {Serial.print ("."); atraso (500); }

// estamos conectados

Serial.println (); Serial.println (io.statusText ());

}

void loop () {

// io.run (); é necessário para todos os esboços.

// deve sempre estar presente no topo de sua // função de loop. ele mantém o cliente conectado a // io.adafruit.com e processa todos os dados recebidos. io.run ();

// leia o pino de entrada do botão:

buttonAState = digitalRead (buttonPinA); buttonBState = digitalRead (buttonPinB); buttonCState = digitalRead (buttonPinC);

// compare o buttonState com seu estado anterior

if (buttonAState! = lastButtonAState || buttonBState! = lastButtonBState || buttonCState! = lastButtonCState) {// se o estado mudou, incremente o contador if (buttonAState == LOW) {// se o estado atual for LOW então o botão foi pressionado buttonAPushCounter ++; Serial.print ("número de pressionamentos do botão A:"); Serial.println (buttonAPushCounter); } if (buttonBState == LOW) {// se o estado atual for LOW, o botão foi pressionado buttonBPushCounter ++; Serial.print ("número de pressionamentos do botão B:"); Serial.println (buttonBPushCounter); Serial.println ("Temporizador de inicialização"); timerEnabled = 1; lastStartTime = millis (); } if (buttonCState == LOW) {// se o estado atual for LOW, então o botão foi pressionado buttonCPushCounter ++; Serial.print ("número de pressionamentos do botão C:"); Serial.println (buttonCPushCounter); Serial.println ("Parando cronômetro"); timerEnabled = 0; }} if (timerEnabled == 1) {// incrementa o cronômetro somente quando for iniciado timerVal = (millis () - lastStartTime) / 1000; }

// posição de exibição 1 - previsão

// if (buttonAPushCounter% 3 == 0) {// display.clearDisplay (); // display.setTextSize (1); // display.setTextColor (WHITE); // display.setCursor (0, 0); // display.print ("Forecast:"); // display.println (displayForecast); // display.setCursor (0, 16); // display.println ("segunda linha"); // display.println ("conteúdo de exemplo"); // display.display (); // // delay (2000); //}

// exibe a posição 1 - Tarefa 1

if (buttonAPushCounter% 3 == 0) {display.setTextSize (1); display.setTextColor (WHITE); display.clearDisplay (); display.setCursor (0, 0); display.println ("Pesquisa - Entrevistas"); display.println (); display.print ("Timer:"); display.println (timerVal); display.display (); }

// exibe a posição 2 - Tarefa 2

if (buttonAPushCounter% 3 == 1) {display.clearDisplay (); display.setCursor (0, 0); display.println ("Fazendo Estúdio - Código"); display.println (); display.print ("Timer:"); display.println (timerVal); display.display (); }

// exibe a posição 3 - Tarefa 3

if (buttonAPushCounter% 3 == 2) {display.clearDisplay (); display.setCursor (0, 0); display.println ("DSV - Sketching"); display.println (); display.print ("Timer:"); display.println (timerVal); display.display (); }

// salve o estado atual como o último estado, // para a próxima vez por meio do loop lastButtonAState = buttonAState; lastButtonBState = buttonBState; lastButtonCState = buttonCState;

}

// esta função é chamada sempre que uma mensagem

// é recebido de Adafruit IO. ele foi anexado ao // feed na função setup () acima. void handleMessage (dados AdafruitIO_Data *) {

Previsão de string = data-> toString (); // armazena os dados meteorológicos de entrada em uma string

Serial.print ("recebido <-"); Serial.println (previsão); displayForecast = previsão; // as seguintes strings armazenam as várias palavras do relatório meteorológico IFTTT que descobri até agora String task1 = String ("Tarefa 1"); Chuva de cordas = Cordas ("Chuva"); Trem de corda = Corda ("Chuva leve"); Rainshower String = String ("Chuva"); String AMshowers = String ("AM Showers"); String rainandsnow = String ("Chuva e neve"); String neve = String ("Neve"); String snowshower = String ("Chuva de neve"); String turva = String ("Nublado"); String principalmentecloudy = String ("Muito Nublado"); String parcialmente nublado = String ("Parcialmente Nublado"); String clearsky = String ("Clear"); String justo = String ("Fair"); String sunny = String ("Sunny");

// Essas declarações if comparam a variável climática de entrada com as condições armazenadas e controlam os NeoPixels de acordo.

// se houver chuva na previsão if (forecast.equalsIgnoreCase (rain) || forecast.equalsIgnoreCase (lightrain) || forecast.equalsIgnoreCase (rainshower) || forecast.equalsIgnoreCase (AMshowers)) {Serial.println ("precipitação no previsão para hoje ");

}

// se houver neve na previsão if (forecast.equalsIgnoreCase (snow) || forecast.equalsIgnoreCase (rainandsnow) || forecast.equalsIgnoreCase (snowshower)) {Serial.println ("precipitação na previsão de hoje");

}

// se houver sol na previsão if (forecast.equalsIgnoreCase (clearsky) || forecast.equalsIgnoreCase (fair) || forecast.equalsIgnoreCase (sunny)) {Serial.println ("algum tipo de sol na previsão de hoje");

}

// se houver nuvens na previsão if (forecast.equalsIgnoreCase (nublado) || forecast.equalsIgnoreCase (principalmente nublado) || forecast.equalsIgnoreCase (parcialmente nublado)) {Serial.println ("céu nublado na previsão de hoje");

}

}

Etapa 3: criar o contêiner / shell

Crie o contêiner / shell
Crie o contêiner / shell
Crie o contêiner / shell
Crie o contêiner / shell
Crie o contêiner / shell
Crie o contêiner / shell
Crie o contêiner / shell
Crie o contêiner / shell

Para o shell, comece determinando o tamanho que você gostaria que sua moldura tivesse, ou você pode baixar meu arquivo. Depois de determinar o tamanho, você pode usar o MakerCase para criar o layout do arquivo vetorial.

Execute o arquivo no cortador a laser - isso deve levar cerca de 5 minutos. Depois disso, monte a concha.

Não levei em consideração a largura do material, o que torna meus botões difíceis de alcançar. Ainda preciso encontrar uma maneira de anexá-los. Eles também são muito pequenos, o que os torna difíceis de trabalhar.

Recomendado: