domingo, 3 de julho de 2011

Pisca led com Arduino e Node.JS

Eu estava devendo a muito um post sobre Arduíno, já foram 3 Dojos e eu nao postei nada a respeito. Então vamos la...
O Arduino e um projeto de hardware livre, e tem muita coisa na internet (muita mesmo), e vários grupos como o ArduinoMS que promove encontros periódicos para troca de conhecimento, experiencia e um pouco de diversao tambem, afinal diversão e o carro chefe de quem "brinca" com Arduino.
Ja o Node.JS e um servidor de aplicacaoes em javascript orientado a eventos e assíncrono.

Esta aplicacao e bem simples, ascender e apagar um led por uma interface web, utilizando webSockets.

Presumindo que vc ja tenha instalado o Node.JS, vamos aos codigos.


Na interface....




var socket = new WebSocket("ws://localhost:8080/"); // abro a conecxao com o servidor

function acendeLuz(){
socket.send(1); // envio 1 para ascender
}
function apagaLuz(){
socket.send(0); // e 0 para apagar
}


e o html.....







no servidor....

var ws = require("./ws"); // blibioteca para trabalhar com webSocktes
var fs = require('fs'); // bliboteca para trabalhar com fileSystem

var server = ws.createServer(function(socket){
socket.on("connect", function(resource){
socket.write("conectou");
});

socket.on("data", function (data) {
console.log(data);
if(data == 1){acende();} // verifico a mensagem da interface
if(data == 0){apaga();}
});
});

function acende(){
// envia a string '1' para o arduino pela porta USB, dev/ttyUSB0 (no Ruwindows seria COM1 )
fs.open('/dev/ttyUSB0', 'a', 666, function( e, id ) {
fs.write( id, '1', null, null, null, null);
});
}

function apaga(){
fs.open('/dev/ttyUSB0', 'a', 666, function( e, id ) {
fs.write( id, '0', null, null, null, null);
});
}

server.listen(8080); // server na porta 8080...




e por fim no arduino.....

int incomingByte = 0; // for incoming serial data
int ledPin = 13;

void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT); // opens serial port, sets data rate to 9600 bps
}

void loop() {

// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
incomingByte = Serial.read();

// say what you got:
Serial.print("I received: ");
Serial.println(incomingByte);
if(incomingByte == 49){ // o 49 representa a string '1' enviada pelo servidor
digitalWrite(ledPin, HIGH);
}

if(incomingByte == 48){ // e o 48 representa o '0'
digitalWrite(ledPin, LOW);
}



}
}



tem ai um video da aplicacao funcionando




Mais.....

o codigo completo ta no github https://github.com/eltonluc/ArduinoNode

sobre o ultimo Dojo do ArduinoMS tem um post do @jeffmor no blog da Jera

Dica...

se vc tem um modem 3g da Huawei, evite usar ele e a placa do arduino espetada ao mesmo tempo no computador, pode ser fatal (para o modem)....

sexta-feira, 15 de outubro de 2010

Consumindo a API do Twitter com PHP e PEAR

Depois de varios exemplos de acesso a API do twitter com PHP e outras linguagens, busquei uma forma mais simples e cheguei a este result em 3 passos. Não vou explicar muito mas se alguem tiver duvidas só perguntar....


Primeiro - você tem que ter o PEAR instalado - http://pear.php.net/

Segundo - Inclua a classe RestConnection no seu projeto.

Terceiro - uma funcao exemplo para retornar uma busca por tag no twitter:

public function twitter() {
$pathParams = array();
$pathParams["{format}"] = "json"; //Formato da resposta
$queryParams = array("q" =>"carro","result_type"=>"recent"); // parametros da busca
$conn = new RestConnection("http://search.twitter.com/search.{format}", $pathParams, $queryParams, false);
$result = $conn->get();
$result = json_decode($result->getResponseBody(), true);
return $result['results'];
}

quinta-feira, 2 de setembro de 2010

CensorCheap

"CensorCheap é um projeto exclusivo, lançado em 24 de agosto de 2010, com o intuito de mapear a censura na internet pelo mundo.

 A idéia é realmente simples: Instalar um pequeno addon no seu firefox e, sempre que você tentar acessar um site que é censurado por seu ISP ou do seu país, esta informação será armasenada em um banco de dados de colaboração em tempo real. A CensorCheap irá compilar estes dados e construir um mapa da censura em todo o mundo."

 

Para saber mais sobre o projeto é só acessar o site oficial http://censorcheap.org/

Para colaborar é instalar o addon.


segunda-feira, 16 de agosto de 2010

Adobe Contribute CS5

O que é Adobe Contribute CS5?

 

Segundo a Adobe é:

O software Adobe® Contribute® CS5 é uma ferramenta poderosa de publicação na Web e gerenciamento de websites que integra criação, revisão e publicação em um editor de HTML WYSIWYG fácil de usar. Aumente a produtividade da publicação na Web em colaboração, simplificando, ao mesmo tempo, as tarefas de supervisão e aprovação.

 

Estou Fazendo este post pelo Adobe Contribute CS5, muito facil e simples mesmo.

 

 Os softweres da Adobe em geral são faceis e intuitiveis de usar. para mim o programa que você precisa de tutorial ou manual para usar não é um bom programa, mas isso é assunto pra outro post......

quinta-feira, 24 de junho de 2010

Busca CEP com google maps

Quando precisei de uma busca de cep para implementar em um cadastro encontrei diversas soluções, algumas pagas, mas nenhuma que atendia as minhas necessidades e claro, de fácil implementação.

O problema
No cadastro em questão era exigido o cep do cliente, o problema é que nem sempre o cliente sabe ou tem paciencia de buscar em outro site ou até mesmo em uma conta de luz por exemplo, esse tipo de dificuldade pode fazer com que o cliente dexista do cadastro.

Solucao Implementada

Segue uma solução simples usando a API http://code.google.com/intl/pt-BR/apis/maps/documentation/javascript/v2/basics.html do Google Maps e flamework javascript Mootools (você pode usar qualquer outro ou nenhum flamework se assim desejar)

HTML

<input type="text" name="consulta" id="consulta"/>
<input type="button" id="endResult" value="Busca Cep" />

<div id="resultado">
// div que recebe o resultado


</div>


Javascript

window.addEvent('domready', function(){
var buscaCep = function(){
var endereco = $('endereco').get('value'); //recebe o endereço de input HTML
var resultado = $('resultado'); // div onde sera apresentado os resultados
resultado.innerHTML = '';

//funcao request do Mootools, que passa via POST o endereço
// a ser pesquisado, aqui voce pode usar qualquer framework ou fazer a mao :(
// passa o parametro endereço via POST ao proxy PHP

var request = new Request.JSON({
url: "proxy.php",
onSuccess: function(locais){locais.results.each(function(item){
resultado.innerHTML += "
"+item.formatted_address+"
";
})}
}).post({'endereco': endereco});
}

//vinculando a funcao buscaCep ao evento OnClik do input
$('buscar').addEvent('click', buscaCep);
});


PHP


<?php
$adress = str_replace(" ","+", $_POST['endereco']);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://maps.google.com/maps/api/geocode/json?address=$adress&sensor=false");
curl_exec($ch);
curl_close($ch);
?>


para o exemplo eu peguei somente o "formatted_address" retornado pelo Google,
se você quiser formatar o resultado de outra forma esta é a resposta.

{
"status": "OK",
"results": [ {
"types": [ "street_address" ],
"formatted_address": "Av. Afonso Pena, 643 - Amambaí, Campo Grande - MS, 79005-000, Brazil", // usei esta opçao por que em alguns testes o resultado do google veio de formas diferentes em alguns casos.
"address_components": [ {
"long_name": "643",
"short_name": "643",
"types": [ "street_number" ]
}, {
"long_name": "Av. Afonso Pena",
"short_name": "Av. Afonso Pena",
"types": [ "route" ]
}, {
"long_name": "Amambaí",
"short_name": "Amambaí",
"types": [ "neighborhood", "political" ]
}, {
"long_name": "Campo Grande",
"short_name": "Campo Grande",
"types": [ "locality", "political" ]
}, {
"long_name": "Mato Grosso do Sul",
"short_name": "MS",
"types": [ "administrative_area_level_1", "political" ]
}, {
"long_name": "Brazil",
"short_name": "BR",
"types": [ "country", "political" ]
}, {
"long_name": "79005-000",
"short_name": "79005-000",
"types": [ "postal_code" ]
} ],
"geometry": {
"location": {
"lat": -20.4668048,
"lng": -54.6306711
},
"location_type": "RANGE_INTERPOLATED",
"viewport": {
"southwest": {
"lat": -20.4699625,
"lng": -54.6338140
},
"northeast": {
"lat": -20.4636672,
"lng": -54.6275188
}
},
"bounds": {
"southwest": {
"lat": -20.4668249,
"lng": -54.6306711
},
"northeast": {
"lat": -20.4668048,
"lng": -54.6306617
}
}
},
"partial_match": true
}, {
"types": [ "street_address" ],
"formatted_address": "Travessa Afonso Pena, 643 - Chácara Cachoeira, Campo Grande - MS, 79031-010, Brazil",
"address_components": [ {
"long_name": "643",
"short_name": "643",
"types": [ "street_number" ]
}, {
"long_name": "Travessa Afonso Pena",
"short_name": "Travessa Afonso Pena",
"types": [ "route" ]
}, {
"long_name": "Chácara Cachoeira",
"short_name": "Chácara Cachoeira",
"types": [ "neighborhood", "political" ]
}, {
"long_name": "Campo Grande",
"short_name": "Campo Grande",
"types": [ "locality", "political" ]
}, {
"long_name": "Mato Grosso do Sul",
"short_name": "MS",
"types": [ "administrative_area_level_1", "political" ]
}, {
"long_name": "Brazil",
"short_name": "BR",
"types": [ "country", "political" ]
}, {
"long_name": "79031-010",
"short_name": "79031-010",
"types": [ "postal_code" ]
} ],
"geometry": {
"location": {
"lat": -20.4612687,
"lng": -54.5633648
},
"location_type": "RANGE_INTERPOLATED",
"viewport": {
"southwest": {
"lat": -20.4644168,
"lng": -54.5665221
},
"northeast": {
"lat": -20.4581215,
"lng": -54.5602269
}
},
"bounds": {
"southwest": {
"lat": -20.4612696,
"lng": -54.5633842
},
"northeast": {
"lat": -20.4612687,
"lng": -54.5633648
}
}
},
"partial_match": true
} ]
}

sexta-feira, 21 de agosto de 2009

Video Aula Corel

Segue abaixo uma pequeno video onde faço uma planta baixa simples no Corel Draw, o objetivo do video não é ensinar a fazer planta baixa (por que nem eu sei) mas a usar algumas ferramentas simples do corel, otimo para quem para quem esta começando a trabalhar com corel.



Explicações do video:

1- onde você ve o zoom estou utilizando a rodinha do mouse, bem mais agil que as barras de rolagem.

1- em algum objetos ao invés de redesenhar eu uso um recurso mutio util do corel que é a duplicação do objeto, para fazer isso basta clicar sobre o objeto, arastar e depois, sem soltar o objeto clice com o botão esquerdo do mouse e pronto...

com um pouco de treino você pode chegar e estes resultados

i
mage via Wikipedia
The groundplan of the Abbey of St. Gall in Swi...