Wikilivros
ptwikibooks
https://pt.wikibooks.org/wiki/Wikilivros:P%C3%A1gina_principal
MediaWiki 1.39.0-wmf.21
first-letter
Multimédia
Especial
Discussão
Utilizador
Utilizador Discussão
Wikilivros
Wikilivros Discussão
Ficheiro
Ficheiro Discussão
MediaWiki
MediaWiki Discussão
Predefinição
Predefinição Discussão
Ajuda
Ajuda Discussão
Categoria
Categoria Discussão
Tópico
Tópico discussão
Resumo
Resumo discussão
TimedText
TimedText talk
Módulo
Módulo Discussão
Gadget
Gadget talk
Gadget definition
Gadget definition talk
Topic
Arduino colaborativo/Tutorial Arduino - Lição 4
0
41627
479668
246265
2022-07-21T20:03:18Z
Nihonjoe
11117
([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Sketch3.jpg]] → [[File:Arduino test - Hello world! sketch3.jpg]] 2
wikitext
text/x-wiki
<big>Tutorial Arduino</big>
Arduino cresce e aprende a falar!
Ah, Arduino, eu me lembro quando você estava apenas engatinhando e piscando LEDs. Agora você está pronto para aprender a falar! Nesta lição vamos aprender como usar a biblioteca Serial para se comunicar a placa Arduino ao computador através da porta USB. Então vamos aprender a manipular números e dados.
Para esta lição que não vai usar o Shield, então simplesmente remova-o. O Shield não contém quaisquer programas ou dados, é apenas a nossa maneira de conectar os LEDs e resistores. Vamos usar o Shield novamente, mas por agora, podemos examinar os LEDs RX e TX na placa Arduino principal, que irá ajudá-lo com a depuração.
<big>O que é um Biblioteca?</big>
Bibliotecas são ótimos lugares, e ainda não ilegal nos Estados Unidos! Se você precisar de aprender a fazer alguma coisa, como dizem consertar uma motocicleta, você pode ir a sua biblioteca local e retirar um livro. Claro que você pode comprar o livro mas a biblioteca é agradável porque como um recurso que você pode obter o livro sempre que precisar, manter sua casa organizada.
Bibliotecas de software são muito semelhantes. Já estudamos o que é um procedimento, na lição 3: um procedimento é uma lista de coisas a fazer. Uma biblioteca é uma grande coleção de procedimentos, onde todos os procedimentos estão relacionados! Se você, por exemplo, quiser controlar um motor, você pode querer encontrar uma biblioteca de Controle Motor: uma coleção de procedimentos que já foram escritas para você que você pode usar sem ter que fazer o trabalho sujo de aprender as nuances de motores.
A biblioteca que usaremos é a Biblioteca Serial, que permite que o Arduino para envie dados de volta para o computador:
<gallery>
Ficheiro:biblioteca_serial.gif|Biblioteca Serial
</gallery>
<big>O que é Serial?</big>
Serial pode soar como um alimento saboroso, mas na verdade é muito diferente. A palavra série significa "um após o outro." Por exemplo, um serial killer que não para com um assassinato, mas apunhala muitas pessoas, uma após a outra. Transferência de dados em série é quando a transferência de dados acontece um bit por vez, um após o outro.
Informação é passada para trás e para frente entre o computador e Arduino configurando um pino em nível alto ou baixo. Assim como usamos essa técnica para virar um LED ligado e desligado, podemos também enviar dados. Um lado define o pino e outro lê. É um pouco como o código Morse, onde você pode usar dits e dahs para enviar mensagens por telegrama. Neste caso, em vez de um cabo longo, são apenas alguns metros.
<gallery></gallery>
(Agora, as pessoas que são totalmente NERDs provavelmente ficarão com raiva neste momento, porque eu estou simplificando as coisas. Bem, adivinhem, isto é tutorial sobre Arduino, e não um tutorial OSI Arquitetura física de rede.)
<big>Bits & Bytes</big>
O mundo não é mais gerido por armas, ou energia, ou dinheiro. É administrada por pequenos uns e zeros, pequenos pedaços de dados. São apenas elétrons.
Agora é um bom momento para rever como os dados são medidos. Por exemplo, podemos medir o peso com a "onça" e "libras" (ou gramas e quilogramas) e distâncias com "polegadas", "pés", e "milhas" (ou centímetros, metros e quilômetros). Informação tem seu próprio sistema de medidas:
Um único bit é zero ou um um.
Você pode agrupar pedaços juntos em 8 bits, que é 1 byte.
1024 bytes (8192 bits) é um Kilobyte (por vezes escrito KB).
1024 KB (1.048.576 bytes) é um Megabyte (MB)
1024 MB é de 1 Gigabyte (GB)
Uma coisa interessante a se notar é que enquanto 1000 gramas é um quilo, quase todos os sistemas de computador consideram 1024 bytes a ser um kilobyte. Isto é, um arquivo de 1.0 Kilobyte no seu computador é de 1024 bytes:
<gallery>
Ficheiro:propriedades.jpg|Propriedades
</gallery>
<big>Teste rápido!</big>
Se o disco rígido é de 200 Gigabytes, quantos bytes é isso? Use uma calculadora com muitos dígitos!
Realce o texto abaixo para a resposta
200 GB * 1024 = 204.800 MB
204.800 MB * 1024 = 209715200 KB
209715200 KB * 1024 = 214748364800 bytes!
Fabricantes de disco rígido são muito subservientes, você vai perceber que eles definem como sendo GB 1000 MB e 1 MB = 1000 KB, etc. Dado este fato, quantos bytes você pode realmente armazenar em seu disco de 200GB?
Realce o texto abaixo para a resposta
200 GB * 1000 = 200.000 MB
200.000 MB * 1000 = 200000000 KB
Quanto menos espaço de armazenamento você consegue graças à cara de marketing que surgiu com este truque?
Realce o texto abaixo para a resposta
Cerca de 4,6% a menos do que você esperaria
Um amigo familiar?
Nós realmente já usamos um pouco da capacidade de comunicação Serial ... é assim que enviaremos desenhos para o Arduino! Quando você Compilar / Verificar, o que você estará realmente fazendo é transformando o sketch em dados binários (uns e zeros). Quando você carregá-lo para o Arduino, os bits são empurrados para fora um de cada vez através do cabo USB para o Arduino, onde eles são armazenados no chip principal.
Na próxima vez que você carregar um sketch, olhe atentamente para os dois LEDs perto do conector USB, eles vão piscar quando dados estiverem sendo transmitidos. Um pisca quando o Arduino está recebendo dados (RX) e um pisca quando o Arduino está transmitindo dados (TX).
<gallery></gallery>
<big>Hora do nosso primeiro sketch</big>
Suficiente conversado entre nós, é hora de começar a falar Arduino. Nosso primeiro sketch vai ser o programa hello world!. Quando ele iniciar, ele vai dizer "Hello world!"
Crie um novo sketch... e salve-o como HelloWorld
<gallery>
Ficheiro:janela.jpg|Janela
</gallery>
Dentro do novo sketch, copie e cole o seguinte cógico, então salve-o:
/*
* Hello World!
*
* This is the Hello World! for Arduino.
* It shows how to send data to the computer
*/
void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Hello world!"); // prints hello with ending line break
}
void loop() // run over and over again
{
// do nothing!
}
OK, a primeira coisa a notar é que não há nada no procedimento loop!
Mesmo se não temos nada nos procedimentos de configuração ou loop, o Arduino os obriga a estar lá. Dessa forma, ele sabe que você realmente quer dizer para não fazer nada, ao contrário de esquecer de incluí-los!
A primeira linha de código no procedimento de instalação é esta:
Serial.begin(9600); // set up Serial library at 9600 bps
Nós definitivamente vemos que existe uma coisa Serial acontecendo, e parece que há uma chamada de procedimento também. Esta é uma chamada de procedimento da biblioteca. A biblioteca é chamada de Serial e dentro da biblioteca há um procedimento chamado begin.
Se não há nenhum nome da biblioteca, isso significa que o procedimento está no conjunto 'default' de procedimentos que usamos. Por exemplo, delay () é tão comum que os projetistas do software Arduino não se incomodaram em colocá-lo em uma biblioteca.
Portanto, havendo um procedimento misterioso chamado ''começar'', não é muito difícil descobrir o que ele poderia fazer. É o procedimento que recebe o material Serial pronto. Mas o que é o 9600?
O comentário diz 9600 bps, e só assim você sabe bps significa bits por segundo (vamos nos referir a isso como a taxa de transmissão).
Se você tiver conexão de banda larga, você pode lembrar de ter lido em algum lugar que ele tem, digamos 350 kbps taxa de download. Este é o quão rápido a conexão pode ler e escrever bits no fio. (Escusado será dizer que a sua conexão de banda larga pode transferir dados muito mais rápido que um Arduino!)
OK, então Serial.begin configura o Arduino com a taxa de transferência que queremos, neste caso 9600 bits por segundo.
Vamos passar para a próxima linha.
Serial.println ("Hello World!") / / Imprime hello com quebra de linha
Esta linha também usa a biblioteca Serial, desta vez ocorra a chamada de um procedimento chamado println, que é apenas uma abreviação de "linha de impressão". Note que a 6 ª letra em println é a letra L, não o número 1. Desta vez, a entrada é uma citação, a linha de texto gostaríamos de imprimir. Nós usamos dois "'s (entre aspas) para indicar o início e o fim de uma linha de texto.
<big>Teste rápido!</big>
Se o Arduino transfere dados a 9600 bits por segundo e que você está enviando 12 bytes de dados, quanto tempo leva para enviar mais esta informação?
12 bytes de dados é igual a 12 * 8 = 96 bits de dados. Se podemos transferir 9600 bits por segundo, então 96 bits leva 1/100th de um segundo!
Se o Arduino transfere dados a bits de 19.200 por segundo (19200) e você está enviando 12 bytes de dados, quanto tempo leva para enviar mais esta informação?
Isso é duas vezes mais rápido como antes, por isso vai demorar metade do tempo, cerca de 1/200th de um segundo.
Bom, agora compile o sketch e envie-o para o seu Arduino ....
E depois ... nada??
Parece que não há muita coisa acontecendo aqui. Um pouco decepcionante, já que me diverti muito com luzes coloridas piscando antes. O truque aqui é que enquanto você pode ver luzes piscando muito facilmente, ver dados serial requer um monitor, o qual como o seu monitor irá nos mostrar o que os dados estão sendo transferidos.
Sorte para nós, há um monitor serial embutido no software Arduino!
<gallery>
Ficheiro:Button_in_Arduino.jpg|Hello World!
</gallery>
Eu não tenho certeza do que significa o ícone, mas de qualquer maneira se você clicar nesse botão, você irá substituir a área de notificação preto Programa com um monitor de série.
Então ... clique nele!
Hello ... World?
O que acontece a seguir é, infelizmente, muito depende de qual tipo de Arduino você tem.
No caso muito comum de ter um Arduino Diecimila, o monitor de série resetará automaticamente o Arduino. O sketch será iniciado após alguns segundos.
Caso contrário, o Arduino não vai se reinicializar. De qualquer maneira, uma vez que você mudou para o monitor serial, pressione o botão reset. Se você tem um Arduino NG você vai ter que esperar 7 segundos para o sketch para começar.
<gallery>
Ficheiro:sketch1.jpg|Sketch 1
</gallery>
Voalá! Esse é o nosso sketch!
Se você sempre achar que está recebendo um monte de rabiscos em vez de texto adequado, certifique-se que você tem a taxa de transmissão correta selecionada no menu drop-down do Serial Monitor. Note que esta comunicação baud rate é indepedente do processo de upload, que é fixado em 19.200 bps.
Em seguida, tente pressionar o botão de reset algumas vezes para fazer mais Hello World! aparecerem. Se você tem um NG, isto pode ser um pouco chato, mas faça de qualquer maneira.
<gallery>
Ficheiro:sketch2.jpg|Sketch 2
</gallery>
Cada vez que você reiniciar o Arduino, ele executa o procedimento de configuração, e imprime Hello! novamente. Se você olhar atentamente para a Arduino, você também vai ver o pequeno LED TX piscar da mesma forma que imprime essa mensagem. Essa é a sua indicação de que os dados foram enviados.
<big>Enviar o quê?</big>
Quando você println que você está enviando os dados do Arduino para o computador. O botão Enviar (e a entrada de texto ao lado) são usados para enviar dados para o Arduino. Nós não vamos usá-lo nesta lição para não ser surpreendido que não faz nada quando você clicar nele!
10 PRINT HELLO
20 GOTO 10
Nosso próximo desenho será uma pequena modificação de um presente. Em vez de imprimir Hello World! apenas uma vez, nós gostaríamos que imprimí-lo mais e mais e mais uma vez.
<big>Teste rápido!</big>
Que simples modificação devemos executar para imprimir Hello World! mais e mais vezes?
Basta mover a declaração Serial.println ("Hello World"); do procedimento de instalação para o procedimento de loop.
Realizar esta modificação e, em seguida, compilar e fazer o upload do novo sketch hiper-Hello!. Em seguida, iniciar o Monitor Serial. Você verá Hello World! rolar rapidamente!
<gallery>
Ficheiro:Arduino test - Hello world! sketch3.jpg|Sketch 3
</gallery>
<big>Teste rápido!</big>
O que está acontecendo com o LED TX?
É iluminado, não pisca.
Tente agitar o Arduino em torno de um quarto escuro, o que você vê?
Há poucas trilhas leves pontilhadas.
O que está acontecendo aqui? Dica: Lembre-se a lição 2?
Os dados estão sendo transmitidos tão rápido que não podemos ver o LED TX piscando ... é o envio de dados muitas vezes por segundo!
Faça o Arduino se acalmar um pouco com a adição de um segundo de atraso para o sketch, para que ele só imprima Hello World! uma vez por segundo.
/*
* Hello World!
*
* This is the Hello World! for Arduino.
* It shows how to send data to the computer
*/
void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
}
void loop() // run over and over again
{
Serial.println("Hello world!"); // prints hello with ending line break
delay(1000);
}
Agora você deve gastar algum tempo brincando com println e fazê-lo exibir uma mensagem de sua escolha! Que tal acrescentar mais algumas declarações println, a fim de tornar a mensagem maior?
A matemática é difícil, vamos tentar a programação!
Brincamos de imprimir frases, mas acontece que também podemos imprimir números facilmente.
/*
* Math is fun!
*/
int a = 5;
int b = 10;
int c = 20;
void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Here is some math: ");
Serial.print("a = ");
Serial.println(a);
Serial.print("b = ");
Serial.println(b);
Serial.print("c = ");
Serial.println(c);
Serial.print("a + b = "); // add
Serial.println(a + b);
Serial.print("a * c = "); // multiply
Serial.println(a * c);
Serial.print("c / b = "); // divide
Serial.println(c / b);
Serial.print("b - c = "); // subtract
Serial.println(b - c);
}
void loop() // we need this to be here even though its empty
{
}
Tente usar esse sketch no seu Arduino.
<gallery>
Ficheiro:Sketch 4.jpg|Sketch 4
</gallery>
Note que estamos usando dois procedimentos aqui, o println original e agora também de impressão. O procedimento de impressão é como println, só que não imprime um "retorno de carro" no final, iniciando uma nova linha. Você pode experimentar mudar o de impressão para println e olhar o monitor de saída serial para verificar isso por si mesmo.
Segue o que está acontecendo no Arduino com este sketch. Por exemplo, vamos olhar para esta linha:
Serial.println (a);
Nós vimos que, se você usar uma linha de texto citado como entrada para procedimento println, ele irá mostrar o texto. Neste caso, você pode ver que se você usar uma variável em println, ele vai olhar o que essa variável contém e imprimirá isso!
Acontece que o Arduino é inteligente o suficiente para também fazer matemática quando perguntou:
Serial.println (a + b);
Neste caso, o Arduino olha o que a entrada é para println e encontra cálculo verdadeiro. Ele percebe que “a” é (5) e que “b” é (10) e, em seguida, soma-os (+) e depois usa esse como o valor para enviar para println.
Note que, por enquanto, só podemos calcular usando inúmeros inteiros. Isso significa que ainda não podemos imprimir números como 3,14 ou 1,5.
Eu poderia seguir falando sobre operadores a todos os seus tópicos muito importantes, mas muitas pessoas já escreveram bons tutoriais sobre este tema. Então vou enviá-los e leiam por lá!
Um C++ tutorial
Um tutorial sobre os operadores C
A lista de todos os operadores matemáticos
<big>Grupo pitagoreano</big>
<gallery>
Ficheiro:t_retangulo.png|Triângulo Retângulo
</gallery>
Vamos fazer nossa primeira máquina de cálculo simples, para calcular a hipotenusa. Se você recordar do ensino medio se tem um triângulo retângulo, a hipotenusa h pode ser calculada a partir do comprimento dos dois lados c1 e c2 (que chamaremos de a & b)
a2 + b 2 = h 2
h = √(a2 + b2)
/*
* Math is fun!
*/
#include "math.h"
int a = 3;
int b = 4;
int h;
void setup()
{
Serial.begin(9600);
Serial.println("Lets calculate a hypoteneuse");
Serial.print("a = ");
Serial.println(a);
Serial.print("b = ");
Serial.println(b);
h = sqrt( a*a + b*b );
Serial.print("h = ");
Serial.println(h);
}
void loop()
empty
{
}
A primeira coisa que é nova é esta linha logo no início do esboço:
#include "math.h" // incluir o cabeçalho Math Library
Que basicamente diz: "Nós gostaríamos de usar os procedimentos matemáticos, que estão em um programa que nos obriga a incluir o arquivo math.h onde o procedimento sqrt permanece". Apenas ignore por enquanto, não é importante.
A segunda coisa que é diferente aqui é que quando nós criamos a variável h nós não atribuimos a ele um valor.
int h;
Acontece que isso é totalmente OK, isso significa apenas que não sabemos ainda o que h irá armazenar, porque que vamos calculá-lo mais tarde. Já que não é atribuído a ele um valor o inicio, o Arduino apenas cria a caixa, o material dentro é tudo aquilo que estava sobrou na memória.
valores padrão
Se você não atribuir um valor a uma variável, pode ser qualquer valor. Certifique-se de não tentar utilizar a variável antes de atribuir um valor a ela!
Mais tarde no esboço, vamos atribuir-lhe o valor.
h = sqrt( a*a + b*b );
Nesta linhaelevamos a e b ao quadradp _e , em seguida, adicionamo-los juntos, então nós chamamos de procedimento sqrt () (que faz exatamente o que você possa pensar), para tirar a raiz quadrada. Então vamos atribuir isso à variável h.
Variável
=
Valor
;
Tudo o que era em h antes é perdido, substituído pelo novo valor.
Você pode colocar em procedimentos e funções tudo que você quiser chamando um procedimento sobre o valor de retorno de outro procedimento.
Prova rápida
Vamos dizer que você tem uma variável "foo", que contém um número. Você gostaria de encontrar a raiz quadrada da raiz quadrada deste número. Que linha de de código poderia imprimir este valor?
Serial.println( sqrt( sqrt(foo) );
Procure primeiramente a raiz quadrada de foo, depois tome a raiz quadrada deste último e, depois use esse valor como entrada para println
Agora é sua vez de criar uma calculadora.
Você vai criar uma calculadora da Lei de Ohm. A lei de Ohm diz que Voltagem = resistência * corrente. (Esta é uma lei muito útil que constitui a base da eletrônica, e vamos estudá-lo em profundidade mais tarde.) Começando com duas variáveis, i para o corrente e r para resistência, imprimir a quantidade de tensão que pode ser medido através do resistor.
Calculadora do tamanho da unidade (HD)
Vamos escrever um programa que vai fazer o cálculo do tamanho do disco rígido que fizemos antes. Vamos começar com o tamanho do disco rígido em GB, e imprimir em MB.
Vamos começar simples, basta imprimir o tamanho da unidade em GB.
int drive_gb = 5;
void setup()
{
Serial.begin(9600);
Serial.print("Your HD is ");
Serial.print(drive_gb);
Serial.println(" GB large.");
}
void loop()
empty
{
}
Copie e cole este esboço em software Arduino e nomea esboço DriveCalc Em seguida, compile e recarregue isso.
OK, vamos adicionar uma seção de código que irá imprimir o número de megabytes no disco rígido.
/*
* Drive size calculator!
*/
int drive_gb = 5;
int drive_mb;
void setup()
{
Serial.begin(9600);
Serial.print("Your HD is ");
Serial.print(drive_gb);
Serial.println(" GB large.");
drive_mb = 1024 * drive_gb;
Serial.print("It can store ");
Serial.print(drive_mb);
Serial.println(" Megabytes!");
}
void loop() // precisamos que isso seja aqui embora esteja vazio
{
Neste momento, se você compilar e carregá-lo você deve obter o que é correto! Agora tente um pouco diferentes números inteiros para o tamanho do HD, de 1 GB a 100 GB.
Você pode notar que se você colocar um tamanho de disco de 100GB, algo bastante estranho acontece:
Uma unidade de 100GB deve ter 102400MB nela não no número negativo. O que está acontecendo aqui?
Introdução a como digitar (parte 1)
O que está acontecendo é que temos um problema de excesso. Pense no seu odômetro do seu carro. O odômetro tem apenas 4 dígitos, que pode exibir 0 milhas a 9999 quilômetros percorridos. Se você viajar 10.000 milhas, o odômetro irá voltar para 0 novamente, e dali em diante ele irá mostrar um valor incorreto.
Mantendo isso em mente, lembre-se na lição 2, dissemos que quando nós definimos uma variável que também definimos a caixa da variável? A caixa é onde armazenamos os dados, neste caso a digitação é int. Acontece que uma digitação int pode armazenar apenas dois bytes.
Prova rapida!
Quantos bits estão em 2 bytes?
Realce o texto abaixo para a resposta
Há 8 bits em 1 byte para 2 bytes 16 bits
Para descobrir o quão grande um número que pode ser armazenado em uma caixa do tamanho de 2 bytes utilize uma calculadora e levar 2 à potência do número de bits (uma vez que cada bit pode armazenar dois valores, 0 ou 1). Em seguida, subtraímos 1, pois como no odômetro do carro, você não pode realmente mostrar o valor final, 10000. Então, neste caso o maior número é de 216 - 1 = 65535. Como o número que estamos tentando armazenar (102.400) é maior do que isso, vemos "rollover= volta".
OK, vamos corrigi-lo! Tudo o que precisamos fazer é mudar o tipo de variável de forma que ele possa armazenar mais de 2 bytes de dados.
/*
* Drive size calculator!
*/
int drive_gb = 100;
long drive_mb; // we changed the type from "int" to "long"
void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.print("Your HD is ");
Serial.print(drive_gb);
Serial.println(" GB large.");
drive_mb = 1024 * drive_gb;
Serial.print("It can store ");
Serial.print(drive_mb);
Serial.println(" Megabytes!");
}
void loop() // we need this to be here even though its empty
{
}
Compile e recarregar este esboço .... em seguida, execute o Monitor de série ....
Uh oh realmente não corrigimos o problema!
Como é frustrante, fizemos a coisa certa e ainda não funcionou. O problema que temos agora é que, embora as caixas sejam do tamanho certo, não estamos os manipulando bem.
drive_mb = 1024 * drive_gb;
Se você olhar para esta linha, o que está acontecendo aqui é que o Arduino procura o valor da variável para obter 100. Depois multiplicamos 100 por 1024 para obter 102.400 e colocar isso na caixa drive_mb. Exceto a maneira que o software do Arduino faz isso é que ele cria uma variável temporária do mesmo tamanho para armazenar o resultado do cálculo antes que ele o liga-lo na caixa drive_mb. Então, basicamente, ainda estamos tendo um transbordamento, só que agora isso está acontecendo como nós fazemos o cálculo.
Aqui está uma maneira de corrigir este erro insidioso:
/*
* Drive size calculator!
*/
int drive_gb = 100;
long drive_mb;
void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.print("Your HD is ");
Serial.print(drive_gb);
Serial.println(" GB large.");
drive_mb = drive_gb;
drive_mb = drive_mb * 1024;
Serial.print("It can store ");
Serial.print(drive_mb);
Serial.println(" Megabytes!");
}
void loop() // we need this to be here even though its empty
{
Agora, quando fazemos o cálculo, o resultado temporário é armazenado em uma caixa do mesmo tamanho para armazenar que drive_mb ( um grande) em vez de um int.
Compile e recarregue este esboço para experimentá-lo
Vai, agora está funcionando!
Introdução a como digitar (parte 1)
Acontece que eu não estava completamente honesto na seção anterior, quando eu descrevi todas diferentes digitações. Há ainda outro fato importante, a saber, e que tem a ver com o armazenamento de números negativos.
Sabemos que uma variável que é de um tamanho de 2 bytes (16 bits) pode armazenar 216 valores diferentes. Assumimos antes que estes valores eram de 0-65535 inclusive. Mas então como é que vamos armazenar números negativos? Acontece que existem dois tipos de variáveis, com e sem sinal.
Variáveis com sinal podem ter um valor positivo ou negativo, de modo que você pode armazenar números negativos.
Variáveis sem sinal só pode armazenar números positivos.
Por predefinição, as variáveis são com sinal.
Prova rapida!
Digamos que você tenha um programa que armazena a idade de um ser humano em anos (que até agora não é mais do que 122), Qual o tipo de dados que é bom para usar?
Realce o texto abaixo para a resposta
Você provavelmente vai querer usar um tipo byte
• Vamos dizer que você quer armazenar a idade de um ser humano em segundos, Qual é o tipo de dados apropriado agora?
Realce o texto abaixo para a resposta
110 anos = 3468960000 segundo. Você vai precisar armazenar isso em uma variável longo sem sinal.
Por quê ?
OK assim que você deve estar se perguntando: "Isso é borrice, por que se preocupar diferentes tamanhos de digitação. Deixa apenas ter todas as variáveis ser tão grande quanto possível e nunca teremos problemas transbordamento".
Bem, no seu computador, com gigabytes de memória (RAM), isso é uma coisa razoável a fazer. No entanto, o minúsculo computador no Arduino tem um total de 1 Kilobyte de memória. E alguns são usados para as coisas de segundo plano você não vê. Para pequenos esboços tenha certeza que você pode fazer tudo junto e ser feito com ele, mas se você tem um grande esboço, você vai executar fora da memória muito rápido e então você vai ter grandes problemas. Portanto, neste caso, cada byte conta!
O que é estranho sobre números com sinal é que se você chegar ao final do intervalo de valores positivos você vai transbordar em valores negativos.
Por exemplo, digamos que você tenha um int com sinal. Se você tem o valor de 32.767 nessa variável, e você adicionar 1 à variável, você realmente transborda para - 32768.
Este esboço vai testar este fato:
int test = 32767;
void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.print("Test value is: ");
Serial.println(test);
test = test + 1;
Serial.print("Now it is ");
Serial.println(test);
}
void loop() // we need this to be here even though its empty
{
}
Compile e faça o upload para executar o teste.
Prova rapida!
• Vamos dizer que temos uma variável que é do tipo byte, está com sinal por padrão. Ele começa com o valor 127 e nós adicionamos um para a variável, o que será o novo valor variável ser?
Realce o texto abaixo para a resposta
É uma variável com sinal por isso vai transbordar para -128
• Vamos dizer que agora é um tipo byte sem sinal, o que acontece agora?
Realce o texto abaixo para a resposta
Uma vez que é com sinal, pode armazenar muito mais dado, por isso vai ser capaz de conter o valor 128.
• Se tivermos um byte sem sinal e que começa com o valor 250 e somamos 10, o que vai ser o valor?
Realce o texto abaixo para a resposta
Embora a variável thie possa armazenar uma grande quantidade, não pode armazenar mais do que o número 255, portanto, transbordar e nós vamos acabar com o número 4.
Agora é sua vez!
Escreva alguns esboços que irão ajudar você a entender tamanhos variáveis, tente criar variáveis de diferentes tipos e com ou sem sinal, e somando e subtraindo.
Embora esta parte da lição pareça muito ser muito chata, e extremamente desprovida de luzes piscantes, entendendo este material agora irá salvar você de muitas dores de cabeça mais tarde, quando você tem transborda de dados e seu programa é tudo instável e você está realmente frustrado porque você não pode descobrir o porquê. (Confie em mim um!)
Resumindo, o projeto final!
Agora o tempo para você expandir a calculadora do tamanho da unidade. Começando com o esboço DriveCalc , modificá-lo para que ele também vá calcular quantos KB são armazenados no disco rígido. Testá-lo com dois HD de tamanho diferentes.
Uma vez que você conseguiu este trabalho, modificá-lo novamente para que ele também exiba o espaço que unidade detém realmente e ter um esboço que mostre quanto espaço de armazenamento está faltando' (em KB) também.
Aqui está uma possível solução:
/*
* Drive size calculator!
*/
int drive_gb = 100;
long drive_mb;
long drive_kb;
long real_drive_mb;
long real_drive_kb;
void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.print("Your HD is ");
Serial.print(drive_gb);
Serial.println(" GB large.");
drive_mb = drive_gb;
drive_mb = drive_mb * 1024;
drive_kb = drive_mb * 1024;
Serial.print("In theory, it can store ");
Serial.print(drive_mb);
Serial.print(" Megabytes, ");
Serial.print(drive_kb);
Serial.println(" Kilobytes.");
real_drive_mb = drive_gb;
real_drive_mb = real_drive_mb * 1000;
real_drive_kb = real_drive_mb * 1000;
Serial.print("But it really only stores ");
Serial.print(real_drive_mb);
Serial.print(" Megabytes, ");
Serial.print(real_drive_kb);
Serial.println(" Kilobytes.");
Serial.print("You are missing ");
Serial.print(drive_kb - real_drive_kb);
Serial.println(" Kilobytes!");
}
void loop() // run over and over again
{
}
Conclusão:
Bom trabalho, você passou por uma das aulas mais chatas. Nesta lição você aprendeu a impressão de texto e dados para o Monitor de série. Isto é essencial para a depuração de projetos futuros! Você também aprendeu sobre os tipos de dados e de armazenamento e como usar o Arduino para calcular as coisas.
{{AutoCat}}
o8d0wtbflr2fk1mxntps2apjy6dxtmb
479669
479668
2022-07-21T20:07:14Z
Nihonjoe
11117
([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Sketch2.jpg]] → [[File:Arduino test - Hello world! sketch 2.jpg]] 2
wikitext
text/x-wiki
<big>Tutorial Arduino</big>
Arduino cresce e aprende a falar!
Ah, Arduino, eu me lembro quando você estava apenas engatinhando e piscando LEDs. Agora você está pronto para aprender a falar! Nesta lição vamos aprender como usar a biblioteca Serial para se comunicar a placa Arduino ao computador através da porta USB. Então vamos aprender a manipular números e dados.
Para esta lição que não vai usar o Shield, então simplesmente remova-o. O Shield não contém quaisquer programas ou dados, é apenas a nossa maneira de conectar os LEDs e resistores. Vamos usar o Shield novamente, mas por agora, podemos examinar os LEDs RX e TX na placa Arduino principal, que irá ajudá-lo com a depuração.
<big>O que é um Biblioteca?</big>
Bibliotecas são ótimos lugares, e ainda não ilegal nos Estados Unidos! Se você precisar de aprender a fazer alguma coisa, como dizem consertar uma motocicleta, você pode ir a sua biblioteca local e retirar um livro. Claro que você pode comprar o livro mas a biblioteca é agradável porque como um recurso que você pode obter o livro sempre que precisar, manter sua casa organizada.
Bibliotecas de software são muito semelhantes. Já estudamos o que é um procedimento, na lição 3: um procedimento é uma lista de coisas a fazer. Uma biblioteca é uma grande coleção de procedimentos, onde todos os procedimentos estão relacionados! Se você, por exemplo, quiser controlar um motor, você pode querer encontrar uma biblioteca de Controle Motor: uma coleção de procedimentos que já foram escritas para você que você pode usar sem ter que fazer o trabalho sujo de aprender as nuances de motores.
A biblioteca que usaremos é a Biblioteca Serial, que permite que o Arduino para envie dados de volta para o computador:
<gallery>
Ficheiro:biblioteca_serial.gif|Biblioteca Serial
</gallery>
<big>O que é Serial?</big>
Serial pode soar como um alimento saboroso, mas na verdade é muito diferente. A palavra série significa "um após o outro." Por exemplo, um serial killer que não para com um assassinato, mas apunhala muitas pessoas, uma após a outra. Transferência de dados em série é quando a transferência de dados acontece um bit por vez, um após o outro.
Informação é passada para trás e para frente entre o computador e Arduino configurando um pino em nível alto ou baixo. Assim como usamos essa técnica para virar um LED ligado e desligado, podemos também enviar dados. Um lado define o pino e outro lê. É um pouco como o código Morse, onde você pode usar dits e dahs para enviar mensagens por telegrama. Neste caso, em vez de um cabo longo, são apenas alguns metros.
<gallery></gallery>
(Agora, as pessoas que são totalmente NERDs provavelmente ficarão com raiva neste momento, porque eu estou simplificando as coisas. Bem, adivinhem, isto é tutorial sobre Arduino, e não um tutorial OSI Arquitetura física de rede.)
<big>Bits & Bytes</big>
O mundo não é mais gerido por armas, ou energia, ou dinheiro. É administrada por pequenos uns e zeros, pequenos pedaços de dados. São apenas elétrons.
Agora é um bom momento para rever como os dados são medidos. Por exemplo, podemos medir o peso com a "onça" e "libras" (ou gramas e quilogramas) e distâncias com "polegadas", "pés", e "milhas" (ou centímetros, metros e quilômetros). Informação tem seu próprio sistema de medidas:
Um único bit é zero ou um um.
Você pode agrupar pedaços juntos em 8 bits, que é 1 byte.
1024 bytes (8192 bits) é um Kilobyte (por vezes escrito KB).
1024 KB (1.048.576 bytes) é um Megabyte (MB)
1024 MB é de 1 Gigabyte (GB)
Uma coisa interessante a se notar é que enquanto 1000 gramas é um quilo, quase todos os sistemas de computador consideram 1024 bytes a ser um kilobyte. Isto é, um arquivo de 1.0 Kilobyte no seu computador é de 1024 bytes:
<gallery>
Ficheiro:propriedades.jpg|Propriedades
</gallery>
<big>Teste rápido!</big>
Se o disco rígido é de 200 Gigabytes, quantos bytes é isso? Use uma calculadora com muitos dígitos!
Realce o texto abaixo para a resposta
200 GB * 1024 = 204.800 MB
204.800 MB * 1024 = 209715200 KB
209715200 KB * 1024 = 214748364800 bytes!
Fabricantes de disco rígido são muito subservientes, você vai perceber que eles definem como sendo GB 1000 MB e 1 MB = 1000 KB, etc. Dado este fato, quantos bytes você pode realmente armazenar em seu disco de 200GB?
Realce o texto abaixo para a resposta
200 GB * 1000 = 200.000 MB
200.000 MB * 1000 = 200000000 KB
Quanto menos espaço de armazenamento você consegue graças à cara de marketing que surgiu com este truque?
Realce o texto abaixo para a resposta
Cerca de 4,6% a menos do que você esperaria
Um amigo familiar?
Nós realmente já usamos um pouco da capacidade de comunicação Serial ... é assim que enviaremos desenhos para o Arduino! Quando você Compilar / Verificar, o que você estará realmente fazendo é transformando o sketch em dados binários (uns e zeros). Quando você carregá-lo para o Arduino, os bits são empurrados para fora um de cada vez através do cabo USB para o Arduino, onde eles são armazenados no chip principal.
Na próxima vez que você carregar um sketch, olhe atentamente para os dois LEDs perto do conector USB, eles vão piscar quando dados estiverem sendo transmitidos. Um pisca quando o Arduino está recebendo dados (RX) e um pisca quando o Arduino está transmitindo dados (TX).
<gallery></gallery>
<big>Hora do nosso primeiro sketch</big>
Suficiente conversado entre nós, é hora de começar a falar Arduino. Nosso primeiro sketch vai ser o programa hello world!. Quando ele iniciar, ele vai dizer "Hello world!"
Crie um novo sketch... e salve-o como HelloWorld
<gallery>
Ficheiro:janela.jpg|Janela
</gallery>
Dentro do novo sketch, copie e cole o seguinte cógico, então salve-o:
/*
* Hello World!
*
* This is the Hello World! for Arduino.
* It shows how to send data to the computer
*/
void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Hello world!"); // prints hello with ending line break
}
void loop() // run over and over again
{
// do nothing!
}
OK, a primeira coisa a notar é que não há nada no procedimento loop!
Mesmo se não temos nada nos procedimentos de configuração ou loop, o Arduino os obriga a estar lá. Dessa forma, ele sabe que você realmente quer dizer para não fazer nada, ao contrário de esquecer de incluí-los!
A primeira linha de código no procedimento de instalação é esta:
Serial.begin(9600); // set up Serial library at 9600 bps
Nós definitivamente vemos que existe uma coisa Serial acontecendo, e parece que há uma chamada de procedimento também. Esta é uma chamada de procedimento da biblioteca. A biblioteca é chamada de Serial e dentro da biblioteca há um procedimento chamado begin.
Se não há nenhum nome da biblioteca, isso significa que o procedimento está no conjunto 'default' de procedimentos que usamos. Por exemplo, delay () é tão comum que os projetistas do software Arduino não se incomodaram em colocá-lo em uma biblioteca.
Portanto, havendo um procedimento misterioso chamado ''começar'', não é muito difícil descobrir o que ele poderia fazer. É o procedimento que recebe o material Serial pronto. Mas o que é o 9600?
O comentário diz 9600 bps, e só assim você sabe bps significa bits por segundo (vamos nos referir a isso como a taxa de transmissão).
Se você tiver conexão de banda larga, você pode lembrar de ter lido em algum lugar que ele tem, digamos 350 kbps taxa de download. Este é o quão rápido a conexão pode ler e escrever bits no fio. (Escusado será dizer que a sua conexão de banda larga pode transferir dados muito mais rápido que um Arduino!)
OK, então Serial.begin configura o Arduino com a taxa de transferência que queremos, neste caso 9600 bits por segundo.
Vamos passar para a próxima linha.
Serial.println ("Hello World!") / / Imprime hello com quebra de linha
Esta linha também usa a biblioteca Serial, desta vez ocorra a chamada de um procedimento chamado println, que é apenas uma abreviação de "linha de impressão". Note que a 6 ª letra em println é a letra L, não o número 1. Desta vez, a entrada é uma citação, a linha de texto gostaríamos de imprimir. Nós usamos dois "'s (entre aspas) para indicar o início e o fim de uma linha de texto.
<big>Teste rápido!</big>
Se o Arduino transfere dados a 9600 bits por segundo e que você está enviando 12 bytes de dados, quanto tempo leva para enviar mais esta informação?
12 bytes de dados é igual a 12 * 8 = 96 bits de dados. Se podemos transferir 9600 bits por segundo, então 96 bits leva 1/100th de um segundo!
Se o Arduino transfere dados a bits de 19.200 por segundo (19200) e você está enviando 12 bytes de dados, quanto tempo leva para enviar mais esta informação?
Isso é duas vezes mais rápido como antes, por isso vai demorar metade do tempo, cerca de 1/200th de um segundo.
Bom, agora compile o sketch e envie-o para o seu Arduino ....
E depois ... nada??
Parece que não há muita coisa acontecendo aqui. Um pouco decepcionante, já que me diverti muito com luzes coloridas piscando antes. O truque aqui é que enquanto você pode ver luzes piscando muito facilmente, ver dados serial requer um monitor, o qual como o seu monitor irá nos mostrar o que os dados estão sendo transferidos.
Sorte para nós, há um monitor serial embutido no software Arduino!
<gallery>
Ficheiro:Button_in_Arduino.jpg|Hello World!
</gallery>
Eu não tenho certeza do que significa o ícone, mas de qualquer maneira se você clicar nesse botão, você irá substituir a área de notificação preto Programa com um monitor de série.
Então ... clique nele!
Hello ... World?
O que acontece a seguir é, infelizmente, muito depende de qual tipo de Arduino você tem.
No caso muito comum de ter um Arduino Diecimila, o monitor de série resetará automaticamente o Arduino. O sketch será iniciado após alguns segundos.
Caso contrário, o Arduino não vai se reinicializar. De qualquer maneira, uma vez que você mudou para o monitor serial, pressione o botão reset. Se você tem um Arduino NG você vai ter que esperar 7 segundos para o sketch para começar.
<gallery>
Ficheiro:sketch1.jpg|Sketch 1
</gallery>
Voalá! Esse é o nosso sketch!
Se você sempre achar que está recebendo um monte de rabiscos em vez de texto adequado, certifique-se que você tem a taxa de transmissão correta selecionada no menu drop-down do Serial Monitor. Note que esta comunicação baud rate é indepedente do processo de upload, que é fixado em 19.200 bps.
Em seguida, tente pressionar o botão de reset algumas vezes para fazer mais Hello World! aparecerem. Se você tem um NG, isto pode ser um pouco chato, mas faça de qualquer maneira.
<gallery>
Ficheiro:Arduino test - Hello world! sketch 2.jpg|Sketch 2
</gallery>
Cada vez que você reiniciar o Arduino, ele executa o procedimento de configuração, e imprime Hello! novamente. Se você olhar atentamente para a Arduino, você também vai ver o pequeno LED TX piscar da mesma forma que imprime essa mensagem. Essa é a sua indicação de que os dados foram enviados.
<big>Enviar o quê?</big>
Quando você println que você está enviando os dados do Arduino para o computador. O botão Enviar (e a entrada de texto ao lado) são usados para enviar dados para o Arduino. Nós não vamos usá-lo nesta lição para não ser surpreendido que não faz nada quando você clicar nele!
10 PRINT HELLO
20 GOTO 10
Nosso próximo desenho será uma pequena modificação de um presente. Em vez de imprimir Hello World! apenas uma vez, nós gostaríamos que imprimí-lo mais e mais e mais uma vez.
<big>Teste rápido!</big>
Que simples modificação devemos executar para imprimir Hello World! mais e mais vezes?
Basta mover a declaração Serial.println ("Hello World"); do procedimento de instalação para o procedimento de loop.
Realizar esta modificação e, em seguida, compilar e fazer o upload do novo sketch hiper-Hello!. Em seguida, iniciar o Monitor Serial. Você verá Hello World! rolar rapidamente!
<gallery>
Ficheiro:Arduino test - Hello world! sketch3.jpg|Sketch 3
</gallery>
<big>Teste rápido!</big>
O que está acontecendo com o LED TX?
É iluminado, não pisca.
Tente agitar o Arduino em torno de um quarto escuro, o que você vê?
Há poucas trilhas leves pontilhadas.
O que está acontecendo aqui? Dica: Lembre-se a lição 2?
Os dados estão sendo transmitidos tão rápido que não podemos ver o LED TX piscando ... é o envio de dados muitas vezes por segundo!
Faça o Arduino se acalmar um pouco com a adição de um segundo de atraso para o sketch, para que ele só imprima Hello World! uma vez por segundo.
/*
* Hello World!
*
* This is the Hello World! for Arduino.
* It shows how to send data to the computer
*/
void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
}
void loop() // run over and over again
{
Serial.println("Hello world!"); // prints hello with ending line break
delay(1000);
}
Agora você deve gastar algum tempo brincando com println e fazê-lo exibir uma mensagem de sua escolha! Que tal acrescentar mais algumas declarações println, a fim de tornar a mensagem maior?
A matemática é difícil, vamos tentar a programação!
Brincamos de imprimir frases, mas acontece que também podemos imprimir números facilmente.
/*
* Math is fun!
*/
int a = 5;
int b = 10;
int c = 20;
void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Here is some math: ");
Serial.print("a = ");
Serial.println(a);
Serial.print("b = ");
Serial.println(b);
Serial.print("c = ");
Serial.println(c);
Serial.print("a + b = "); // add
Serial.println(a + b);
Serial.print("a * c = "); // multiply
Serial.println(a * c);
Serial.print("c / b = "); // divide
Serial.println(c / b);
Serial.print("b - c = "); // subtract
Serial.println(b - c);
}
void loop() // we need this to be here even though its empty
{
}
Tente usar esse sketch no seu Arduino.
<gallery>
Ficheiro:Sketch 4.jpg|Sketch 4
</gallery>
Note que estamos usando dois procedimentos aqui, o println original e agora também de impressão. O procedimento de impressão é como println, só que não imprime um "retorno de carro" no final, iniciando uma nova linha. Você pode experimentar mudar o de impressão para println e olhar o monitor de saída serial para verificar isso por si mesmo.
Segue o que está acontecendo no Arduino com este sketch. Por exemplo, vamos olhar para esta linha:
Serial.println (a);
Nós vimos que, se você usar uma linha de texto citado como entrada para procedimento println, ele irá mostrar o texto. Neste caso, você pode ver que se você usar uma variável em println, ele vai olhar o que essa variável contém e imprimirá isso!
Acontece que o Arduino é inteligente o suficiente para também fazer matemática quando perguntou:
Serial.println (a + b);
Neste caso, o Arduino olha o que a entrada é para println e encontra cálculo verdadeiro. Ele percebe que “a” é (5) e que “b” é (10) e, em seguida, soma-os (+) e depois usa esse como o valor para enviar para println.
Note que, por enquanto, só podemos calcular usando inúmeros inteiros. Isso significa que ainda não podemos imprimir números como 3,14 ou 1,5.
Eu poderia seguir falando sobre operadores a todos os seus tópicos muito importantes, mas muitas pessoas já escreveram bons tutoriais sobre este tema. Então vou enviá-los e leiam por lá!
Um C++ tutorial
Um tutorial sobre os operadores C
A lista de todos os operadores matemáticos
<big>Grupo pitagoreano</big>
<gallery>
Ficheiro:t_retangulo.png|Triângulo Retângulo
</gallery>
Vamos fazer nossa primeira máquina de cálculo simples, para calcular a hipotenusa. Se você recordar do ensino medio se tem um triângulo retângulo, a hipotenusa h pode ser calculada a partir do comprimento dos dois lados c1 e c2 (que chamaremos de a & b)
a2 + b 2 = h 2
h = √(a2 + b2)
/*
* Math is fun!
*/
#include "math.h"
int a = 3;
int b = 4;
int h;
void setup()
{
Serial.begin(9600);
Serial.println("Lets calculate a hypoteneuse");
Serial.print("a = ");
Serial.println(a);
Serial.print("b = ");
Serial.println(b);
h = sqrt( a*a + b*b );
Serial.print("h = ");
Serial.println(h);
}
void loop()
empty
{
}
A primeira coisa que é nova é esta linha logo no início do esboço:
#include "math.h" // incluir o cabeçalho Math Library
Que basicamente diz: "Nós gostaríamos de usar os procedimentos matemáticos, que estão em um programa que nos obriga a incluir o arquivo math.h onde o procedimento sqrt permanece". Apenas ignore por enquanto, não é importante.
A segunda coisa que é diferente aqui é que quando nós criamos a variável h nós não atribuimos a ele um valor.
int h;
Acontece que isso é totalmente OK, isso significa apenas que não sabemos ainda o que h irá armazenar, porque que vamos calculá-lo mais tarde. Já que não é atribuído a ele um valor o inicio, o Arduino apenas cria a caixa, o material dentro é tudo aquilo que estava sobrou na memória.
valores padrão
Se você não atribuir um valor a uma variável, pode ser qualquer valor. Certifique-se de não tentar utilizar a variável antes de atribuir um valor a ela!
Mais tarde no esboço, vamos atribuir-lhe o valor.
h = sqrt( a*a + b*b );
Nesta linhaelevamos a e b ao quadradp _e , em seguida, adicionamo-los juntos, então nós chamamos de procedimento sqrt () (que faz exatamente o que você possa pensar), para tirar a raiz quadrada. Então vamos atribuir isso à variável h.
Variável
=
Valor
;
Tudo o que era em h antes é perdido, substituído pelo novo valor.
Você pode colocar em procedimentos e funções tudo que você quiser chamando um procedimento sobre o valor de retorno de outro procedimento.
Prova rápida
Vamos dizer que você tem uma variável "foo", que contém um número. Você gostaria de encontrar a raiz quadrada da raiz quadrada deste número. Que linha de de código poderia imprimir este valor?
Serial.println( sqrt( sqrt(foo) );
Procure primeiramente a raiz quadrada de foo, depois tome a raiz quadrada deste último e, depois use esse valor como entrada para println
Agora é sua vez de criar uma calculadora.
Você vai criar uma calculadora da Lei de Ohm. A lei de Ohm diz que Voltagem = resistência * corrente. (Esta é uma lei muito útil que constitui a base da eletrônica, e vamos estudá-lo em profundidade mais tarde.) Começando com duas variáveis, i para o corrente e r para resistência, imprimir a quantidade de tensão que pode ser medido através do resistor.
Calculadora do tamanho da unidade (HD)
Vamos escrever um programa que vai fazer o cálculo do tamanho do disco rígido que fizemos antes. Vamos começar com o tamanho do disco rígido em GB, e imprimir em MB.
Vamos começar simples, basta imprimir o tamanho da unidade em GB.
int drive_gb = 5;
void setup()
{
Serial.begin(9600);
Serial.print("Your HD is ");
Serial.print(drive_gb);
Serial.println(" GB large.");
}
void loop()
empty
{
}
Copie e cole este esboço em software Arduino e nomea esboço DriveCalc Em seguida, compile e recarregue isso.
OK, vamos adicionar uma seção de código que irá imprimir o número de megabytes no disco rígido.
/*
* Drive size calculator!
*/
int drive_gb = 5;
int drive_mb;
void setup()
{
Serial.begin(9600);
Serial.print("Your HD is ");
Serial.print(drive_gb);
Serial.println(" GB large.");
drive_mb = 1024 * drive_gb;
Serial.print("It can store ");
Serial.print(drive_mb);
Serial.println(" Megabytes!");
}
void loop() // precisamos que isso seja aqui embora esteja vazio
{
Neste momento, se você compilar e carregá-lo você deve obter o que é correto! Agora tente um pouco diferentes números inteiros para o tamanho do HD, de 1 GB a 100 GB.
Você pode notar que se você colocar um tamanho de disco de 100GB, algo bastante estranho acontece:
Uma unidade de 100GB deve ter 102400MB nela não no número negativo. O que está acontecendo aqui?
Introdução a como digitar (parte 1)
O que está acontecendo é que temos um problema de excesso. Pense no seu odômetro do seu carro. O odômetro tem apenas 4 dígitos, que pode exibir 0 milhas a 9999 quilômetros percorridos. Se você viajar 10.000 milhas, o odômetro irá voltar para 0 novamente, e dali em diante ele irá mostrar um valor incorreto.
Mantendo isso em mente, lembre-se na lição 2, dissemos que quando nós definimos uma variável que também definimos a caixa da variável? A caixa é onde armazenamos os dados, neste caso a digitação é int. Acontece que uma digitação int pode armazenar apenas dois bytes.
Prova rapida!
Quantos bits estão em 2 bytes?
Realce o texto abaixo para a resposta
Há 8 bits em 1 byte para 2 bytes 16 bits
Para descobrir o quão grande um número que pode ser armazenado em uma caixa do tamanho de 2 bytes utilize uma calculadora e levar 2 à potência do número de bits (uma vez que cada bit pode armazenar dois valores, 0 ou 1). Em seguida, subtraímos 1, pois como no odômetro do carro, você não pode realmente mostrar o valor final, 10000. Então, neste caso o maior número é de 216 - 1 = 65535. Como o número que estamos tentando armazenar (102.400) é maior do que isso, vemos "rollover= volta".
OK, vamos corrigi-lo! Tudo o que precisamos fazer é mudar o tipo de variável de forma que ele possa armazenar mais de 2 bytes de dados.
/*
* Drive size calculator!
*/
int drive_gb = 100;
long drive_mb; // we changed the type from "int" to "long"
void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.print("Your HD is ");
Serial.print(drive_gb);
Serial.println(" GB large.");
drive_mb = 1024 * drive_gb;
Serial.print("It can store ");
Serial.print(drive_mb);
Serial.println(" Megabytes!");
}
void loop() // we need this to be here even though its empty
{
}
Compile e recarregar este esboço .... em seguida, execute o Monitor de série ....
Uh oh realmente não corrigimos o problema!
Como é frustrante, fizemos a coisa certa e ainda não funcionou. O problema que temos agora é que, embora as caixas sejam do tamanho certo, não estamos os manipulando bem.
drive_mb = 1024 * drive_gb;
Se você olhar para esta linha, o que está acontecendo aqui é que o Arduino procura o valor da variável para obter 100. Depois multiplicamos 100 por 1024 para obter 102.400 e colocar isso na caixa drive_mb. Exceto a maneira que o software do Arduino faz isso é que ele cria uma variável temporária do mesmo tamanho para armazenar o resultado do cálculo antes que ele o liga-lo na caixa drive_mb. Então, basicamente, ainda estamos tendo um transbordamento, só que agora isso está acontecendo como nós fazemos o cálculo.
Aqui está uma maneira de corrigir este erro insidioso:
/*
* Drive size calculator!
*/
int drive_gb = 100;
long drive_mb;
void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.print("Your HD is ");
Serial.print(drive_gb);
Serial.println(" GB large.");
drive_mb = drive_gb;
drive_mb = drive_mb * 1024;
Serial.print("It can store ");
Serial.print(drive_mb);
Serial.println(" Megabytes!");
}
void loop() // we need this to be here even though its empty
{
Agora, quando fazemos o cálculo, o resultado temporário é armazenado em uma caixa do mesmo tamanho para armazenar que drive_mb ( um grande) em vez de um int.
Compile e recarregue este esboço para experimentá-lo
Vai, agora está funcionando!
Introdução a como digitar (parte 1)
Acontece que eu não estava completamente honesto na seção anterior, quando eu descrevi todas diferentes digitações. Há ainda outro fato importante, a saber, e que tem a ver com o armazenamento de números negativos.
Sabemos que uma variável que é de um tamanho de 2 bytes (16 bits) pode armazenar 216 valores diferentes. Assumimos antes que estes valores eram de 0-65535 inclusive. Mas então como é que vamos armazenar números negativos? Acontece que existem dois tipos de variáveis, com e sem sinal.
Variáveis com sinal podem ter um valor positivo ou negativo, de modo que você pode armazenar números negativos.
Variáveis sem sinal só pode armazenar números positivos.
Por predefinição, as variáveis são com sinal.
Prova rapida!
Digamos que você tenha um programa que armazena a idade de um ser humano em anos (que até agora não é mais do que 122), Qual o tipo de dados que é bom para usar?
Realce o texto abaixo para a resposta
Você provavelmente vai querer usar um tipo byte
• Vamos dizer que você quer armazenar a idade de um ser humano em segundos, Qual é o tipo de dados apropriado agora?
Realce o texto abaixo para a resposta
110 anos = 3468960000 segundo. Você vai precisar armazenar isso em uma variável longo sem sinal.
Por quê ?
OK assim que você deve estar se perguntando: "Isso é borrice, por que se preocupar diferentes tamanhos de digitação. Deixa apenas ter todas as variáveis ser tão grande quanto possível e nunca teremos problemas transbordamento".
Bem, no seu computador, com gigabytes de memória (RAM), isso é uma coisa razoável a fazer. No entanto, o minúsculo computador no Arduino tem um total de 1 Kilobyte de memória. E alguns são usados para as coisas de segundo plano você não vê. Para pequenos esboços tenha certeza que você pode fazer tudo junto e ser feito com ele, mas se você tem um grande esboço, você vai executar fora da memória muito rápido e então você vai ter grandes problemas. Portanto, neste caso, cada byte conta!
O que é estranho sobre números com sinal é que se você chegar ao final do intervalo de valores positivos você vai transbordar em valores negativos.
Por exemplo, digamos que você tenha um int com sinal. Se você tem o valor de 32.767 nessa variável, e você adicionar 1 à variável, você realmente transborda para - 32768.
Este esboço vai testar este fato:
int test = 32767;
void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.print("Test value is: ");
Serial.println(test);
test = test + 1;
Serial.print("Now it is ");
Serial.println(test);
}
void loop() // we need this to be here even though its empty
{
}
Compile e faça o upload para executar o teste.
Prova rapida!
• Vamos dizer que temos uma variável que é do tipo byte, está com sinal por padrão. Ele começa com o valor 127 e nós adicionamos um para a variável, o que será o novo valor variável ser?
Realce o texto abaixo para a resposta
É uma variável com sinal por isso vai transbordar para -128
• Vamos dizer que agora é um tipo byte sem sinal, o que acontece agora?
Realce o texto abaixo para a resposta
Uma vez que é com sinal, pode armazenar muito mais dado, por isso vai ser capaz de conter o valor 128.
• Se tivermos um byte sem sinal e que começa com o valor 250 e somamos 10, o que vai ser o valor?
Realce o texto abaixo para a resposta
Embora a variável thie possa armazenar uma grande quantidade, não pode armazenar mais do que o número 255, portanto, transbordar e nós vamos acabar com o número 4.
Agora é sua vez!
Escreva alguns esboços que irão ajudar você a entender tamanhos variáveis, tente criar variáveis de diferentes tipos e com ou sem sinal, e somando e subtraindo.
Embora esta parte da lição pareça muito ser muito chata, e extremamente desprovida de luzes piscantes, entendendo este material agora irá salvar você de muitas dores de cabeça mais tarde, quando você tem transborda de dados e seu programa é tudo instável e você está realmente frustrado porque você não pode descobrir o porquê. (Confie em mim um!)
Resumindo, o projeto final!
Agora o tempo para você expandir a calculadora do tamanho da unidade. Começando com o esboço DriveCalc , modificá-lo para que ele também vá calcular quantos KB são armazenados no disco rígido. Testá-lo com dois HD de tamanho diferentes.
Uma vez que você conseguiu este trabalho, modificá-lo novamente para que ele também exiba o espaço que unidade detém realmente e ter um esboço que mostre quanto espaço de armazenamento está faltando' (em KB) também.
Aqui está uma possível solução:
/*
* Drive size calculator!
*/
int drive_gb = 100;
long drive_mb;
long drive_kb;
long real_drive_mb;
long real_drive_kb;
void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.print("Your HD is ");
Serial.print(drive_gb);
Serial.println(" GB large.");
drive_mb = drive_gb;
drive_mb = drive_mb * 1024;
drive_kb = drive_mb * 1024;
Serial.print("In theory, it can store ");
Serial.print(drive_mb);
Serial.print(" Megabytes, ");
Serial.print(drive_kb);
Serial.println(" Kilobytes.");
real_drive_mb = drive_gb;
real_drive_mb = real_drive_mb * 1000;
real_drive_kb = real_drive_mb * 1000;
Serial.print("But it really only stores ");
Serial.print(real_drive_mb);
Serial.print(" Megabytes, ");
Serial.print(real_drive_kb);
Serial.println(" Kilobytes.");
Serial.print("You are missing ");
Serial.print(drive_kb - real_drive_kb);
Serial.println(" Kilobytes!");
}
void loop() // run over and over again
{
}
Conclusão:
Bom trabalho, você passou por uma das aulas mais chatas. Nesta lição você aprendeu a impressão de texto e dados para o Monitor de série. Isto é essencial para a depuração de projetos futuros! Você também aprendeu sobre os tipos de dados e de armazenamento e como usar o Arduino para calcular as coisas.
{{AutoCat}}
dbnl0ldbtuhrzxkwucds8owkvoy2pyn
479670
479669
2022-07-21T20:09:12Z
Nihonjoe
11117
([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Sketch1.jpg]] → [[File:Arduino test - Hello world! sketch 1.jpg]] 2
wikitext
text/x-wiki
<big>Tutorial Arduino</big>
Arduino cresce e aprende a falar!
Ah, Arduino, eu me lembro quando você estava apenas engatinhando e piscando LEDs. Agora você está pronto para aprender a falar! Nesta lição vamos aprender como usar a biblioteca Serial para se comunicar a placa Arduino ao computador através da porta USB. Então vamos aprender a manipular números e dados.
Para esta lição que não vai usar o Shield, então simplesmente remova-o. O Shield não contém quaisquer programas ou dados, é apenas a nossa maneira de conectar os LEDs e resistores. Vamos usar o Shield novamente, mas por agora, podemos examinar os LEDs RX e TX na placa Arduino principal, que irá ajudá-lo com a depuração.
<big>O que é um Biblioteca?</big>
Bibliotecas são ótimos lugares, e ainda não ilegal nos Estados Unidos! Se você precisar de aprender a fazer alguma coisa, como dizem consertar uma motocicleta, você pode ir a sua biblioteca local e retirar um livro. Claro que você pode comprar o livro mas a biblioteca é agradável porque como um recurso que você pode obter o livro sempre que precisar, manter sua casa organizada.
Bibliotecas de software são muito semelhantes. Já estudamos o que é um procedimento, na lição 3: um procedimento é uma lista de coisas a fazer. Uma biblioteca é uma grande coleção de procedimentos, onde todos os procedimentos estão relacionados! Se você, por exemplo, quiser controlar um motor, você pode querer encontrar uma biblioteca de Controle Motor: uma coleção de procedimentos que já foram escritas para você que você pode usar sem ter que fazer o trabalho sujo de aprender as nuances de motores.
A biblioteca que usaremos é a Biblioteca Serial, que permite que o Arduino para envie dados de volta para o computador:
<gallery>
Ficheiro:biblioteca_serial.gif|Biblioteca Serial
</gallery>
<big>O que é Serial?</big>
Serial pode soar como um alimento saboroso, mas na verdade é muito diferente. A palavra série significa "um após o outro." Por exemplo, um serial killer que não para com um assassinato, mas apunhala muitas pessoas, uma após a outra. Transferência de dados em série é quando a transferência de dados acontece um bit por vez, um após o outro.
Informação é passada para trás e para frente entre o computador e Arduino configurando um pino em nível alto ou baixo. Assim como usamos essa técnica para virar um LED ligado e desligado, podemos também enviar dados. Um lado define o pino e outro lê. É um pouco como o código Morse, onde você pode usar dits e dahs para enviar mensagens por telegrama. Neste caso, em vez de um cabo longo, são apenas alguns metros.
<gallery></gallery>
(Agora, as pessoas que são totalmente NERDs provavelmente ficarão com raiva neste momento, porque eu estou simplificando as coisas. Bem, adivinhem, isto é tutorial sobre Arduino, e não um tutorial OSI Arquitetura física de rede.)
<big>Bits & Bytes</big>
O mundo não é mais gerido por armas, ou energia, ou dinheiro. É administrada por pequenos uns e zeros, pequenos pedaços de dados. São apenas elétrons.
Agora é um bom momento para rever como os dados são medidos. Por exemplo, podemos medir o peso com a "onça" e "libras" (ou gramas e quilogramas) e distâncias com "polegadas", "pés", e "milhas" (ou centímetros, metros e quilômetros). Informação tem seu próprio sistema de medidas:
Um único bit é zero ou um um.
Você pode agrupar pedaços juntos em 8 bits, que é 1 byte.
1024 bytes (8192 bits) é um Kilobyte (por vezes escrito KB).
1024 KB (1.048.576 bytes) é um Megabyte (MB)
1024 MB é de 1 Gigabyte (GB)
Uma coisa interessante a se notar é que enquanto 1000 gramas é um quilo, quase todos os sistemas de computador consideram 1024 bytes a ser um kilobyte. Isto é, um arquivo de 1.0 Kilobyte no seu computador é de 1024 bytes:
<gallery>
Ficheiro:propriedades.jpg|Propriedades
</gallery>
<big>Teste rápido!</big>
Se o disco rígido é de 200 Gigabytes, quantos bytes é isso? Use uma calculadora com muitos dígitos!
Realce o texto abaixo para a resposta
200 GB * 1024 = 204.800 MB
204.800 MB * 1024 = 209715200 KB
209715200 KB * 1024 = 214748364800 bytes!
Fabricantes de disco rígido são muito subservientes, você vai perceber que eles definem como sendo GB 1000 MB e 1 MB = 1000 KB, etc. Dado este fato, quantos bytes você pode realmente armazenar em seu disco de 200GB?
Realce o texto abaixo para a resposta
200 GB * 1000 = 200.000 MB
200.000 MB * 1000 = 200000000 KB
Quanto menos espaço de armazenamento você consegue graças à cara de marketing que surgiu com este truque?
Realce o texto abaixo para a resposta
Cerca de 4,6% a menos do que você esperaria
Um amigo familiar?
Nós realmente já usamos um pouco da capacidade de comunicação Serial ... é assim que enviaremos desenhos para o Arduino! Quando você Compilar / Verificar, o que você estará realmente fazendo é transformando o sketch em dados binários (uns e zeros). Quando você carregá-lo para o Arduino, os bits são empurrados para fora um de cada vez através do cabo USB para o Arduino, onde eles são armazenados no chip principal.
Na próxima vez que você carregar um sketch, olhe atentamente para os dois LEDs perto do conector USB, eles vão piscar quando dados estiverem sendo transmitidos. Um pisca quando o Arduino está recebendo dados (RX) e um pisca quando o Arduino está transmitindo dados (TX).
<gallery></gallery>
<big>Hora do nosso primeiro sketch</big>
Suficiente conversado entre nós, é hora de começar a falar Arduino. Nosso primeiro sketch vai ser o programa hello world!. Quando ele iniciar, ele vai dizer "Hello world!"
Crie um novo sketch... e salve-o como HelloWorld
<gallery>
Ficheiro:janela.jpg|Janela
</gallery>
Dentro do novo sketch, copie e cole o seguinte cógico, então salve-o:
/*
* Hello World!
*
* This is the Hello World! for Arduino.
* It shows how to send data to the computer
*/
void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Hello world!"); // prints hello with ending line break
}
void loop() // run over and over again
{
// do nothing!
}
OK, a primeira coisa a notar é que não há nada no procedimento loop!
Mesmo se não temos nada nos procedimentos de configuração ou loop, o Arduino os obriga a estar lá. Dessa forma, ele sabe que você realmente quer dizer para não fazer nada, ao contrário de esquecer de incluí-los!
A primeira linha de código no procedimento de instalação é esta:
Serial.begin(9600); // set up Serial library at 9600 bps
Nós definitivamente vemos que existe uma coisa Serial acontecendo, e parece que há uma chamada de procedimento também. Esta é uma chamada de procedimento da biblioteca. A biblioteca é chamada de Serial e dentro da biblioteca há um procedimento chamado begin.
Se não há nenhum nome da biblioteca, isso significa que o procedimento está no conjunto 'default' de procedimentos que usamos. Por exemplo, delay () é tão comum que os projetistas do software Arduino não se incomodaram em colocá-lo em uma biblioteca.
Portanto, havendo um procedimento misterioso chamado ''começar'', não é muito difícil descobrir o que ele poderia fazer. É o procedimento que recebe o material Serial pronto. Mas o que é o 9600?
O comentário diz 9600 bps, e só assim você sabe bps significa bits por segundo (vamos nos referir a isso como a taxa de transmissão).
Se você tiver conexão de banda larga, você pode lembrar de ter lido em algum lugar que ele tem, digamos 350 kbps taxa de download. Este é o quão rápido a conexão pode ler e escrever bits no fio. (Escusado será dizer que a sua conexão de banda larga pode transferir dados muito mais rápido que um Arduino!)
OK, então Serial.begin configura o Arduino com a taxa de transferência que queremos, neste caso 9600 bits por segundo.
Vamos passar para a próxima linha.
Serial.println ("Hello World!") / / Imprime hello com quebra de linha
Esta linha também usa a biblioteca Serial, desta vez ocorra a chamada de um procedimento chamado println, que é apenas uma abreviação de "linha de impressão". Note que a 6 ª letra em println é a letra L, não o número 1. Desta vez, a entrada é uma citação, a linha de texto gostaríamos de imprimir. Nós usamos dois "'s (entre aspas) para indicar o início e o fim de uma linha de texto.
<big>Teste rápido!</big>
Se o Arduino transfere dados a 9600 bits por segundo e que você está enviando 12 bytes de dados, quanto tempo leva para enviar mais esta informação?
12 bytes de dados é igual a 12 * 8 = 96 bits de dados. Se podemos transferir 9600 bits por segundo, então 96 bits leva 1/100th de um segundo!
Se o Arduino transfere dados a bits de 19.200 por segundo (19200) e você está enviando 12 bytes de dados, quanto tempo leva para enviar mais esta informação?
Isso é duas vezes mais rápido como antes, por isso vai demorar metade do tempo, cerca de 1/200th de um segundo.
Bom, agora compile o sketch e envie-o para o seu Arduino ....
E depois ... nada??
Parece que não há muita coisa acontecendo aqui. Um pouco decepcionante, já que me diverti muito com luzes coloridas piscando antes. O truque aqui é que enquanto você pode ver luzes piscando muito facilmente, ver dados serial requer um monitor, o qual como o seu monitor irá nos mostrar o que os dados estão sendo transferidos.
Sorte para nós, há um monitor serial embutido no software Arduino!
<gallery>
Ficheiro:Button_in_Arduino.jpg|Hello World!
</gallery>
Eu não tenho certeza do que significa o ícone, mas de qualquer maneira se você clicar nesse botão, você irá substituir a área de notificação preto Programa com um monitor de série.
Então ... clique nele!
Hello ... World?
O que acontece a seguir é, infelizmente, muito depende de qual tipo de Arduino você tem.
No caso muito comum de ter um Arduino Diecimila, o monitor de série resetará automaticamente o Arduino. O sketch será iniciado após alguns segundos.
Caso contrário, o Arduino não vai se reinicializar. De qualquer maneira, uma vez que você mudou para o monitor serial, pressione o botão reset. Se você tem um Arduino NG você vai ter que esperar 7 segundos para o sketch para começar.
<gallery>
Ficheiro:Arduino test - Hello world! sketch 1.jpg|Sketch 1
</gallery>
Voalá! Esse é o nosso sketch!
Se você sempre achar que está recebendo um monte de rabiscos em vez de texto adequado, certifique-se que você tem a taxa de transmissão correta selecionada no menu drop-down do Serial Monitor. Note que esta comunicação baud rate é indepedente do processo de upload, que é fixado em 19.200 bps.
Em seguida, tente pressionar o botão de reset algumas vezes para fazer mais Hello World! aparecerem. Se você tem um NG, isto pode ser um pouco chato, mas faça de qualquer maneira.
<gallery>
Ficheiro:Arduino test - Hello world! sketch 2.jpg|Sketch 2
</gallery>
Cada vez que você reiniciar o Arduino, ele executa o procedimento de configuração, e imprime Hello! novamente. Se você olhar atentamente para a Arduino, você também vai ver o pequeno LED TX piscar da mesma forma que imprime essa mensagem. Essa é a sua indicação de que os dados foram enviados.
<big>Enviar o quê?</big>
Quando você println que você está enviando os dados do Arduino para o computador. O botão Enviar (e a entrada de texto ao lado) são usados para enviar dados para o Arduino. Nós não vamos usá-lo nesta lição para não ser surpreendido que não faz nada quando você clicar nele!
10 PRINT HELLO
20 GOTO 10
Nosso próximo desenho será uma pequena modificação de um presente. Em vez de imprimir Hello World! apenas uma vez, nós gostaríamos que imprimí-lo mais e mais e mais uma vez.
<big>Teste rápido!</big>
Que simples modificação devemos executar para imprimir Hello World! mais e mais vezes?
Basta mover a declaração Serial.println ("Hello World"); do procedimento de instalação para o procedimento de loop.
Realizar esta modificação e, em seguida, compilar e fazer o upload do novo sketch hiper-Hello!. Em seguida, iniciar o Monitor Serial. Você verá Hello World! rolar rapidamente!
<gallery>
Ficheiro:Arduino test - Hello world! sketch3.jpg|Sketch 3
</gallery>
<big>Teste rápido!</big>
O que está acontecendo com o LED TX?
É iluminado, não pisca.
Tente agitar o Arduino em torno de um quarto escuro, o que você vê?
Há poucas trilhas leves pontilhadas.
O que está acontecendo aqui? Dica: Lembre-se a lição 2?
Os dados estão sendo transmitidos tão rápido que não podemos ver o LED TX piscando ... é o envio de dados muitas vezes por segundo!
Faça o Arduino se acalmar um pouco com a adição de um segundo de atraso para o sketch, para que ele só imprima Hello World! uma vez por segundo.
/*
* Hello World!
*
* This is the Hello World! for Arduino.
* It shows how to send data to the computer
*/
void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
}
void loop() // run over and over again
{
Serial.println("Hello world!"); // prints hello with ending line break
delay(1000);
}
Agora você deve gastar algum tempo brincando com println e fazê-lo exibir uma mensagem de sua escolha! Que tal acrescentar mais algumas declarações println, a fim de tornar a mensagem maior?
A matemática é difícil, vamos tentar a programação!
Brincamos de imprimir frases, mas acontece que também podemos imprimir números facilmente.
/*
* Math is fun!
*/
int a = 5;
int b = 10;
int c = 20;
void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Here is some math: ");
Serial.print("a = ");
Serial.println(a);
Serial.print("b = ");
Serial.println(b);
Serial.print("c = ");
Serial.println(c);
Serial.print("a + b = "); // add
Serial.println(a + b);
Serial.print("a * c = "); // multiply
Serial.println(a * c);
Serial.print("c / b = "); // divide
Serial.println(c / b);
Serial.print("b - c = "); // subtract
Serial.println(b - c);
}
void loop() // we need this to be here even though its empty
{
}
Tente usar esse sketch no seu Arduino.
<gallery>
Ficheiro:Sketch 4.jpg|Sketch 4
</gallery>
Note que estamos usando dois procedimentos aqui, o println original e agora também de impressão. O procedimento de impressão é como println, só que não imprime um "retorno de carro" no final, iniciando uma nova linha. Você pode experimentar mudar o de impressão para println e olhar o monitor de saída serial para verificar isso por si mesmo.
Segue o que está acontecendo no Arduino com este sketch. Por exemplo, vamos olhar para esta linha:
Serial.println (a);
Nós vimos que, se você usar uma linha de texto citado como entrada para procedimento println, ele irá mostrar o texto. Neste caso, você pode ver que se você usar uma variável em println, ele vai olhar o que essa variável contém e imprimirá isso!
Acontece que o Arduino é inteligente o suficiente para também fazer matemática quando perguntou:
Serial.println (a + b);
Neste caso, o Arduino olha o que a entrada é para println e encontra cálculo verdadeiro. Ele percebe que “a” é (5) e que “b” é (10) e, em seguida, soma-os (+) e depois usa esse como o valor para enviar para println.
Note que, por enquanto, só podemos calcular usando inúmeros inteiros. Isso significa que ainda não podemos imprimir números como 3,14 ou 1,5.
Eu poderia seguir falando sobre operadores a todos os seus tópicos muito importantes, mas muitas pessoas já escreveram bons tutoriais sobre este tema. Então vou enviá-los e leiam por lá!
Um C++ tutorial
Um tutorial sobre os operadores C
A lista de todos os operadores matemáticos
<big>Grupo pitagoreano</big>
<gallery>
Ficheiro:t_retangulo.png|Triângulo Retângulo
</gallery>
Vamos fazer nossa primeira máquina de cálculo simples, para calcular a hipotenusa. Se você recordar do ensino medio se tem um triângulo retângulo, a hipotenusa h pode ser calculada a partir do comprimento dos dois lados c1 e c2 (que chamaremos de a & b)
a2 + b 2 = h 2
h = √(a2 + b2)
/*
* Math is fun!
*/
#include "math.h"
int a = 3;
int b = 4;
int h;
void setup()
{
Serial.begin(9600);
Serial.println("Lets calculate a hypoteneuse");
Serial.print("a = ");
Serial.println(a);
Serial.print("b = ");
Serial.println(b);
h = sqrt( a*a + b*b );
Serial.print("h = ");
Serial.println(h);
}
void loop()
empty
{
}
A primeira coisa que é nova é esta linha logo no início do esboço:
#include "math.h" // incluir o cabeçalho Math Library
Que basicamente diz: "Nós gostaríamos de usar os procedimentos matemáticos, que estão em um programa que nos obriga a incluir o arquivo math.h onde o procedimento sqrt permanece". Apenas ignore por enquanto, não é importante.
A segunda coisa que é diferente aqui é que quando nós criamos a variável h nós não atribuimos a ele um valor.
int h;
Acontece que isso é totalmente OK, isso significa apenas que não sabemos ainda o que h irá armazenar, porque que vamos calculá-lo mais tarde. Já que não é atribuído a ele um valor o inicio, o Arduino apenas cria a caixa, o material dentro é tudo aquilo que estava sobrou na memória.
valores padrão
Se você não atribuir um valor a uma variável, pode ser qualquer valor. Certifique-se de não tentar utilizar a variável antes de atribuir um valor a ela!
Mais tarde no esboço, vamos atribuir-lhe o valor.
h = sqrt( a*a + b*b );
Nesta linhaelevamos a e b ao quadradp _e , em seguida, adicionamo-los juntos, então nós chamamos de procedimento sqrt () (que faz exatamente o que você possa pensar), para tirar a raiz quadrada. Então vamos atribuir isso à variável h.
Variável
=
Valor
;
Tudo o que era em h antes é perdido, substituído pelo novo valor.
Você pode colocar em procedimentos e funções tudo que você quiser chamando um procedimento sobre o valor de retorno de outro procedimento.
Prova rápida
Vamos dizer que você tem uma variável "foo", que contém um número. Você gostaria de encontrar a raiz quadrada da raiz quadrada deste número. Que linha de de código poderia imprimir este valor?
Serial.println( sqrt( sqrt(foo) );
Procure primeiramente a raiz quadrada de foo, depois tome a raiz quadrada deste último e, depois use esse valor como entrada para println
Agora é sua vez de criar uma calculadora.
Você vai criar uma calculadora da Lei de Ohm. A lei de Ohm diz que Voltagem = resistência * corrente. (Esta é uma lei muito útil que constitui a base da eletrônica, e vamos estudá-lo em profundidade mais tarde.) Começando com duas variáveis, i para o corrente e r para resistência, imprimir a quantidade de tensão que pode ser medido através do resistor.
Calculadora do tamanho da unidade (HD)
Vamos escrever um programa que vai fazer o cálculo do tamanho do disco rígido que fizemos antes. Vamos começar com o tamanho do disco rígido em GB, e imprimir em MB.
Vamos começar simples, basta imprimir o tamanho da unidade em GB.
int drive_gb = 5;
void setup()
{
Serial.begin(9600);
Serial.print("Your HD is ");
Serial.print(drive_gb);
Serial.println(" GB large.");
}
void loop()
empty
{
}
Copie e cole este esboço em software Arduino e nomea esboço DriveCalc Em seguida, compile e recarregue isso.
OK, vamos adicionar uma seção de código que irá imprimir o número de megabytes no disco rígido.
/*
* Drive size calculator!
*/
int drive_gb = 5;
int drive_mb;
void setup()
{
Serial.begin(9600);
Serial.print("Your HD is ");
Serial.print(drive_gb);
Serial.println(" GB large.");
drive_mb = 1024 * drive_gb;
Serial.print("It can store ");
Serial.print(drive_mb);
Serial.println(" Megabytes!");
}
void loop() // precisamos que isso seja aqui embora esteja vazio
{
Neste momento, se você compilar e carregá-lo você deve obter o que é correto! Agora tente um pouco diferentes números inteiros para o tamanho do HD, de 1 GB a 100 GB.
Você pode notar que se você colocar um tamanho de disco de 100GB, algo bastante estranho acontece:
Uma unidade de 100GB deve ter 102400MB nela não no número negativo. O que está acontecendo aqui?
Introdução a como digitar (parte 1)
O que está acontecendo é que temos um problema de excesso. Pense no seu odômetro do seu carro. O odômetro tem apenas 4 dígitos, que pode exibir 0 milhas a 9999 quilômetros percorridos. Se você viajar 10.000 milhas, o odômetro irá voltar para 0 novamente, e dali em diante ele irá mostrar um valor incorreto.
Mantendo isso em mente, lembre-se na lição 2, dissemos que quando nós definimos uma variável que também definimos a caixa da variável? A caixa é onde armazenamos os dados, neste caso a digitação é int. Acontece que uma digitação int pode armazenar apenas dois bytes.
Prova rapida!
Quantos bits estão em 2 bytes?
Realce o texto abaixo para a resposta
Há 8 bits em 1 byte para 2 bytes 16 bits
Para descobrir o quão grande um número que pode ser armazenado em uma caixa do tamanho de 2 bytes utilize uma calculadora e levar 2 à potência do número de bits (uma vez que cada bit pode armazenar dois valores, 0 ou 1). Em seguida, subtraímos 1, pois como no odômetro do carro, você não pode realmente mostrar o valor final, 10000. Então, neste caso o maior número é de 216 - 1 = 65535. Como o número que estamos tentando armazenar (102.400) é maior do que isso, vemos "rollover= volta".
OK, vamos corrigi-lo! Tudo o que precisamos fazer é mudar o tipo de variável de forma que ele possa armazenar mais de 2 bytes de dados.
/*
* Drive size calculator!
*/
int drive_gb = 100;
long drive_mb; // we changed the type from "int" to "long"
void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.print("Your HD is ");
Serial.print(drive_gb);
Serial.println(" GB large.");
drive_mb = 1024 * drive_gb;
Serial.print("It can store ");
Serial.print(drive_mb);
Serial.println(" Megabytes!");
}
void loop() // we need this to be here even though its empty
{
}
Compile e recarregar este esboço .... em seguida, execute o Monitor de série ....
Uh oh realmente não corrigimos o problema!
Como é frustrante, fizemos a coisa certa e ainda não funcionou. O problema que temos agora é que, embora as caixas sejam do tamanho certo, não estamos os manipulando bem.
drive_mb = 1024 * drive_gb;
Se você olhar para esta linha, o que está acontecendo aqui é que o Arduino procura o valor da variável para obter 100. Depois multiplicamos 100 por 1024 para obter 102.400 e colocar isso na caixa drive_mb. Exceto a maneira que o software do Arduino faz isso é que ele cria uma variável temporária do mesmo tamanho para armazenar o resultado do cálculo antes que ele o liga-lo na caixa drive_mb. Então, basicamente, ainda estamos tendo um transbordamento, só que agora isso está acontecendo como nós fazemos o cálculo.
Aqui está uma maneira de corrigir este erro insidioso:
/*
* Drive size calculator!
*/
int drive_gb = 100;
long drive_mb;
void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.print("Your HD is ");
Serial.print(drive_gb);
Serial.println(" GB large.");
drive_mb = drive_gb;
drive_mb = drive_mb * 1024;
Serial.print("It can store ");
Serial.print(drive_mb);
Serial.println(" Megabytes!");
}
void loop() // we need this to be here even though its empty
{
Agora, quando fazemos o cálculo, o resultado temporário é armazenado em uma caixa do mesmo tamanho para armazenar que drive_mb ( um grande) em vez de um int.
Compile e recarregue este esboço para experimentá-lo
Vai, agora está funcionando!
Introdução a como digitar (parte 1)
Acontece que eu não estava completamente honesto na seção anterior, quando eu descrevi todas diferentes digitações. Há ainda outro fato importante, a saber, e que tem a ver com o armazenamento de números negativos.
Sabemos que uma variável que é de um tamanho de 2 bytes (16 bits) pode armazenar 216 valores diferentes. Assumimos antes que estes valores eram de 0-65535 inclusive. Mas então como é que vamos armazenar números negativos? Acontece que existem dois tipos de variáveis, com e sem sinal.
Variáveis com sinal podem ter um valor positivo ou negativo, de modo que você pode armazenar números negativos.
Variáveis sem sinal só pode armazenar números positivos.
Por predefinição, as variáveis são com sinal.
Prova rapida!
Digamos que você tenha um programa que armazena a idade de um ser humano em anos (que até agora não é mais do que 122), Qual o tipo de dados que é bom para usar?
Realce o texto abaixo para a resposta
Você provavelmente vai querer usar um tipo byte
• Vamos dizer que você quer armazenar a idade de um ser humano em segundos, Qual é o tipo de dados apropriado agora?
Realce o texto abaixo para a resposta
110 anos = 3468960000 segundo. Você vai precisar armazenar isso em uma variável longo sem sinal.
Por quê ?
OK assim que você deve estar se perguntando: "Isso é borrice, por que se preocupar diferentes tamanhos de digitação. Deixa apenas ter todas as variáveis ser tão grande quanto possível e nunca teremos problemas transbordamento".
Bem, no seu computador, com gigabytes de memória (RAM), isso é uma coisa razoável a fazer. No entanto, o minúsculo computador no Arduino tem um total de 1 Kilobyte de memória. E alguns são usados para as coisas de segundo plano você não vê. Para pequenos esboços tenha certeza que você pode fazer tudo junto e ser feito com ele, mas se você tem um grande esboço, você vai executar fora da memória muito rápido e então você vai ter grandes problemas. Portanto, neste caso, cada byte conta!
O que é estranho sobre números com sinal é que se você chegar ao final do intervalo de valores positivos você vai transbordar em valores negativos.
Por exemplo, digamos que você tenha um int com sinal. Se você tem o valor de 32.767 nessa variável, e você adicionar 1 à variável, você realmente transborda para - 32768.
Este esboço vai testar este fato:
int test = 32767;
void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.print("Test value is: ");
Serial.println(test);
test = test + 1;
Serial.print("Now it is ");
Serial.println(test);
}
void loop() // we need this to be here even though its empty
{
}
Compile e faça o upload para executar o teste.
Prova rapida!
• Vamos dizer que temos uma variável que é do tipo byte, está com sinal por padrão. Ele começa com o valor 127 e nós adicionamos um para a variável, o que será o novo valor variável ser?
Realce o texto abaixo para a resposta
É uma variável com sinal por isso vai transbordar para -128
• Vamos dizer que agora é um tipo byte sem sinal, o que acontece agora?
Realce o texto abaixo para a resposta
Uma vez que é com sinal, pode armazenar muito mais dado, por isso vai ser capaz de conter o valor 128.
• Se tivermos um byte sem sinal e que começa com o valor 250 e somamos 10, o que vai ser o valor?
Realce o texto abaixo para a resposta
Embora a variável thie possa armazenar uma grande quantidade, não pode armazenar mais do que o número 255, portanto, transbordar e nós vamos acabar com o número 4.
Agora é sua vez!
Escreva alguns esboços que irão ajudar você a entender tamanhos variáveis, tente criar variáveis de diferentes tipos e com ou sem sinal, e somando e subtraindo.
Embora esta parte da lição pareça muito ser muito chata, e extremamente desprovida de luzes piscantes, entendendo este material agora irá salvar você de muitas dores de cabeça mais tarde, quando você tem transborda de dados e seu programa é tudo instável e você está realmente frustrado porque você não pode descobrir o porquê. (Confie em mim um!)
Resumindo, o projeto final!
Agora o tempo para você expandir a calculadora do tamanho da unidade. Começando com o esboço DriveCalc , modificá-lo para que ele também vá calcular quantos KB são armazenados no disco rígido. Testá-lo com dois HD de tamanho diferentes.
Uma vez que você conseguiu este trabalho, modificá-lo novamente para que ele também exiba o espaço que unidade detém realmente e ter um esboço que mostre quanto espaço de armazenamento está faltando' (em KB) também.
Aqui está uma possível solução:
/*
* Drive size calculator!
*/
int drive_gb = 100;
long drive_mb;
long drive_kb;
long real_drive_mb;
long real_drive_kb;
void setup() // run once, when the sketch starts
{
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.print("Your HD is ");
Serial.print(drive_gb);
Serial.println(" GB large.");
drive_mb = drive_gb;
drive_mb = drive_mb * 1024;
drive_kb = drive_mb * 1024;
Serial.print("In theory, it can store ");
Serial.print(drive_mb);
Serial.print(" Megabytes, ");
Serial.print(drive_kb);
Serial.println(" Kilobytes.");
real_drive_mb = drive_gb;
real_drive_mb = real_drive_mb * 1000;
real_drive_kb = real_drive_mb * 1000;
Serial.print("But it really only stores ");
Serial.print(real_drive_mb);
Serial.print(" Megabytes, ");
Serial.print(real_drive_kb);
Serial.println(" Kilobytes.");
Serial.print("You are missing ");
Serial.print(drive_kb - real_drive_kb);
Serial.println(" Kilobytes!");
}
void loop() // run over and over again
{
}
Conclusão:
Bom trabalho, você passou por uma das aulas mais chatas. Nesta lição você aprendeu a impressão de texto e dados para o Monitor de série. Isto é essencial para a depuração de projetos futuros! Você também aprendeu sobre os tipos de dados e de armazenamento e como usar o Arduino para calcular as coisas.
{{AutoCat}}
azngg198430819bqmfy34rk6ifqtcv6
Sistemas operacionais/Estruturas dos sistemas operacionais
0
44756
479671
464875
2022-07-22T10:44:24Z
2001:818:D949:9000:B846:B6F1:7850:FFEC
/* Sistemas em camadas */
wikitext
text/x-wiki
Um sistema operacional fornecia o ambiente no qual os programas (''softwares'') são executados. Os SOs variam internamente entre si devido às diversas necessidades e restrições de softwares e hardwares.
==Estruturas de Sistemas Operacionais==
===Sistemas monolíticos===
[[Imagem:IBM PC 5150.jpg|thumb|250px|Um micro-computador PC XT rodando o MS DOS 5.0.]]
<p align="justify">Também conhecida como estrutura simples, esta é a estrutura dos primeiros SO’s. Consistida, basicamente, por um programa dividido em sub-rotinas, na estrutura monolítica é permitido a qualquer uma dessas sub-rotinas em qualquer parte do programa chamar outra(s) sub-rotina(s). A construção do programa final é dada com base nos módulos compilados separadamente, unidos através de um linker. A boa definição de parâmetros de ligação entre as diferentes rotinas existentes aumenta e muito o desempenho, porém o sistema pode parar devido a algum erro ocasionado por uma dessas rotinas.
A exemplo temos o próprio UNIX, o MS DOS, o FreeBSD, entre outros.
===Sistemas em camadas===
<p align = "justify">Devido ao crescimento das necessidades dos utilizadores e o aperfeiçoamento dos sistemas, foi-se necessário a modularização da organização do sw do SO. Na abordagem em camadas, o SO é particionado em níveis, onde o nível mais “baixo” é o hw, e o nível mais “alto” é a interface com o uutilizador. A principal vantagem dessa estrutura é justamente a modularização, facilitando sua alteração e depuração de cada camada, além de criar uma hierarquia de níveis de acesso que permite proteger as camadas mais internas. </p>
<p align = "justify">As camadas são selecionadas de tal modo que cada uma delas opere diretamente com a camada seguinte de nível mais baixo. Foi originado na Holanda por Edsger Dijkstra, que utilizou o algoritmo de busca de menor caminho, também de sua própria autoria, para percorrer dentre as várias camadas, as que atenderão as solicitações de “cima”, de maneira mais eficiente. </p>
<p align="justify">Uma desvantagem desta estrutura é o tempo de resposta ao usuário, pois numa requisição sua, uma camada irá se comunicar com a outra diretamente seguinte, e assim por diante, possibilitando a modificação de parâmetros a cada camada, necessidade de dados e ainda o acréscimo de overhead à chamada do sistema, levando, contudo, ao consumo maior de tempo do que nos SO’s não estruturados em camadas. </p>
<p align = "justify">Por sua vez, tal estrutura tem uma vantagem maior do ponto de vista tanto do projeto quanto da implementação, pois a impossibilidade de comunicação direta das aplicações de cima com as de baixo, leva a um controle maior do SO sobre o hw.</p>
A exemplo temos o Windows NT, o THE e o MULTICS.
===[[w:Máquina Virtual|Máquina Virtual]]===
Uma máquina virtual é uma cópia via software que busca simular uma máquina real. Uma máquina virtual (Virtual Machine – VM) pode ser definida como “uma duplicata eficiente e isolada de uma máquina real”. A IBM define uma máquina virtual como uma cópia isolada de um sistema físico, e esta cópia está totalmente protegida.
Ao invés de ser uma máquina real, isto é, um computador real, feito de hardware e executando um sistema operacional específico, uma máquina virtual é um computador fictício criado por um programa de simulação. Sua memória, processador e outros recursos são virtualizados. A virtualização é a interposição do software (máquina virtual) em várias camadas do sistema. É uma forma de dividir os recursos de um computador em múltiplos ambientes de execução.
===Sistemas Cliente-Servidor===
Sistemas Cliente-Servidor são modelos de computação que distinguem dois tipos básicos de equipamentos computacionais: servidores e clientes, sendo interligados entre si geralmente utilizando-se uma rede de computadores. Neste modelo, geralmente os servidores agregam as funções mais importantes do sistema, deixando aos clientes apenas o processamento de aplicações mais básicas.
As principais características deste tipo de sistema são:
*Elevar a camada onde são implementadas as funções normalmente efetuadas pelo sistema operacional;
*Reduzir as funções do sistema operacional;
*Tornar menor e de mais fácil a manutenção cada parte do sistema operacional.
==Utilização dos recursos de sistemas==
===Monoprogramação ou monotarefa===
Em computação, chama-se monotarefa um sistema operacional que permite a realização de apenas uma tarefa (''job'') de cada vez. O processador, memória e periféricos ficam dedicados a um único usuário, e cada tarefa para ser executada, deve aguardar o encerramento da tarefa atual. Nos sistemas monoprogramados, enquanto uma aplicação aguarda um evento, o processador pode permanecer ocioso, sem realizar qualquer tipo de processamento, a memória pode acabar sendo sub-utilizada quando o programa não a utiliza totalmente e os periféricos são dedicados a um único usuário. Desta forma, os sistemas monoprogramáveis acabam sendo por sua natureza de fácil implementação e com pouca preocupação com proteção.
===Multiprogramação ou multitarefa===
Multiprogramação ou Multitarefa é o nome dado à característica de alguns sistemas operacionais de rodar diversas aplicações simultâneas. Na realidade, na execução multitarefa, o tempo do processador é compartilhado entre as aplicações em execução, e a execução das tarefas passa rapidamente de uma para a outra, criando a ilusão de que as aplicações ocorrem de forma conjunta.
Isso é multiprogramação. As tarefas se alternam no consumo do processador de forma tão rápida que a impressão que temos é que estão acontecendo ao mesmo tempo. A esta ilusão, dá-se o nome de pseudo-paralelismo. Para executar ao mesmo tempo é preciso ter multiprocessamento.
==Tipos de Sistemas Operacionais==
===Sistemas Batch===
Os sistemas batch ou sistemas em lote foram os primeiros sistemas multiprogramáveis a serem implementados (primeira fase da computação), caracterizando-se por programas armazenados em disco ou fita, que uma vez iniciados, exigem pouca ou nenhuma interação do usuário, processando de forma sequencial e contínua até o fim do serviço (''job''), quando então é devolvido o resultado final do processamento. O tempo de execução da tarefa é conhecido como ''turnaround''.
===Sistemas multiprogramados===
Nos sistemas monoprogramados o que temos é a existência de um único processo sendo executado de cada vez na memória. Com a multiprogramação existem vários processos na memória aptos à executar e um em execução. Sem dúvida, o conceito de multiprogramação é um dos mais importantes nos sistemas operacionais modernos. Se existirem vários programas carregados na memória ao mesmo tempo, a CPU pode ser compartilhada entre eles, aumentando a eficiência da máquina e produzindo mais resultados em menos tempo. A ideia por detrás da multiprogramação é bastante simples. Quando um programa libera a CPU, seja para realizar alguma operação de E/S ou por outro motivo, ela fica parada. Enquanto espera que o programa volte para executar, a CPU não realiza nenhum trabalho útil. Para acabar com a ociosidade deste tempo vários programas são mantidos ao mesmo tempo na memória e o sistema operacional se encarrega de escolher um deles para executar. Assim, sempre que um programa é interrompido, um outro é escolhido para ser executado em seu lugar. Com isso, a CPU estará durante grande parte do tempo ocupada processando instruções de programas.
Os benefícios da multiprogramação são vários: aumento da utilização da CPU e da taxa de saída do sistema computacional, isto é, da quantidade de trabalho realizada dentro de um intervalo de tempo (throughput).
===Sistemas de Tempo Compartilhado (Time Sharing)===
São sistemas que compartilham o tempo de uso da CPU entre diversos programas.
Também conhecido como time-sharing, consegue executar diversas tarefas simultaneamente, pois existe a divisão do tempo do processador em pequenos intervalos, denominados fatia de tempo. Caso a tarefa não termine durante a fatia a ela determinada, há uma interrupção e ela volta para a fila de escalonamento, aguardando novamente sua vez.
Diferente do sistema batch, esse tipo de sistema operacional permite a interação do usuário. Dessa maneira, os terminais possuem teclado, vídeo e mouse.
===Sistemas de Tempo Real===
São sistemas no qual o tempo tem uma função essencial. Em geral, um ou mais dispositivos físicos externos ou computador geram estímulos, e o computador deve reagir apropriadamente a eles dentro de um dado intervalo de tempo.
===Sistemas multiprocessados===
Sistemas multiprocessados são sistemas construídos sobre máquinas computacionais que possuem mais de um processador para propósitos gerais. Entre suas vantagens estão:
*Maior produção (''throughput'')
*Reconfiguração
*Balanceamento
*Simetria
==Acoplamento-Sistemas multiprocessáveis==
Modo de comunicação entre os processadores e o grau de compartilhamento de memória e dos dispositivos de entrada/saída.
==Componentes do Sistema==
==Serviços de Sistemas Operacionais==
==Chamadas de Sistema==
Conhecidas como ''system calls'', são instruções que um programa utiliza para se comunicar com o Sistema Operacional e acessar seus serviços. O aplicativo "chama" o S.O., requisitando algo.
As chamadas de sistema podem ser agrupadas, ''grosso modo'', em seis categorias principais:<ref>Silberschat, Abraham; Gagne, Greg; B Galvin, Peter (2015). ''[https://www.worldcat.org/oclc/972290077 Fundamentos de Sistemas Operacionais]''. Rio de Janeiro, RJ: Grupo Gen - LTC. 68 páginas. <nowiki>ISBN 9788521630005</nowiki>. OCLC [https://www.worldcat.org/oclc/972290077 972290077].</ref><ref>Silberschatz, Abraham; B Galvin, Peter; Gagne, Greg (2018). ''[https://www.worldcat.org/oclc/1004849022 Operating System Concepts]'' 10th ed. Hoboken, NJ: Wiley. 67 páginas. <nowiki>ISBN 9781119320913</nowiki>. OCLC [https://www.worldcat.org/oclc/1004849022 1004849022].</ref>
# Controle de processos
#* encerrar, abortar
#* carregar, executar
#* criar processo, encerrar processo
#* obter/definir atributos do processo
#* esperar hora, esperar evento, sinalizar evento
#* alocar e liberar memória
# Gerenciamento de arquivos
#* criar arquivo, excluir arquivo
#* abrir, fechar
#* ler, gravar, reposicionar
#* obter/definir atributos do arquivo
# Gerenciamento de dispositivos
#* solicitar dispositivo, liberar dispositivo
#* ler, gravar, reposicionar
#* obter/definir atributos do dispositivo
#* conectar ou desconectar dispositivos logicamente
# Manutenção de informações
#* obter/definir a hora ou a data
#* obter/definir dados do sistema
#* obter/definir atributos do processo, arquivo ou dispositivo
# Comunicações
#* criar, excluir conexão de comunicações
#* enviar, receber mensagens
#* transferir informações de status
#* conectar ou desconectar dispositivos remotos
# Proteção
#* obter/definir permissões de arquivos
{{AutoCat}}
ltvi44he9a3t71r99xjecng3q0ocxsv