Sensor dotykowy na AVR, udało się bez Qtouch library
W końcu udało mi się zmusić AVR’ki do odczytu dotykowych przycisków. Biblioteka Atmel Qtouch kusiła, ale za nic nie byłem wstanie jej rozgryźć, a o rozmiarze nie wspomnę. Poczytałem trochę teorii, znalazłem jakieś przykłady i udało się. Pierwszym efektem jest ten moduł. Jak działa w praktyce:
Jak działa w teorii:
Płytki czujników dotyku działają jak kondensatory, ładowane przez rezystor. Mikroprocesor ładuje ten układ RC, mierząc czas. Ponieważ R jest stałe, czas ładowania jest zależny od pojemności. Pojemność zmienia się gdy przykładamy palec – staje się on dielektrykiem. Aby układ działał, należy zadbać o kilka elementów:
-Pojemność takiego „kondensatora” jest bardzo mała. Aby wydłużyć czas ładowania, stosuje się rezystory o dużej wartości (ja użyłem z braku innych 10M, lepsze byłyby około 2-5M om).
-Jeden sensor wymaga jednego pinu do odczytu, i jednego do ładowania, z tym że ten drugi może obsługiwać jednocześnie wiele czujników.
-Czasy są tu bardzo niewielkie; nie ma po co używać funkcji opóźniających; sam obrót pętli pomiarowej jest wystarczająco długi.
-Zmiany pojemności są także niewielkie, dlatego ważne jest aby ta zmiana po przyłożeniu palca była możliwie duża. Dlatego płytki mają powierzchnię w postaci siatki, aby zmniejszyć ich własną pojemność. Wbrew intuicji, im większe pola sensorów, tym niekoniecznie lepiej.
-W takich układach bardzo ważne jest zastosowanie jak najkrótszych ścieżek, aby zmniejszyć szkodliwe pojemności.
-Ważne jest też wylanie dookoła masy, która będzie ekranować zakłócenia i stanowić drugą elektrodę kondensatora.
-Jak wynika z powyższego opisu, pomiar nie polega na wykryciu pojemności ludzkiego ciała względem ziemi, ani niczego takiego. Palec człowieka jest dielektrykiem w polu elektrycznym kondensatora utworzonego z pola czujnika i pobliskiego pola masy.
Download:
Mądrość facebook’a

Linux – komendy
Pomoc:
Potrzebujesz dokładnego opisu polecenia? wpisz więc coś takiego: man
hasło. Spowoduje to wyświetlenie jeśli to możliwe, podręcznika do „hasła”.
Oznaczenia:
Polecenia zakończone jednym lub dwoma wykrzyknikami wymagają wysokich
uprawnień (nawet root’a), czasem nawet fizycznego dostępu do komputera.
Mogą więc być niepraktyczne przy zdalnej pracy za pomocą telnet lub ssh.
arch – wyświetla informacje na temat budowy komputera na którym pracujesz
awk – interpreter skryptowego języka programowania
bzip2 (*.bz2) – wysokowydajny kompresor
cal – ustawienia daty cat – przekierowuje strumień danych (np. sklejanie plików cat plik1 plik2 >plik12
cd – zmiana katalogu (bez parametru: przejście do katalogu użytkownika)
chown! – ustawianie właściciela pliku
chmod – ustawianie praw dostępu do pliku tzw. atrybuty
clear – czyści okno terminalu
cmp – porównuje pliki
copy – kopiuje pliki i katalogi
cp – kopiuje pliki
cut –
date – wyświetla lub zmienia datę
dd – konwertuje i kopiuje pliki
diff – porównuje zawartość plików, np. kodu źródłowego programu
du – oblicza zajętość na dysku
df – informuje o wolnych blokach na dysku
dircmp – porównuje katalogi
dmesg!! – podaje wszystkie komunikaty wyświetlane przy uruchamianiu systemu
echo –
egrep – odmiana polecenia grep
elm – program pocztowy
exit – wylogowanie z konsoli
fdisk!! – zarządzanie partycjami dysku
fetchmail! – zarządzanie zewnętrzną pocztą
file – testowanie pliku
find – wyszukiwanie pliku, katalogu
finger! – wyszukuje informacje o użytkowniku
fsconf!! – program do zmian ustawień systemu plików
fsck!! – naprawa systemu plików
ftp – prosty klient ftp
gcc – kompilator języka c
gnus – przeglądarka news
grep – wyszukiwanie linii spełniających wyrażenia
gzip (*.gz) – kompresor
gzip -9v * kompresja z maksymalną skutecznością poszczegolne pliki w katalogu, zastępując stare.
head – wyświetlanie początkowej części pliku
hello – wysylanie krótkiego tekstu na ekran adresata
host – podaje informacje o 'sieciowych’ danych dotyczączych komputera
hostname! – wyświetlanie lub zmiana nazwy komputera
hwconfig –
ipcalc – program umożliwiający operacje na adresach ip
irc – klient irc
joe – edytor tekstów
join – specjalne sklejanie plików
kernelversion – podaje informacje o wersji używanego kernela
kill – zabijanie procesów
pc – kopiuje plik
ps – zarządzanie procesami
less – przeglądarka tekstów, obustronne przewijanie
lftp – dobry klient ftp
lilo!! – boot manager (Linux Loader)
links – przeglądarka www, świetna obsługa tabel
ln! – tworzy dowiązania symboliczne tzw. linki
loadkeys – ładuje nową mapę klawiatury, np. polską
locate – odpowiednik polecenia where
logout – wylogowanie z konsoli
ls – wyświetla zawartość katalogu
lynx – przeglądarka www
make!! – kompilacja jądra
man – wyświetla podręcznik do programu podanego jako parametr
mesg – włącza i wyłącza reagowanie na wywoływania
mc – menedżer plików: midnight commander
mkdir – tworzy nowy katalog
mkfs!! – formatowanie systemu plików
more – przeglądarka tekstów, przewijanie w dół
mush – program pocztowy
mutt – rozbudowany program pocztowy i news
more – program do wyświetlania pliku na ekranie
mount!! – podłącza (montuje) systemy plików / napędy
mv – zmienia nazwe/przenosi plik
newgrp! – zmiana grupy aktualnego użytkownika
pack – prosty kompresor
passwd! – ustawianie hasła
paste – łączy wiersze pliku
pico – dość przyjazny edytor tekstowy
pine – wygodny program pocztowy
ping – wysyła pakiety testowe
procmail – narzędzie zarządzające pocztą
ps – wyświetla informacje o procesach
pwd – wyświetla ścieżkę bieżącego katalogu
quota – sprawdza/ustawia ograniczenie wielkości konta
rm – usuwa pliki
rmdir – usuwa pusty katalog
rpm!! – instaluje pakiety rpm
scp – kopiowanie zdalne plików szyfrowane
screen – otwiera nowe okna konsoli podczas pracy zdalnej
sed – edytor strumieniowy, umożliwia w zaawansowaną podmianę ciągu
setenv! – ustawia zmienna lokalna/globalna
setterm – ustawienia konsoli
sort – sortuje linie w pliku
split – tworzy jeden lub wiecej plikow z pliku wejsciowego
ssh – bezpieczny telnet tzw. secure shell
startx!! – uruchamia x-window
su!! – umożliwia prace z uprawnieniami roota
slrn – dobry klient news i pocztowy
tail – wyświetlanie końcowej części pliku
talk – wywołuje adresata na wspólną pogawędkę w czasie rzeczywistym
tar – archiwizer plików, poprawia skuteczność kompresji kompresora jak:
gzip, bzip2
np.1: tar -cz ./katalog/ >archiwum.tar.gz
np.2: tar –use-compress-program=bzip2 -c ./katalog/ >archiwum.tar.bz2
telnet – klient telnet
tin – klient poczty i news
top – wyswietla obciazenie procesora przez poszczegolne procesy
touch – uaktualnia datę pliku
tr –
umount!! – odłącza systemy plików / napędy
uniq –
unpack – rozpakowuje pliki spakowane poprzez 'pack’
unzip – rozpakowuje pliki .zip
np.: unzip -o -u plik.zip rozpakuje do bierzącego katalogu, bez potwierdzania nadpisze stare
uptime – mowi jak dlugo jest uruchomiony komputer
w – wyświetla „kto co robi”
wc – raportuje ilość linii, słów, znaków w wyspecyfikowanych plikach
wget – ściągacz plików, obsluga ftp, http
np.: wget -r -l1 -A gif,jpg http://programy.com/lista.html
where – podaje ścieżke poszukiwanego programu
whereis – inna nazwa polecenia where
which – podaje sciezke do szukanego programu
who – informuje o zalogowanych użytkownikach
whodo – co kto robi
write – wysyłanie jednorazowo wiele linii tekstu na ekran adresata
vi – skomplikowany edytor tekstowy, dostępny w każdej odmianie unixów
Mini stacja czujników online
Spakowany sketch Arduino: Pobierz sketch Mini stacja czujników online
Wymagana biblioteka (z odpowiednimi przeróbkami): EtherCard
Podłączenie:
- Moduł Ethernet pod złącze ICSP na Arduino (MOSI – SI, MISO – SO, SCK – SCK, GND-GND), pin CS do pinu 8, VCC do 3,3V
- DHT11 wyjście pod pin 12
- MQ7 wyjście analogowe pod pin A0
- Fotorezystor pomiędzy VCC a pin A1, który ściągamy do masy rezystorem 1KΩ
- Moduł Ethernet podpięty do routera
Aby odnaleźć IP, pod którym widnieje nasz układ proponuję zalogować się do panelu administracyjnego routera, u mnie była to zakładka/okienko „DHCP Client List”. Odczyt z czujnika tlenku węgla w normalnych warunkach wynosi poniżej 50 (<250mV). Potraktowanie go jakimikolwiek oparami powoduje szybką reakcję i skok napięcia powyżej 1V (przy bliskim rozpyleniu).
Mój projekt w konkursie – zapraszam do głosowania
Mój pierwszy robot Arduino
Kod źródłowy:
//ROBOT jeżdżący
//LCD I2C; 2x silniki, sonarr HC-SR04, tsop4836 RC5
//Piny:
/*
12: Silnik prawy kierunek;
11: Silnik prawy PWM;
4: Silnik lewy kierunek;
5: Silnik lewy PWM;
8: Sonar Echo;
9: Sonar trig;
10: TSOP4836;
SDA/SCL: LCD 16x2;
*/
#include <Wire.h> // Comes with Arduino IDE
#include <FastIO.h>
#include <I2CIO.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal_SR.h>
#include <LiquidCrystal_SR2W.h>
#include <LiquidCrystal_SR3W.h>
LiquidCrystal_I2C lcd(0x20, 4, 5, 6, 0, 1, 2, 3, 7, POSITIVE); // Set the LCD I2C address
const int echo = 8;
const int trig = 9;
long duration, cm;
void setup(){
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(8, INPUT);
pinMode(9, OUTPUT);
pinMode(10, INPUT);
analogWrite(6,0);
analogWrite(5,0);
digitalWrite(7,LOW);
digitalWrite(4,LOW);
digitalWrite(9,LOW);
lcd.begin(16,2); // initialize the lcd for 20 chars 4 lines]
lcd.setBacklightPin(7, NEGATIVE);
lcd.setBacklight(0);
// NOTE: Cursor Position: CHAR, LINE) start at 0
lcd.setCursor(0,0); //Start at character 4 on line 0
lcd.print("ROBOT! 4");
}
void loop(){
int wynik;
lcd.setCursor(0,1);
lcd.print("L: ");
lcd.setCursor(3,1);
wynik = pomiar();
if(wynik<3000){
lcd.print(wynik);
if(wynik<30)
{
digitalWrite(7,LOW);
digitalWrite(4,LOW);
analogWrite(6,255);
analogWrite(5,255);
}
if((wynik>30) && (wynik<80))
{
digitalWrite(7,LOW);
digitalWrite(4,LOW);
analogWrite(6,0);
analogWrite(5,0);
}
if(wynik>50)
{
digitalWrite(7,HIGH);
digitalWrite(4,HIGH);
analogWrite(6,0);
analogWrite(5,0);
}
}
delay(10);
}
int pomiar(void)
{
pinMode(trig, OUTPUT);
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
// Read the signal from the sensor: a HIGH pulse whose
// duration is the time (in microseconds) from the sending
// of the ping to the reception of its echo off of an object.
pinMode(echo, INPUT);
duration = pulseIn(echo, HIGH);
return microsecondsToCentimeters(duration);
}
int microsecondsToCentimeters(long microseconds)
{
// The speed of sound is 340 m/s or 29 microseconds per centimeter.
// The ping travels out and back, so to find the distance of the
// object we take half of the distance travelled.
return microseconds / 29 / 2;
}
Walidacja numerów PESEL, NIP, REGON w Javascript i PHP
Ulepszone funkcje z tego wpisu. Aktualnie funkcje sprawdzają także sumy kontrolne zawarte w tych numerach, na podstawie Wikipedii. Wystarczy przeanalizować kody
Odmiany funkcji w Javascript i PHP są w pełni zgodne, to znaczy że dadzą taką samą odpowiedź.
Aktualizacja 2017-05-02:
- Zamieniłem polskie nazwy zmiennych na angielskie;
- Funkcje od PESEL sprawdzają czy data jest poprawna, tj. miesiąc nie większy niż 12 i dzień miesiąca nie większy niż 31. To rozwiązuje problemy opisane w komentarzach. Dziękuję za zwrócenie uwagi i dziękuję Panu Krzysztofowi Grabania za propozycję rozwiązania problemu.
- Poprawione wcięcia itp.
- Dodane formularze, gdzie można sobie potestować jak działają funkcje w wersji JS. Wersje PHP: http://test.vt0.pl/v/
Oczywiście jeśli użytkownik będzie chciał, to i tak da radę wprowadzić nieprawdziwe dane, ale dzięki tej walidacji uchronimy się przed omyłkowym wpisaniem danych z błędami w formularzu.
1. Walidacja PESEL:
Kod PHP:
function validatepesel($pesel) {
$reg = '/^[0-9]{11}$/';
if(preg_match($reg, $pesel)==false)
return false;
else
{
$digits = str_split($pesel);
if ((intval(substr($pesel, 4, 2)) > 31)||(intval(substr($pesel, 2, 2)) > 12))
return false;
$checksum = (1*intval($digits[0]) + 3*intval($digits[1]) + 7*intval($digits[2]) + 9*intval($digits[3]) + 1*intval($digits[4]) + 3*intval($digits[5]) + 7*intval($digits[6]) + 9*intval($digits[7]) + 1*intval($digits[8]) + 3*intval($digits[9]))%10;
if($checksum == 0)
$checksum = 10;
$checksum = 10 - $checksum;
return (intval($digits[10]) == $checksum);
}
}
Kod Javascript:
function validatepesel(pesel) {
var reg = /^[0-9]{11}$/;
if(reg.test(pesel) == false)
return false;
else
{
var digits = (""+pesel).split("");
if ((parseInt(pesel.substring( 4, 6)) > 31)||(parseInt(pesel.substring( 2, 4)) > 12))
return false;
var checksum = (1*parseInt(digits[0]) + 3*parseInt(digits[1]) + 7*parseInt(digits[2]) + 9*parseInt(digits[3]) + 1*parseInt(digits[4]) + 3*parseInt(digits[5]) + 7*parseInt(digits[6]) + 9*parseInt(digits[7]) + 1*parseInt(digits[8]) + 3*parseInt(digits[9]))%10;
if(checksum==0) checksum = 10;
checksum = 10 - checksum;
return (parseInt(digits[10])==checksum);
}
}
Test:
2.Walidacja NIP
Kod PHP:
function validatenip($nip) {
$nipWithoutDashes = preg_replace("/-/","",$nip);
$reg = '/^[0-9]{10}$/';
if(preg_match($reg, $nipWithoutDashes)==false)
return false;
else
{
$digits = str_split($nipWithoutDashes);
$checksum = (6*intval($digits[0]) + 5*intval($digits[1]) + 7*intval($digits[2]) + 2*intval($digits[3]) + 3*intval($digits[4]) + 4*intval($digits[5]) + 5*intval($digits[6]) + 6*intval($digits[7]) + 7*intval($digits[8]))%11;
return (intval($digits[9]) == $checksum);
}
}
Kod Javascript:
function validatenip(nip) {
var nipWithoutDashes = nip.replace(/-/g,"");
var reg = /^[0-9]{10}$/;
if(reg.test(nipWithoutDashes) == false) {
return false;}
else
{
var digits = (""+nipWithoutDashes).split("");
var checksum = (6*parseInt(digits[0]) + 5*parseInt(digits[1]) + 7*parseInt(digits[2]) + 2*parseInt(digits[3]) + 3*parseInt(digits[4]) + 4*parseInt(digits[5]) + 5*parseInt(digits[6]) + 6*parseInt(digits[7]) + 7*parseInt(digits[8]))%11;
return (parseInt(digits[9])==checksum);
}
}
Test:
3. Walidacja REGON (9-cyfrowy):
Kod PHP:
function validateregon9($regon) {
$reg = '/^[0-9]{9}$/';
if(preg_match($reg, $regon)==false)
return false;
else
{
$digits = str_split($regon);
$checksum = (8*intval($digits[0]) + 9*intval($digits[1]) + 2*intval($digits[2]) + 3*intval($digits[3]) + 4*intval($digits[4]) + 5*intval($digits[5]) + 6*intval($digits[6]) + 7*intval($digits[7]))%11;
if($checksum == 10)
$checksum = 0;
return (intval($digits[8]) == $checksum);
}
}
Kod Javascript:
function validateregon9(regon) {
var reg = /^[0-9]{9}$/;
if(!reg.test(regon))
return false;
else
{
var digits = (""+regon).split("");
var checksum = (8*parseInt(digits[0]) + 9*parseInt(digits[1]) + 2*parseInt(digits[2]) + 3*parseInt(digits[3]) + 4*parseInt(digits[4]) + 5*parseInt(digits[5]) + 6*parseInt(digits[6]) + 7*parseInt(digits[7]))%11;
if(checksum == 10)
checksum = 0;
return (parseInt(digits[8])==checksum);
}
}
Test:
Mini odbiornik podczerwieni na ATTINY10
Malutki, zasilany z jednej bateryjki CR1220 odbiornik kodu RC5 dekodowany za pomocą AVR ATTiny10. Układ steruje dwiema diodami w trybie włącz/wyłącz. W celu uniknięcia niezamierzonych zmian stanów na wyjściach, odczytywany jest bit Toggle z ramki RC5.
Inspiracja: http://www.youtube.com/watch?v=ghtCYlqUlWQ
Wiedza: http://mikrokontrolery.blogspot.com/2011/03/IR-podczerwien-transmisja-standard-pilot-kurs.html
Wsparcie:http://www.elektroda.pl/rtvforum/viewtopic.php?t=2651455&highlight=
Kody źródłowe C Atmel Studio 6.1
Porównanie Atmega8 Atmega8A Atmega88 Atmega88PA
Aby nie kupować dinozaurów. Dane, które ciężko znaleźć w takiej formie.
Atmega8 | Atmega8A | Atmega88 | Atmega88PA |
|---|---|---|---|
4,5-5,5V | 2,7-5,5V | 2,7-5,5V | 1,8-5,5V |
0-16MHz | 0-16MHz | 0-10MHz; 0-20MHz@4,5-5,5V | 0-20MHz |
3xPWM | 3xPWM | 6xPWM | 6xPWM |
5 sleep modes | 5 sleep modes | 5 sleep modes | 6 sleep modes |
– | – | PCINT | PCINT |
– | – | – | Sensor temperatury |
Active: 3,6mA | Active: 3,6mA | Active: 250uA@1MHz | Active: 0,2mA(200uA) |
Idle: 1,0mA | Idle: 1,0mA | ||
PowerDown: 0,5uA | PowerDown: 0,5uA | PowerDown: 0,1uA | PowerDown: 0,1uA |
Qtouch support | Qtouch support | ||
– | – | UART in SPI mode | UART in SPI mode |
Vref 2,56V | 2,56V | 1,1V | 1,1V |
3,44zł TQFP32 | 3,98zł TQFP32 | 6,52zł TQFP32 | 5,40zł TQFP32 |
Proszę o pomoc w rozbudowie tabelki.
